Skip to content

模型Model

B 树

施工中 · 内容逐步修订

B-tree

以高扇出、有界节点占用率和等深叶层降低外存查找 I/O 的平衡搜索树。

形式陈述 ​

本页采用 minimum degree t≥2 的约定。B 树是一棵有根树,键来自一致的全序。每个节点保存递增键 k1<⋯<kr;含 r 个键的内部节点有 r+1 个子女,第 i 个子树只含相邻分隔键所界定区间内的键。除根外,每个节点含 t−1 到 2t−1 个键;非叶根至少含一个键;所有叶位于同一深度。这些条件同时给出搜索次序、最低占用率与全局平衡。

查找在当前节点内定位分隔区间,再只沿一个子女下降。插入时,在进入满节点前把其中间键提升到父节点,并将余下键分成两个至少含 t−1 个键的节点;若根已满,先分裂根并使树高增加一。删除下降前保证目标子女至少有 t 个键:可向有富余键的相邻兄弟借位并旋转父分隔键,或把两个最小占用兄弟与父分隔键合并;若内部根变空,则由它的唯一子女替代。

若一个节点恰好装入一个外存块,树高为 O(logt⁡N),搜索、插入和删除沿根叶路径只需 O(1+logt⁡(N+1)) 次 I/O;常数项覆盖空树及单个根页。节点内部的比较次数则由所用的查找方法决定,可在 RAM 或比较模型下另行计算。

直觉

B 树与二叉平衡搜索树都控制根叶路径,B 树则以多路节点和块传输为对象,让一次读取带回许多键与子指针,用高扇出把二叉结构的多层判断压进一个外存块。半满约束保证节点不会因更新逐渐退化成稀疏长链,叶同深则让任意查找承担相近的块传输次数。

分裂、借位和合并在局部恢复节点占用不变量。插入只可能向上增加一个分隔键,删除只沿访问路径补足即将下降的子女,因此更新无需重写整棵树。

满节点分裂与中键提升
例子与边界

t=2 时,非根节点含 1 到 3 个键,是常见的 2–3–4 树。若一个叶已有三个键,再插入落入该叶区间的键,就先把中键提升到父节点,左右叶各保留一个键,再进入正确一侧。分裂后父节点的区间路由仍完整,两个新叶仍与其他叶同深。

删除若直接从只含 t−1 个键的叶取走目标,会突破最低占用。正确算法在下降前查看兄弟:兄弟有至少 t 个键时借一键;相邻兄弟都只有 t−1 个键时,选其中一个与目标节点合并,并把二者之间的父分隔键下移。

文献中的“order”有时指最大子女数,有时指最小子女数或最大键数;不固定约定便会让节点上下界相差一。重复键、卫星记录放在内部还是外部、节点内采用线性还是二分查找,均属于实现层契约。

推论与应用

B 树用于文件系统、数据库索引和需要外存动态有序集合的场景。块大小越大,可容纳的分隔键越多,树高通常越低;但实际扇出还受键、指针和记录大小影响。I/O 复杂度应以真实节点是否能在一块内传输为前提。

B+ 树把记录全部放到叶层并链接叶节点,适合范围扫描;内部节点负责路由,记录查询与顺序扫描在叶层完成。

参考资料
  • Rudolf Bayer and Edward M. McCreight, “Organization and Maintenance of Large Ordered Indexes,” Acta Informatica 1, 1972, pp. 173–189.
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Ch. 18, B-trees.
关系图谱13 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系