前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图解:什么是B-树、B+树、B*树

图解:什么是B-树、B+树、B*树

作者头像
你好戴先生
发布于 2020-09-03 07:32:43
发布于 2020-09-03 07:32:43
10.9K2
举报
文章被收录于专栏:戴言泛滥戴言泛滥

1.二叉搜索树

在说B树之前,我们需要先了解一下二叉搜索树

二叉搜索树,顾名思义,是用来搜索的有序树

它具有以下特点:

1.所有非叶子结点至多拥有两个儿子(Left和Right);

2.所有结点存储一个关键字;

3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。

下边这个就是一棵二叉搜索树

1.1 二叉搜索树的查找

二叉搜索树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中

否则,如果查询关键字比结点关键字小,就进入左儿子

如果比结点关键字大,就进入右儿子

如果左儿子或右儿子的指针为空,则报告找不到相应的关键字

搜索数字8的过程如上图

比起循环遍历的查找方法

二叉查找可以将时间缩小到一半

1.2 二叉搜索树的插入

二叉搜索树的插入,从根结点开始,进行比较

如果相等,则不进行插入操作

如果大于当前节点,则与右孩子进行比较

如果小于当前节点,则与左孩子进行比较

最终将新元素加入到搜索停止的地方

插入数字11的过程如上图

1.3 二叉搜索树的删除

删除操作和查找操作差不多

找到之后就把当前节点删除

然后比较删除节点的左孩子替代当前位置

删除数字11的过程如上图

1.4 存在问题

二叉搜索树的插入过程不会改变已有节点的位置

这样在我们依次插入1,2,3,4,5,6,7的时候,会出现下面这种情况

当是这种结构的时候,它就是线性结构了

查找效率就又恢复到全部遍历了

为了解决这种问题,平衡二叉树(AVL树),又叫自平衡二叉树就出现了

2. 什么是B树

B树,即B-tree树,B是Balanced首字母,平衡的意思

因为B树的原英文名称为B-tree

很多人喜欢把B-tree译作B-树,然后读作B减树

其实,这么是不对的

容易让人会以为B树和B-树是两种树

特此声明:B-树就是指的B树

好了,本章结束

3. 什么是B-树

首先B-树是一种多路平衡搜索树

简单来说,就是每个节点不止存储一个数据值

每个节点也不止有两个子节点

比起平衡二叉树,它能很大程度减低树的高度

提高树的检索效率

3.1 B-树的特点

下面来具体介绍一下一个m阶的B树具有如下几个特征:

1.定义任意非叶子结点最多只有M个儿子;且M>2;

2.根结点的儿子数为[2, M];

3.除根结点以外的非叶子结点的儿子数为[M/2, M];

4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

5.非叶子结点的关键字个数=指向儿子的指针个数-1;

6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

8.所有叶子结点位于同一层;

看着是不是有点懵

举个栗子,这就是一个B-树

对照上边的B-树特征,我们做一下说明

1、节点8左边的数值都是小于8的,右边的数值都是大于8的

2、以(003,006)节点为例,它有三个子节点,分别是

(001,002)、005、007

其中(001,002)是小于003的,005是大于003且小于006的,007是大于006的

3、这是一个3阶B-树,每个节点最多有两个元素,每个节点最多有三个子孩子

好了,这样是不是就清晰多了

3.2 B-树查询操作

查询数值9的过程

从根节点开始,先跟8比较

大于8,所以找到8的右孩子,也就是(0010,0012)节点

跟10比较,比10小,所以找到该节点的最左孩子9

跟9比较,等于要查找的数值,返回

3.3 B-树插入操作

插入数值6的操作

首先跟查找一样,先进行比较

最终找到合适的位置,也就是(0013,0015)这个节点

将16插入该节点,变成(0013,0015,0016)

由于元素个数k大于了m-1(这是一个三阶B-树,m-1=2)

为了符合B-树的那几个特性,将会优先更加父节点的元素个数

向上传递元素,传递的原则就是中间值优先,所以传递元素为15

但是父节点也要符合B-的特性

