B树(B-Tree)发明者故事
065B树:驯服数据洪流
5W1H 发明者故事
Who(谁)
Rudolf Bayer 和 Edward M. McCreight,当时均供职于波音科学研究实验室(Boeing Scientific Research Laboratories)。Bayer 是来自德国的计算机科学家,后成为慕尼黑工业大学教授;McCreight 是美国计算机科学家,后加入 Xerox PARC,参与了 Alto 计算机等划时代项目。
What(什么)
他们发明了 B树(B-Tree)------一种自平衡的多路搜索树数据结构,专为在磁盘等块存储设备上高效管理大规模有序数据而设计。
When(何时)
1972年,论文《Organization and Maintenance of Large Ordered Indices》发表于 Acta Informatica 第1卷,奠定了 B树理论基础。
Where(何地)
美国华盛顿州西雅图,波音公司旗下的波音科学研究实验室。彼时磁盘存储器刚开始普及,如何在慢速机械磁盘上高效维护索引是工业界的核心难题。
Why(为何)
1960--70年代,数据库系统和文件系统迅速兴起,数据量远超内存容量,必须存储在磁盘上。而磁盘的随机访问代价极高------每次磁盘I/O相当于数百万次内存操作。Bayer 和 McCreight 需要一种树形结构,使树的高度尽可能矮(减少 I/O 次数),同时每个节点能装入一个磁盘页(减少读写次数)。
How(如何)
他们设计了"阶数"(order/最小度 t)概念:每个非根内部节点拥有至少 t-1、至多 2t-1 个键,从而保证树高为 O(log_t n)。插入时若节点已满(2t-1个键),则在向下寻路前提前分裂,保证回溯时父节点仍有空间。删除时通过从兄弟节点借键或合并节点来维持最小占用率。Knuth 在 TAOCP 第三卷第6.2.4节对此作了系统性阐述,将其纳入查找算法的经典体系。
"B树的'B'可能代表 Bayer、波音(Boeing)、平衡(Balanced)或宽泛(Broad)------Bayer 本人从未正式解释。" --- 计算机科学史趣闻
自然语言需求定义
B树是一种自平衡的多路搜索树,满足以下性质:
- 节点容量:设最小度数为 t(t≥2),每个非根节点至少包含 t-1 个键,至多包含 2t-1 个键;根节点至少包含 1 个键(非空树时)。
- 子节点数量:拥有 k 个键的内部节点恰好有 k+1 个子节点。
- 有序性:节点内的键从左到右严格递增;子树中所有键满足夹逼关系。
- 平衡性:所有叶节点位于同一层(树高严格相等)。
需要支持的操作:
- search(key):从根开始向下搜索,返回包含该键的节点指针及键在节点中的下标;若不存在返回 NULL。
- insert(key):将键插入到合适的叶节点;若沿途节点已满(2t-1个键),在下行前提前分裂该节点,保证插入后树仍满足B树性质。
- delete(key):删除指定键,分三种情况处理:键在叶节点直接删;键在内部节点用前驱/后继替换后再删叶节点;若删除后节点键数不足 t-1,则向兄弟借键或与兄弟合并。
- range_search(low, high):返回所有满足 low≤key≤high 的键,结果有序。
验收标准表格
| 编号 | 测试场景 | 输入 | 期望输出 / 判断条件 | 验收类别 |
|---|---|---|---|---|
| AC-01 | 顺序插入并搜索全部键 | 插入 3,7,1,5,9,2,4,6,8,10,搜索每个键 | 每个键均能找到,search 返回非 NULL | 功能正确性 |
| AC-02 | 删除存在的键后搜索 | 删除 3 和 7,搜索 3 和 7 | 返回 NULL(未找到) | 功能正确性 |
| AC-03 | 删除后剩余键仍可找到 | 删除 3,7 后搜索 1,2,4,5,6,8,9,10 | 全部找到 | 功能正确性 |
| AC-04 | 树高约束 | 插入 n=10 个键,t=3 | 树高 ≤ ceil(log_3(11)) = 3 | 结构正确性 |
| AC-05 | 中序遍历有序 | 插入 3,7,1,5,9,2,4,6,8,10 | 中序遍历输出 1,2,3,4,5,6,7,8,9,10 | 有序性 |
| AC-06 | 范围查找 | range_search(3, 7) | 返回 3,4,5,6,7(删除前) | 范围查询 |
| AC-07 | 搜索不存在的键 | search(100) | 返回 NULL | 边界条件 |
| AC-08 | 节点键数约束 | 插入后检查每个非根节点 | t-1 ≤ keys ≤ 2t-1 (t=3,即 2≤keys≤5) | 结构正确性 |
| AC-09 | 重复插入同一键 | 插入 5(已存在) | 树结构不变,不插入重复键 | 鲁棒性 |
| AC-10 | 空树搜索 | 新建空树,search(1) | 返回 NULL | 边界条件 |