一文读懂特殊的树结构——B-树

专栏目录(数据结构与算法解析):https://blog.csdn.net/qq_40344524/article/details/107785323

B-树

之前我们已经对树和哈夫曼树进行了一些介绍,今天我们来讲解另一种特殊的树——B-树(B树),为了提高数据库的查询效率并保证数据有序存储通常数据库的索引都会采用树结构存储,为了提高查询效率又在树结构的基础上引入了二叉查找树的概念,但是由于数据库的索引是存放在磁盘中的,而且数据量太大时很难将整个索引全部加载到内存中,此时需要分页加载,此时采用二叉查找树磁盘IO会很频繁,因此需要引进一种有效的方法减少磁盘IO,因此,B-树便应运而生了,B-树是适用于外查找的平衡的多叉树,它较二叉查找树来说有很明显的改进,接下来进行详细讲解。


一棵m阶B-树是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:

1、根结点至少有两个子女;
2、每个非根节点所包含的关键字个数 j 满足:[m/2] - 1 <= j <= m - 1;
3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:[m/2] <= k <= m ;
4、所有的叶子结点都位于同一层。

B-树这种数据结构可以用来描述外部存储。
这种数据结构常被应用在数据库和文件系统的实现上


在B-树中,非叶子节点可以拥有可变数量的子节点。当数据被插入或从一个节点中移除,它的子节点数量发生变化。为了维持在预先设定的数量范围内,内部节点可能会被合并或者分离。因为子节点数量有一定的允许范围,所以B树不需要像其他自平衡查找树那样频繁地重新保持平衡,但是由于节点没有被完全填充,可能浪费了一些空间。子节点数量的上界和下界依特定的实现而设置。


之前我们有介绍过B-树是在二叉查找树的基础上发展来的,接下来我们先从二叉查找树讲起,假定有如下二叉查找树(高度为4):
在这里插入图片描述

在上述二叉查找树中查找值为17的项,步骤如下:

第一次磁盘I/O

在这里插入图片描述

第二次磁盘I/O

在这里插入图片描述

第三次磁盘I/O在这里插入图片描述
第四次磁盘I/O

在这里插入图片描述

通过上述图示可看出磁盘IO次数与树的高度有关,为了提高查询效率我们可以适当的减小树的高度,通过对上述树进行改造,可构造如下所示的树:
在这里插入图片描述

正好符合之前讲到的B-树的特征。


在上述B-树中查找值为17的项具体步骤如下:

第一次磁盘I/O

在这里插入图片描述

第二次磁盘I/O

在这里插入图片描述

第三次磁盘I/O

在这里插入图片描述

通过上述图解可以看出在B-树中查找需要进行的磁盘I/O比二叉查找树中少,内存中数据比较会比二叉查找树多一些,我们都知道在内存中进行数据的比较处理比磁盘I/O效率高很多,因此B-树的查找效率要比二叉查找树高,当数据量增加时提升效果会更明显。


现在我们对B-树有了一定的了解,接下来我们对在B-树中插入和删除数据进行讲解


插入

还以上述B-树为例,向上述B-树中插入值18,如下图所示:

在这里插入图片描述

经分析可以知道,节点17,21已经是两元素节点,无法再增加。父亲节点 13, 25也是两元素节点,也无法再增加。根节点11是单个元素的节点,可以将其变为两元素节点。因此我们可以拆分节点17,21和节点13,25,让根节点11变为两元素节点11,18。节点13独立为根节点的第二个孩子。


具体各结点的变动情况如下:

在这里插入图片描述
从以上图示中可以发现在进行插入操作时B-树的结点变动会很复杂,下面我们在来看看B-树中元素的删除。


删除

删除元素21时,首先自顶向下查找元素21的节点位置。

在这里插入图片描述

删除21后,节点31只有一个孩子结点了,不符合B-树规范。因此找出25,31,32三个值的中位数31,取代节点25,而节点25下移成为第一个孩子。(这个过程称为左旋)


具体各结点的变动情况如下:

在这里插入图片描述

以上就树我们对B-树的讲解,其中B-树中元素的插入和删除是其中的重点也是难点,可能有些不好理解,但是只要掌握好B-树的核心思想,反复推敲一定能将B-树彻底掌握。


之前讲过B-树的出现是为了提高数据库的查询效率,因此B-树的主要应用场景就是文件系统和部分数据库的索引,例如非关系型数据库MongoDB数据库就用到了B-树,但是大部分关系型数据库却是使用了B-树的变形形式——B+树,下节我们在对B+树进行讲解。


以上是我的一些粗浅的见解,有表述不当的地方欢迎指正,谢谢!


表述能力有限,部分内容讲解的不到位,有需要可评论或私信,看到必回…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

书山客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值