如果我有t =个元组(或#records),并且我可以利用的唯一其他信息是我的B +树的扇出F,有没有办法获取多少个叶子(叶子的#blocks),树会需要吗?假设必须平衡树,并在尽可能最小的空间中保留最多的信息。
例如:t = 40K,F = 40 ==>深度= log_40(40K)= 3,#leaves = ???
答案 0 :(得分:1)
在B+ tree中,实际记录是从叶子内部引用的。另一方面,内部节点不直接引用记录,而是定义键值的范围,以便遍历树到最终具有目标记录键值的叶子(块)。
B +树的另一个属性是内部节点的子节点数目不仅具有上限(即扇出 F ),还具有下限: F / 2 < / em>。 (我忽略了根不受此下限规则的限制)。这个1/2系数就是填充系数(0.5)。
叶块( L )的数量受记录数( t )和扇出( F )的约束,但不是以这种方式来平衡树。在最好的情况下,我们可以做到:
min(L)=⌈t /F⌉
在最坏的情况下,我们有:
max(L)=⌈2t /F⌉
如果填充因子不同( c > = 0.5),那么最坏的情况是:
max(L)=⌈t /cF⌉
请注意,增加填充因子会减少已用空间,但会增加插入记录时的时间开销。当填充因子接近于1时,空间使用将保持在最低限度,但更新将很慢。