2

我有一个SQlite表,我需要在其中连续插入 6 个项目。并且有 4000 行这样的行。所以需要4000 * 6次插入操作。为了减少它,我连接这六个项目并将它们作为一列插入,因此只有 4000 个操作。

但我开始知道字符串连接操作的复杂性在于O(n^2)其中 n 是字符串的编号。当我获取项目时,我需要将字符串分成 6 个部分。相反,任何像插入/查询这样的数据库操作都具有复杂性,M * O(log(n))其中 M 是行数,n 是维护B-tree结构的列。

那我现在该怎么办?我应该将 6 个项目连接在一起并插入它然后拆分它,还是应该将它们插入 6 列并在 6 次尝试中查询它们?哪个会省时?

4

2 回答 2

2

你所有的算法复杂度估计都是错误的。

只有实现字符串连接的最简单的方法是 O(n²)。当 SQLite 构造一条记录时,它已经知道有多少个字符串以及它们有多大,因此它永远不需要重新分配或移动部分字符串。构建一条记录所需的实际时间是 O(n)。(这忽略了字符串的大小,但如果我们假设所有字符串都具有相同的大小,这无关紧要。)

即使 SQLite 插入多个字符串,它也会在将记录插入表的 B 树之前构造记录。

在 B-tree 的任意位置插入一条记录是 O(log M);如果你只是追加一条记录,那就是 O(1)。


Please note that your numbers n and M do not become infinitely large but are bounded, so you have only constants, so all your times are actually O(1). What matters for you are the constant factors hidden by the O notation; the only way to find them out is to actually measure your operations.

于 2013-08-03T14:50:26.877 回答
1

我更喜欢SQLite,因为您可以更轻松地过滤查询和管理数据。

如果您必须修改或删除字符串连接的一列怎么办?这样会更复杂,因为String您必须拆分数据,找到要修改/删除的数据,然后将其重新插入数据库。

我不明白为什么你必须“在 6 次尝试中查询它们”(你的意思是一个一个地查询吗?):通过一个简单的查询,你可以拥有一个包含你需要的所有数据的 Cursor。

于 2013-08-03T08:31:33.320 回答