假设订单为m的B +树。为什么非叶子节点必须至少有ceil(m / 2)个孩子?或者如果不满足此属性会发生什么。
答案 0 :(得分:2)
如果不强制执行半满规则,则可以(有效地)得到不平衡树,例如
[root]
/ \_________________________
/ \
[branch] [branch]
/ \ ____/ | \___
/ \ / | \
[1-record leaf] [1-record leaf] [100-record leaf] [100-record leaf] [100-record leaf]
在这棵树中找到第一条或第二条记录的时间要比找到其他300条记录要少得多。
如果你让叶子只有一个记录,而分支只有一个密钥(因此有两个孩子),我相信查找时间的差异可能与log(m)一样糟糕(其中m是顺序)的树)。沿着完整节点的路径查找记录需要Θ(log(N)* log(m))时间(其中N =记录总数,因此log(N)与树的高度成比例),同时查找沿着最小尺寸节点的路径记录只需要Θ(log(N))时间(因为你在每个分支处只进行一次比较而在叶子上没有进行比较)。
通过强制执行半满规则,您可以确保所有查找时间都是Θ(log(N)* log(m))并且在彼此的常数因子内。