由于元素个数也超了,所以再往上一级传递元素,传递元素为12

最终到了根节点,变成了(0008,0012)

此时根节点需要有三个子孩子

所以将根节点的右孩子,拆分成了两个

至此,调整完成,完全符合B-的特性了

3.4 B-树删除操作

删除节点16

删除操作相当于插入操作的逆操作

首先还是要先找到目标值,即16这个结点

然后将其删除,此时15节点的子孩子只有一个

不符合特性3了

将16的父节点元素较大值15往下放

同时将15的父节点元素较大值12往下放

此时根节点只有一个元素8,只能有两个子节点

将10和12合并成(0010,0012)

调整指针指向

至此,调整完成,完全符合B-树特性

完成数值16的删除

4. 什么是B+树

B+树是B-树的变体,也是一种多路搜索树

4.1 B+树的特点

其定义基本和特性与B-树同,除了:

1.非叶子结点的子树指针与关键字个数相同

2.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1]]的子树(B-树是开区间)(下边的动图示例是遵循的开区间生成的,当然也算符合条件,但明显就不是最优的结构)

3.为所有叶子结点增加一个链指针

4.所有关键字都在叶子结点出现

再举个栗子,就清晰了

比起B-树,B+树所有的节点数值都会出现在叶子节点中

并且,所有叶子节点组成了一个增序的链表

4.2 B+树的查询

查询数值11

4.3 B+树的插入

插入数值16

4.4 B+树的删除

删除值16

5. 什么是B*树

是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

B*树定义了非叶子结点元素个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)

B*的查询、插入和删除操作和B+树差不多

只不过会遵循非叶子结点元素个数至少为(2/3)*M的特点

比如,对于3阶B*树,当元素个数大于1的时候

每个非叶子节点的元素个数,至少为两个

6. 小结

二叉搜索树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;

所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

依据自己的特性,这几种搜索树在文件系统数据库的索引建立中,有着非常广泛的应用

7. 思考

为什么MySQL的Innodb引擎最终选择了B+树?

在下篇博客中我为大家细细道来

文/戴先生@2020年6月25日

