我有一个SQlite
表,我需要连续插入6个项目。并且有4000个这样的行。因此需要 4000 * 6 插入操作。为了减少它,我连接这六个项目并将它们作为一列插入,因此只有4000个操作。
但我开始知道字符串连接操作的复杂性是O(n^2)
,其中n是字符串的否。当我拿取物品时,我需要将琴弦分成6个部分。在contray上,任何数据库操作(如插入/查询)都具有M * O(log(n))
的复杂性,其中M是行的no,n是保持B-tree
结构的列。
那我现在该怎么办?我应该将6个项目连接在一起并插入它,然后将其拆分,还是应该将它们插入6列并在6次尝试中查询它们?哪个会节省时间?
答案 0 :(得分:2)
您的所有算法复杂度估算都是错误的。
实现字符串连接的最简单方法是O(n²)。 当SQLite构造一条记录时,它已经知道有多少字符串以及它们有多大,所以它永远不需要重新分配或移动部分字符串。构造一条记录所需的实际时间是O(n)。 (这会忽略字符串的大小,但如果我们假设所有字符串都具有相同的大小,则无关紧要。)
即使SQLite插入多个字符串,它也会在将记录插入表的B树之前构造记录。
在B树中的任意位置插入一条记录是O(log M);如果你只是附加一条记录,那就是O(1)。
请注意,你的数字n和M不会变得无限大但是有界限,所以你只有常数,所以你的所有时间实际上都是O(1)。 对你来说重要的是O符号隐藏的常数因素;找到它们的唯一方法是实际测量你的操作。
答案 1 :(得分:1)
我更喜欢SQLite
,因为您可以过滤查询并更轻松地管理数据。
如果必须修改或删除字符串连接的一列,该怎么办?
使用String
这将更复杂,因为您必须拆分数据,找到要修改/删除的数据,然后将其重新插入数据库。
我不明白为什么你必须“在6次尝试中查询它们”(你的意思是逐个查询吗?):通过一个简单的查询,你可以拥有一个包含全部的Cursor你需要的数据。