065 B树(B-Tree)

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树是一种自平衡的多路搜索树,满足以下性质:

  1. 节点容量:设最小度数为 t(t≥2),每个非根节点至少包含 t-1 个键,至多包含 2t-1 个键;根节点至少包含 1 个键(非空树时)。
  2. 子节点数量:拥有 k 个键的内部节点恰好有 k+1 个子节点。
  3. 有序性:节点内的键从左到右严格递增;子树中所有键满足夹逼关系。
  4. 平衡性:所有叶节点位于同一层(树高严格相等)。

需要支持的操作:

  • 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 边界条件
相关推荐
饮水桶_T12 小时前
JAVA IO流笔记
开发语言·数据结构·算法
wo_jack17 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
zaizai100720 小时前
算法(左程云)1
数据结构
charliejohn20 小时前
计算机考研 408 数据结构 图论-关键路径
数据结构·图论
David猪大卫2 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
vvilkim2 天前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
阿卡好可爱2 天前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
心仪久了会沦陷3 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
码少女3 天前
数据结构——图的基础
数据结构