繁体   English   中英

如何从给定列表有效地构造B +树?

[英]How to efficiently construct a B+ tree from a given list?

我想从给定大小为N的无序元素列表中构建B +树。

我知道这样做的最佳界限是Θ(N / B * logM / B(N / B))块传输,这也是排序的最佳选择; 所以我不能简单地选择一个项目并单独在树中插入,因为它会给我O(N logB(N))块传输。

所以我认为构建树的最佳方法是首先对元素进行排序,因为无论如何都要对树进行排序。 从那以后,我很茫然。

我想过这样的事情:

  1. 从列表中取出B元素
  2. 把它们写在某个地方(这是三个叶子)
  3. 采取块的最后一个元素(最大的); 它将是叶子父级的路由键
  4. 对下一个元素重复步骤1,直到父级中有B-1个路由键
  5. 当父母中有B-1路由键时,表示它已满。 所以新的路由密钥将改为“祖父”(因此树增长一级),所有新的叶子将有一个新的父级
  6. 继续这样,直到读取N/B块为止

基本上,问题在于我没有考虑内部节点可以拥有的最小子节点数。 因此,例如,一个节点最终只有一个子节点,这显然是错误的。

我到处寻找,但我找不到实际解释如何在Θ(N / B * logM / B(N / B))构建树的算法。 我找到的只是在列表中为每个项目简单插入树的算法,而没有利用B因子。

你能帮助我吗,也许能指出我正确的方向?

而不是同时构建所有级别,可能使用多于一定数量的RAM块,我认为我将构建最基本的级别(即,广度优先而不是深度优先)。 给定列表,将其贪婪地切成大小为B的块。如果只有一个块,那就是根。 否则,如果最后一个块的元素太少,则尽可能均匀地重新平衡其元素与第二个块的元素; 两者现在都有足够的元素。 下一个列表由该级别的每个块中的最后一个元素组成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM