【发布时间】:2015-01-02 19:54:55
【问题描述】:
我想从给定的大小为 N 的无序元素列表构建 B+ 树。
我知道这样做的最佳界限是Θ(N / B * logM / B(N / B)) 块转移,这也是排序的最佳选择;所以我不能简单地选择一个项目并单独在树中插入,因为它会给我O(N logB(N)) 块传输。
所以我认为构建树的最佳方法是首先对元素进行排序,因为无论如何叶子都是有序的。从此,我不知所措了。
我想过这样的事情:
- 从列表中取出B元素
- 按它们在某处写它们(它是三者中的一片)
- 取块的最后一个元素(最大);它将是叶子父节点的路由键
- 对下一个元素重复步骤 1,直到父元素中有 B-1 路由键
- 当父节点中有
B-1路由键时,表示已满。所以新的路由键将改为“祖父”(因此树增长了一层),并且所有新叶子都会有一个新的父节点 - 这样继续下去,直到
N/B块被读取
基本上,问题在于我没有考虑内部节点可以拥有的最小子节点数。因此,例如一个节点最终可能只有一个孩子,这显然是错误的。
我到处寻找,但我找不到实际上解释如何在Θ(N / B * logM / B(N / B)) 中构建树的算法。我发现的只是将列表中的每个项目简单地插入到树中的算法,而没有利用 B 因素。
你能帮帮我吗,也许能给我指明正确的方向?
【问题讨论】:
-
关于第5步,“新的路由密钥将转到祖父”,进入祖父的不是新密钥,而是老父亲的中间密钥。新钥匙进入新父亲
-
你是对的,我的错!如果我在内部节点到达 B-1 元素时拆分它们,我可以保证树的构建尊重每个节点的最小子节点数。谢谢!
标签: algorithm data-structures tree b-tree