我想从给定的大小为N
的无序元素列表中构建B +树。
我知道这样做的最佳界限是Θ(N / B * logM / B(N / B))
块传输,这也是排序的最佳选择;所以我不能简单地选择一个项目并单独在树中插入,因为它会给我O(N logB(N))
块传输。
所以我认为构建树的最佳方法是首先对元素进行排序,因为无论如何都要对树进行排序。从那以后,我不知所措。
我想到了这样的事情:
B-1
个路由键时,表示它已满。所以新的路由密钥将成为"祖父"相反(所以树增长一级),所有新叶将有一个新的父N/B
块之前继续这样做基本上,问题在于我没有考虑内部节点可以拥有的最小子节点数。因此,例如,一个节点最终只有一个孩子,这显然是错误的。
我到处寻找,但我找不到实际解释如何在Θ(N / B * logM / B(N / B))
中构建树的算法。我找到的只是在列表中为每个项目插入树的简单算法,而没有利用B因子。
你能帮助我吗,也许能指出我正确的方向?
答案 0 :(得分:0)
不是同时构建所有级别,而是可能使用多于一定数量的RAM块,我认为我会将最基本的级别构建为最根本的(即,广度优先而不是深度优先) )。给定列表,将其贪婪地切成大小为B的块。如果只有一个块,那就是根。否则,如果最后一个块的元素太少,则尽可能均匀地重新平衡其元素与第二个块的元素;两者现在都有足够的元素。下一个列表由该级别的每个块中的最后一个元素组成。