数据结构之B树

1 引言

B-tree,B即Balanced,是自平衡的多叉搜索树,用于组织和存储大量数据,以及数据库和文件系统等需要高效查找和插入操作的应用中。

为什么是“大量数据”?当主存不足以放入大量数据时,不常用的数据应存储于外存,而访问外存有额外时间开销(如磁盘转动时间、磁头移动时间等),于是我们需要一个数据结构来减少磁盘访问次数

B树每个节点包含多个关键字(键)和对应的数据指针(节点),关键字按照大小排序,并且每个节点的关键字都对应子节点的范围。

B树的根节点存储在主存中,而其他节点存储在磁盘或其他外部存储设备上

M阶B树是有以下特性的M叉树:

  1. 数据项(data items)存储在叶节点(leaves);
  2. 非叶节点(nonleaf nodes)最多存储指引搜索路线的M-1个关键字Key,并且Key i是该节点子树i+1的最小值;
  3. 根节点(root)也是非叶节点,它有2至M个子节点;
  4. 所有非叶节点(root除外)有 ⌈ M / 2 ⌉ \lceil M/2 \rceil M/2至M个子节点;
  5. 所有叶节点都位于最底层,有 ⌈ L / 2 ⌉ \lceil L/2 \rceil L/2至L个数据项。L是指定值,由存储块和记录大小决定,即L=存储块大小/记录大小

五阶B树示例如下图所示:

在这里插入图片描述

上图中,M=5,L=5,于是,根节点有2到5个子节点,非叶节点最多有4个关键字,除根节点外的非叶结点有3到5个子节点,叶节点有3到5个数据项。每个节点都是一个磁盘块(disk block)

2 B树的操作

添加

如图2,插入57到图1。

在这里插入图片描述

插入操作步骤如下:

  1. 从根节点开始,按照键值的大小进行搜索,直到找到合适的叶子节点。在这个例子中,我们找到了可以插入57的叶子节点。
  2. 检查叶子节点是否已满。如果叶子节点未满,则可以直接将57插入到适当的位置。
  3. 如果叶子节点已满,需要进行节点的分裂操作。首先,将叶子节点中的数据项和新的数据项按照键值的顺序重新排序。然后,将前一半数据项保留在原始叶子节点中,将后一半数据项移动到新创建的叶子节点中。同时,更新父节点中的键值和分支信息,以反映新的叶子节点的存在。
  4. 如果父节点也已满,可能需要继续进行分裂操作,以保持B树的平衡性。

如图3,插入55到图2,共两步:分裂页节点和更新父节点。所以一共有三次disk write操作。

在这里插入图片描述

如图4,插入40到图3,由于父节点满项,所以除了分裂子节点,更新父节点,还需要再分裂父节点。一共五次disk write。

在这里插入图片描述

添加操作可能导致的根节点分裂是B树高度增加唯一方式。

删除

寻找键值
是否存在
删除键值
结束
该节点是否符合最小占用
邻居节点是否比最小占用多
从邻居节点借一个
合并邻居节点
父节点是否符合最小占用
是否为根节点
根节点是否只有一个子节点
删除根节点,子节点作为新根节点

上图删除根节点是B树高度减小的唯一方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值