我想从一个大小为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因子。
你能帮我吗,也许指点一下方向?
我知道最优的方法是使用Θ(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因子。
你能帮我吗,也许指点一下方向?