---end---

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 你好戴先生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
文章内容可以就是感觉是东抄抄西抄抄. 同一个东西用了五种名词来代指. 关键字 数据值 数值.元素值 元素. 抄的话能不能稍微改改?
文章内容可以就是感觉是东抄抄西抄抄. 同一个东西用了五种名词来代指. 关键字 数据值 数值.元素值 元素. 抄的话能不能稍微改改?
回复回复点赞举报
写的这么好居然没评论
写的这么好居然没评论
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【63期】谈谈MySQL 索引,B+树原理,以及建索引的几大原则(MySQL面试第六弹)
来自:blog.csdn.net/u013142781/article/details/51706790
良月柒
2020/11/06
8430
【63期】谈谈MySQL 索引,B+树原理,以及建索引的几大原则(MySQL面试第六弹)
B树 B-树 B+树 B*树
B树 即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针指向小于其关键字的子
用户1154259
2018/01/17
1.8K0
B树 B-树 B+树 B*树
MySQL索引底层:B+树详解
当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+树。今天我们一起来学习一下B+树哈~
捡田螺的小男孩
2021/03/15
8200
MySQL索引为什么使用B+树?
面对这个问题,我相信80%的人都不清楚(包括我自己),那么本文就围绕这个问题展开介绍,在了解索引之前,我们先了解一下B+树,什么是B+树?在了解B+树之前,先了解一下什么是B树?介绍B树和B+树的插入、删除操作。
SEian.G
2021/05/27
6110
SQL 05 - B树
B树在多次插入删除后, 复杂度有可能会退化, 最终退化到线性时间复杂度, 因此, 需要通过类似AVL树算法对B树进行维护.
Reck Zhang
2021/08/11
2190
大数据计数原理1+0=1这你都不会算(四)No.52
这是本坑的第四篇,之前已经说了关于 HashSet 、BitMap 、Bloom Filter 布隆过滤器了,本篇主要讲B-树。要是还不知道前面讲了啥的,可以点一下下面的连接看看。 大数据计数原理1+0=1这你都不会算(一)No.47 大数据计数原理1+0=1这你都不会算(二)No.50 大数据计数原理1+0=1这你都不会算(三)No.51 B+树是现在很多索引系统的数据结构,而B-树是B+树的基础,本次先讲B-树。 而在讲B-树之前,又不得不讲二叉搜索树(BST,Binary Search Tree)
大蕉
2018/02/05
6310
大数据计数原理1+0=1这你都不会算(四)No.52
InnoDB为什么要选择B+树来存储数据
关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树?
weylan
2021/11/09
1.9K0
好文 | MySQL 索引B+树原理,以及建索引的几大原则
注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。
Java技术栈
2019/05/07
1.1K0
好文 | MySQL 索引B+树原理,以及建索引的几大原则
63. 谈谈MySQL 索引,B+树原理,以及建索引的几大原则(MySQL面试第六弹)
MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。
用户11332765
2024/11/01
1020
63. 谈谈MySQL 索引,B+树原理,以及建索引的几大原则(MySQL面试第六弹)
It's Design——为什么MySQL使用B+树?
相信每一个后台开发工程师在面试过程中,都曾经被问到过“MySQL的默认存储引擎是什么?MySQL索引是什么数据结构?”这样的问题。相信准备充分(熟读八股文)的大家都能很容易的回答出“MySQL的默认存储引擎是InnoDB,MySQL索引使用的是B+树。”这样的答案。但是为什么当初写MySQL的程序员大叔要这样子来设计呢?
yuann
2021/04/15
9460
It's Design——为什么MySQL使用B+树?
数据库底层数据结构 B树B+树LSM树 详解对比与总结
我们熟知常用数据库MySQL MongoDB HBase等底层存储都用了各种树结构,如B树LSM树,不过为什么要用这些结构呢?
大鹅
2021/06/16
5.6K0
心里没点 B 树。。。
B 树和红黑树的动画小吴还在制作当中,比想象中的复杂好多好多好多,今天先来一个图解版的 B 树。。。
五分钟学算法
2019/05/23
6550
心里没点 B 树。。。
树概述
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,...,Tn,其中每个集合本身又是一棵树,并称为根的子树(SubTree)
码农戏码
2021/03/23
3640
B+树|MYSQL索引使用原则
‘’MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。
全栈程序员站长
2022/06/29
5050
B+树|MYSQL索引使用原则
MySQL数据库索引选择为什么使用B+树而不是跳表?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树!
小冷coding
2023/05/24
8570
MySQL数据库索引选择为什么使用B+树而不是跳表?
经典数据结构 [ B树,B+树 ]+B树的应用
关于B树的原理和实现方法,我也是研究了好久才看明白的,没明白之前感觉一脸懵逼,看懂后才发现原来也很简单。所以同学们要是发现很难看懂的情况下,不要烦躁着急,可以先冷静冷静的思考一下,然后多看几篇文章,我也是看了好几篇的文章才看懂的,要是大家看完之后还是不大懂的话,可以再文章最后联系我,加油!
林老师带你学编程
2019/05/26
6600
Mysql-为什么使用B+树
https://www.bilibili.com/video/BV1yT4y1w7FS?from=search&seid=1538805982597498566&spm_id_from=333.337.0.0
Get
2024/03/10
1810
数据结构 —— B树和B+树
​ 最近在学习数据库相关的知识,了解到数据库很多是采用B-/+树作为索引,例如Mysql的InnoDB引擎使用的B+树、MongoDB默认采用B树作为索引。
俺也想起舞
2021/12/24
8K0
数据结构 —— B树和B+树
B+树
学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?   这个要从几个方面来说了:
袁新栋-jeff.yuan
2020/08/26
5220
DS高阶:B树系列
        若接近有序的数据插入到BS中,会导致退化成单支树,时间复杂度退化为O(N)
小陈在拼命
2024/05/26
1130
DS高阶:B树系列
相关推荐
【63期】谈谈MySQL 索引,B+树原理,以及建索引的几大原则(MySQL面试第六弹)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档