【发布时间】:2021-05-24 02:38:16
【问题描述】:
前提
所以最近我一直在思考一个数据库常见的问题:尝试优化数据的插入、搜索、删除和更新。 通常我看到现在大多数数据库都使用 BTree 或 B+Tree 来解决这样的问题,但它们通常用于将数据存储在磁盘内,我想处理内存中的数据,所以我考虑使用AVLTree(差异应该很小,因为 BTrees 的目的与 AVLTree 相同,但实现不同,效果也不同)。 在继续这背后的推理之前,我想更深入地了解我想要解决的问题。 因此,在现代数据库中,存储在带有 PRIMARY KEY 的表中的数据往往是 INDEXED (我在索引方面不是很有经验,所以我要说的是我对这个问题的基本推理),通常 PRIMARY KEY 是一个越来越多的数字(即使现在是一种不好的做法)从 1 开始。 通常使用 AVLTree 应该足以解决问题,因为这棵特定的树总是平衡的并提供 O(log2(n)) 操作,但我想在更深层次上达到这一点,试图对其进行更多的优化。
理论
因此,正如问题的标题所示,我正在尝试优化 AVLTree,将其与 Btree 合并。 基本上,这棵新树的每个节点都可以说是一个由十个元素组成的数组,每个节点也是树中相应的高度,并且数组的每个元素都是按升序排列的。
插入
插入最初填充根节点的数组,当根节点已满时,它会生成左右子节点,其中也包含 10 个元素的数组。 每当添加新节点时,树都会根据左右子节点向量的第一个键使用它们的高度自动重新平衡节点(请注意,这实际上是 AVLTree 的行为方式,但 AVLTree 只有 2 个节点,没有向量而已值)。
搜索
搜索元素是这样工作的:从根开始,我们将搜索的值K与当前节点数组的第一个和最后一个键进行比较,如果值介于两者之间,我们知道它肯定会位于当前节点的数组中,因此我们可以开始使用复杂度为 O(log2(n)) 的 binarySearch 进入这个由十个元素组成的数组,否则如果我们搜索的键小于第一个键或如果它更大,我们就往右边走。
删除
与搜索相同,但我们删除了该值。
更新
与搜索相同,但我们更新了值。
结论
如果我没记错的话,这应该有 O(log10(log2(10))) 的复杂度,它总是对数的,所以我们不应该关心这个优化,但在我看来,这可能会使树的高度如此之小,同时也提供了快速的搜索时间。
【问题讨论】:
-
不,一个操作的复杂度是O(log10(n)
+log2(10)) = O(logn)。它与 AVL 或 B-tree 没有什么不同。 -
您在最后一段中的编辑使时间复杂度的错误更加严重。请保持原样,因为我已经发布了关于此的答案。
-
我同意你所说的,但在撰写本文时我认为 O(log10(log2(10)) 是正确答案,我在写作时犯了一个错误,所以如果我必须错了,至少我想保持一致。
标签: database optimization tree time-complexity binary-search