0%

B-Tree

是一种平衡树。设阶数 mm(即 mm 叉树),则每个节点含 m1m - 1 个元素。

插入时都是加在叶子节点内。当一个节点超过 m1m - 1 个元素,取中间一个向上推,左右两边分开作为儿子。

这保证了每个节点至少含有 (m1)/2(m - 1) / 2 个元素,较为“饱满”。同时这个分裂操作保证左右形态是对称的,维持树高在 log 级。

而对于删除操作,如果删除的元素位于非叶子(internal)节点,可以与其前驱或后继交换,转换为删除叶子上元素。

在删除后,若“至少含有 (m1)/2(m - 1) / 2 个元素”的限制被打破,可以从同层级的左右节点移元素过来;若左右节点也不足,则该节点与左右节点之一合并。

左节点、父亲、当前节点的大小分别有如下上界:

(m1)/2,1,(m1)/21(m - 1) / 2, 1, (m - 1) / 2 - 1

故合并之后的节点不多于 m1m - 1 个元素。

以上的做法维持了 B-Tree 的两条限制:节点大小、树形态。于是可以证明复杂度是 log 的。


B-Tree 算法比我之前见到的平衡树有趣,但似乎竞赛中少有使用。在工业界 B-Tree 有所应用,如文件系统和数据库等。

好难写。唉,DS。