当前位置: 首页 > news >正文

3关键字B+树构建详解

3关键字B+树构建实例详解

当每个节点最多包含3个关键字时,我们构建的是4阶B+树(m=4,即每个节点最多3个关键字,4个子树指针)。

1. 构建规则说明

3关键字B+树的特性:

  • 每个节点最多3个关键字
  • 非叶子节点:最少⌈m/2⌉-1 = 1个关键字,最多3个关键字
  • 叶子节点:最少⌈m/2⌉ = 2个关键字,最多3个关键字
  • 分裂条件:当节点关键字数达到4时立即分裂

2. 逐步构建过程

插入序列:[10, 20, 5, 15, 25, 30, 3, 8]

步骤1:插入10、20

根节点(叶子):[10, 20]

步骤2:插入5

根节点(叶子):[5, 10, 20] ✅ (3个关键字,未超过限制)

步骤3:插入15(触发第一次分裂)

插入15后:[5, 10, 15, 20]→ 关键字数=4,需要分裂

分裂过程:

  • 选择中间关键字:15
  • 左叶子节点:[5, 10]
  • 右叶子节点:[15, 20]
  • 新根节点:[15]
构建后的结构: [15] / \ [5,10] [15,20]

步骤4:插入25

插入到右叶子节点:[15, 20, 25]

[15] / \ [5,10] [15,20,25]

步骤5:插入30(触发第二次分裂)

插入30后右叶子节点:[15, 20, 25, 30]→ 关键字数=4,需要分裂

分裂过程:

  • 选择中间关键字:25
  • 左叶子节点:[15, 20]
  • 右叶子节点:[25, 30]
  • 提升关键字25到父节点
分裂后的结构: [15,25] / | \ [5,10] [15,20] [25,30]

步骤6:插入3

插入到左叶子节点:[3, 5, 10]

[15,25] / | \ [3,5,10] [15,20] [25,30]

步骤7:插入8(触发第三次分裂)

插入8后左叶子节点:[3, 5, 8, 10]→ 关键字数=4,需要分裂

分裂过程:

  • 选择中间关键字:8
  • 左叶子节点:[3, 5]
  • 右叶子节点:[8, 10]
  • 提升关键字8到父节点
最终结构: [8,15,25] / | | \ [3,5] [8,10] [15,20] [25,30]

3. 关键分裂时刻分析

分裂点选择规则

对于3关键字限制的节点,分裂时:

  • 原节点:4个关键字[k1, k2, k3, k4]
  • 分裂点:选择第2个关键字k2
  • 左节点:[k1, k2]
  • 右节点:[k3, k4]
  • 提升到父节点:k2

父节点处理

当父节点接收提升的关键字后:

  • 如果父节点关键字数≤3:直接插入
  • 如果父节点关键字数=4:父节点也需要分裂

4. 与标准B+树的对比

特性3关键字B+树标准B+树(通常5+关键字)
树高度增长更快增长较慢
分裂频率更频繁较少
空间利用率较低(50-75%)较高(约66%)
适用场景内存受限环境磁盘I/O优化

5. 实际构建代码调整

class BPlusTree3Keys: def __init__(self): self.order = 4 # 4阶B+树,每个节点最多3个关键字 self.root = BPlusTreeNode(is_leaf=True) self.min_keys_leaf = 2 # 叶子节点最少2个关键字 self.min_keys_internal = 1 # 内部节点最少1个关键字 def _should_split(self, node): """检查是否需要分裂:关键字数达到4时分裂""" return len(node.keys) >= 4 def _split_leaf_3keys(self, leaf): """3关键字限制的叶子节点分裂""" # 分裂点选择:4个关键字中选择第2个 split_index = 2 # 选择第2个关键字作为分裂点 new_leaf = BPlusTreeNode(is_leaf=True) # 关键字分配 new_leaf.keys = leaf.keys[split_index:] # [k3, k4] leaf.keys = leaf.keys[:split_index] # [k1, k2] # 数据指针分配 new_leaf.data_ptrs = leaf.data_ptrs[split_index:] leaf.data_ptrs = leaf.data_ptrs[:split_index] # 提升的关键字是右节点的第一个关键字 promoted_key = new_leaf.keys[0] return promoted_key, new_leaf

6. 构建总结

3关键字B+树的构建特点:

  1. 分裂频繁:每插入4个关键字就可能触发一次分裂
  2. 树高增长快:数据量相同时,树的高度高于关键字限制更大的B+树
  3. 维护成本高:由于频繁分裂,插入操作的代价较高
  4. 内存友好:适合内存受限但需要B+树特性的场景

这种设计在实际系统中较少使用,通常只在特殊的内存优化场景或教学示例中出现。标准的B+树通常选择较大的节点大小(如几十到几百个关键字)来优化磁盘I/O性能。

http://www.jsqmd.com/news/470495/

相关文章:

  • 2026年中小企业主必看:北京代理记账公司选型指南与精准适配建议 - 十大品牌推荐
  • Vibe Coding氛围编程
  • 上海佳航 JH-T7 全自动电位滴定仪测定酱油中氯化钠含量应用方案
  • 工牌心跳监测暴雷:焦虑值成晋升硬指标——软件测试从业者的专业视角
  • 什么是CRM?免费CRM和付费CRM差距有多大 - 纷享销客智能型CRM
  • mysql-关于distinct
  • Python flask django微信小程序的化工企业危化物流运输车辆调度任务分配系统
  • 聊聊北京学校灭鼠杀虫的靠谱品牌,有哪些值得推荐的厂家? - mypinpai
  • 多思AI:功能强大的智能助手,改变你的工作方式
  • 【Java SE】Java代码块详解
  • sudo 设置 - a
  • 从“屎山代码”到“智能体协同”:资深架构师眼中的财务自动化演进与 AI Agent 实战
  • 3. OpenClaw自定义skill通过环境变量传参
  • js基础和数据类型
  • 使用裁剪插件开发的 头像处理组件 响应式
  • 网安人的周末,其实是拉开差距的黄金期
  • 瑞祥商联卡回收渠道全解析:选择最佳方法安全又便捷 - 团团收购物卡回收
  • 一键把“纯色区划地图”数字化为 GIS 面要素:Map Digitizer Pro
  • 2026年大专商务英语毕业起薪规划与提升路径
  • 2026年中小企业主必看:北京代理记账公司选型指南与核心价值适配解析 - 十大品牌推荐
  • Flutter 三方库 malison 的鸿蒙化适配指南 - 强大的终端仿真与文本处理框架
  • 目前我还有一家同行业头部公司的offer,全年总包是XX万,贵司如果能把薪资调整到XX万,我可以立刻回绝其他offer,优先入职贵司
  • 什么是CRM?CRM系统和ERP有什么区别 - 纷享销客智能型CRM
  • OpenClaw 模型配置与切换经验分享
  • Idea中JDK版本引起的问题
  • 2026年比较好的上海办公室装修厂家推荐:上海写字楼装修制造厂家哪家靠谱 - 行业平台推荐
  • nacos连接DM达梦数据库
  • 电脑实时监控软件有什么?珍选8款电脑实时监控APP,2026新排行
  • 黄瓜遗传转化
  • 大模型开发全攻略:从零到一,打造你的智能应用!大模型项目实战教程(非常详细)