B树
概述
B树是一种平衡的多路搜索树,专为磁盘等外存设备设计,能有效减少I/O次数。与二叉搜索树不同,B树的每个节点可以包含多个关键字和多个孩子,使得树的高度非常低,从而在磁盘访问代价远高于内存访问的场景下获得极高的查询效率。
定义
B树的严格定义
一棵最小度为 的B树满足以下五条性质:
- 每个节点最多有 个关键字
- 根节点至少有 个关键字(若树非空)
- 非根的内部节点至少有 个关键字
- 所有叶子节点在同一层(深度相同),且不携带信息(可作为哨兵)
- 关键字有序:设节点 有 个关键字 ,则满足
- 子树 中所有关键字满足:k_{i-1} < \text{(c_i中所有关键字)} < k_i(约定 ,)
节点结构示意
一个包含 个关键字的B树节点具有如下结构:
其中 满足 (根节点除外),子树数量为 。
核心性质
1. 高度上界
由B树高度定理,含 个关键字的B树高度满足:
这意味着B树非常”矮胖”——即使存储海量数据,树的高度也非常小。
2. 操作复杂度
- 搜索: 次磁盘I/O, CPU时间
- 插入: 次磁盘I/O(单次向下遍历 + 至多一次分裂向上传播)
- 删除: 次磁盘I/O(单次向下遍历 + 至多一次合并向上传播)
3. 平衡性
B树始终保持严格平衡——所有叶子节点始终位于同一层。这与AVL树、红黑树等通过旋转维护平衡的二叉搜索树不同,B树通过分裂和合并操作来维持平衡。
4. 与二叉搜索树的关系
当 时,B树退化为一种特殊的二叉搜索树(2-3-4树)。B树可以看作是二叉搜索树向多路搜索树的自然推广。
发明历史
B树由 Rudolf Bayer 和 Edward M. McCreight 于 1972年 在 Boeing Scientific Research Labs 发明。关于”B”的含义,两位发明者说法不一——可能是 “Boeing”、“Bayer”、“balanced” 或 “broad”,至今没有定论。