大白话btree和b+tree

简介: 大白话btree和b+tree

引语

作为一直后端程序猿,经常会看到好几个关于树的概念,平衡二叉树,二叉搜索树,avl树,btree,b+tree等等。没有弄清楚的时候,放到一起很容易弄混。今天咱们就来捣鼓捣鼓这几个名词,理解一下它们都是啥。本文会从二叉树由浅入深介绍到b+tree,对于不同的树的插入删除先不谈,主要用于帮助不清楚概念的童鞋理解这些名词代表的什么样的数据结构,暂不涉及红黑树(这玩意要写起来篇幅有点长,下次可以单独出一篇)。

树:

首先咱们来看看最基本的定义,之后讲的所有种类的树都是属于树这个大类里面:
树(tree)是包含n(n>=0)个结点的有穷集,其中:
(1)每个元素称为结点(node)
(2)有一个特定的结点被称为根结点或树根(root)
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。

然后一些树的基本概念(默认大家都学过了,不过照顾一下真没看过的列了几个简单的概念在下面,不会的请百度了解下):

根节点:最顶层的节点,没有任何父节点的节点,通俗来说是树最顶上那一个节点

度:一个节点拥有子树的数量,通俗来说就是一个树的节点有多少个分支,度就是多少

叶子节点:度为0的节点就是叶子节点,通俗来说就是一棵树最下面的部分,没有分支的节点都是叶子节点

树的高度或深度:树中结点的最大层次,通俗来说就是一棵树有几层,按节点来算

树的度:一棵树中,最大的结点的度称为树的度,通俗来说就是一棵树中分支最多的那个节点度是多少,树的度就是多少,图中树的度就是3,因为最大的度是C节点,有三个分支

子树:每一个节点下的部分都是一颗子树,它也符合树的定义,比如图中T1,T2

二叉树:

这个基本上没啥大问题,树的度不超过2的就是二叉树,图中B,C都是度最大的节点为2

二叉搜索树:

有的书上也叫查找树,binary search tree,搜索树,查找树是同一个东西哦。属于二叉树,特征在于在二叉搜索树中,左子树中所有节点的值小于根的值,右子树中所有节点的值大于或等于根的值,
并且对于任意节点都符合这个规则。

二叉搜索树的优点如同它的名字一般,方便搜索,搜索一个元素的时间复杂度是o(logn),最坏的情况是全部遍历才找到该元素时间复杂度是o(n)。

平衡二叉搜索树:

avl树也是一棵二叉搜索树,只是它的名字过于特殊了,avl树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,取简称叫avl树。
因为它这个名字,我经常忘记它是平衡二叉搜索树,我是用联想的方法记住的,读者们可以试下看有效果没。avl 我联想的是一颗(A)用来搜索的平衡(V是左右对称的)的二叉树(L是两个分支,一横一竖)
。把这句话给记住了,在看avl三个字母的时候就能联想知道它代表的是啥了。
然后看看它的特点是:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,avl树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
一棵树如果是这样:

它是一颗二叉搜索树,符合定义,但是元素如果在13->9这个子树上,查询效率和链表差不多,这就因为这个数它不平衡,左右子树额高度差太多
,查询起来的效率就比较低。所以avl树诞生了,每个节点的左右子树高度差都不超过1。如图和上面的二叉搜索树的图都是avl树,都是平衡的。

btree:

首先这里说清楚一点,很重要,btree和b-tree是同一个东西。之前有很多人按照读音来都以为是B树,B减树(可能是受了B加树的影响,实际上没有B减树,那只是一个短横是一种写法,实际上就是btree)。好了,
咱们知道了avl树是二叉平衡搜索树,那么btree就好讲了。
btree是多路平衡搜索树,和avl相比它不是二叉的,而是多叉的,有很多个分支,M阶的btree就是树的度是M,最多有M个分支。
1.根节点至少两个子节点
2.每个非叶子节点且不是根节点的至少有m/2个
3.每个节点最多不超过m个孩子
4.所有的叶子节点都在同一高度
5.每个非叶子节点由n个key和n+1个指针构成,并且[ceil(m/2)-1]<=n<=m/2 (这里ceil是向上取整的意思)
这些定义不用死记,咱们可以结合实际来理解下,这是我从网上找的一张4阶的bree,因为自己真滴懒,画起来好麻烦

好,咱们看图

对照上面的规则,1-4应该都没啥问题,第5条M是4,n算出来1<=n<=2,指针是2-3个,1-2个key,key就是图中有数值的方框,指针就是白色的方框。

优势:
因为btree主要也是用来搜索数据,它和二叉搜索树相比,是多叉的所以相同的数据量的情况下,它的树高会更低,如果是二叉树,找到一个数据不再某一个
子树树越高,查询的次数就越多,多路降低了树高,提升了查找效率。

b+tree:

了解了btree之后啊,理解b+tree又简单了一些,根据名字咱们就知道它们长得很像,除了b+tree多一个+。b+tree其实是btree的优化版本。
有没有玩过大家来找茬?看看和btree有几处不同之处.

聪明的你应该找到了答案,答案是5处。是的,没错,全是指针的不同。

所以b+tree的这个加咱们可以理解为叶子节点的指针加上了,而且b+tree详细的数据只放在叶子节点上,非叶子节点只是保存的索引(想一想mysql的聚簇索引和非聚簇索引,是不是很熟悉的感觉?可以看看我的另一篇博客:mysql的聚簇索引和非聚簇索引)。

为啥要加个叶子节点间的指针呢?如果用过mysql咱们知道,innodb里面支持两种索引,一种是hash,
一种是btree,这里的btree实际上就是用的b+tree。咱们知道mysql索引搜索的时候会有范围搜索,如果是找某个范围的数据,btree是不是得从根节点查询几次,每次遍历到叶子节点,才能知道数据有多少?
但是b+tree就不一样,所有叶子节点都有指针相连,是不是直接按照指针依次找过来就可以了?是的,这就是b+tree的优势。

从网上摘了一下区别,可以自行理解一下:
区别:
B树
1.搜索键无法重复存储。
2.数据可以存储在叶节点以及内部节点中
3.搜索某些数据是一个较慢的过程,因为可以在内部节点和叶节点上找到数据。
4.删除内部节点非常复杂且耗时。
5.叶节点不能链接在一起。 叶节点链接在一起以使搜索操作更有效

B+树
1.可以存在冗余搜索键。
2.数据只能存储在叶节点上。
3.搜索速度相对较快,因为只能在叶节点上找到数据。
4.删除永远不会是一个复杂的过程,因为元素将始终从叶节点中删除。

后记:

1.看完文章知道了树,二叉树,二叉搜索树,avl树,btree,b+tree的概念和特性,应该对这些树有了一个大致的了解吧
2.但是其实这里面还有很多可以继续深入的地方,比如btree,b+tree增删改查是怎么操作的?
还有红黑树的概念和操作,这里面其实也有很多内容可以讲。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 关系型数据库 数据库
BTree与B+Tree图文详解
B树与B+树区别
2466 0
BTree与B+Tree图文详解
|
关系型数据库 MySQL 数据库
MySQL的delete误操作的快速恢复方法
如果我们在数据库中不小心执行了类似“delete from t1”这样的不带where条件的语句,那么整张表的数据就全被删除了,如何在最短的时间恢复被删除的数据就显得十分关键。下面来演示如何通过binlog来快速恢复表数据。
16443 0
MySQL的delete误操作的快速恢复方法
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2713 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
关系型数据库 MySQL 索引
MySQL in 太多的解决方案
MySQL in 太多的解决方案
1824 0
|
Ubuntu Linux
通过命令行重启Ubuntu的3种方法
也可以直接用于关闭系统:
2080 0
|
SQL 关系型数据库 MySQL
JOIN顺序优化:小表驱动大表的执行原则
在数据库查询优化中,“小表驱动大表”是一种提升SQL查询效率的常用策略。其核心思想是优先处理数据量较小的表,再与大表进行连接操作,从而减少数据扫描量、降低I/O开销并提高内存使用效率。通过显式指定JOIN顺序、使用EXISTS替代IN以及合理创建索引等方式,可以有效实现该原则。例如,在连接部门表(小表)和员工表(大表)时,先处理小表可显著提升查询性能。掌握这一原则有助于编写高效SQL语句,优化数据库整体表现。
1089 0
|
存储 数据库 索引
B-Tree和B+Tree的区别及各自的优势
B-Tree和B+Tree的区别及各自的优势
1349 0
|
存储 SQL 缓存
一文带你了解MySQL之Adaptive Hash Index
在InnoDB体系架构图的内存结构中,还有一块区域名为:Adaptive Hash Index,翻译成中文:自适应哈希索引,缩写:AHI,它是一个纯内存结构,我们今天就来了解它。
3705 0
|
NoSQL 中间件 Java
字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?
45岁老架构师尼恩在其读者交流群中分享了关于CAP定理的重要面试题及其解析,包括CAP定理的基本概念、CAP三要素之间的关系,以及如何在分布式系统设计中权衡一致性和可用性。文章还详细分析了几种常见中间件(如Redis Cluster、Zookeeper、MongoDB、Cassandra、Eureka、Nacos)的CAP特性,并提供了高端面试技巧,帮助读者在面试中脱颖而出。尼恩还推荐了其团队编写的《尼恩Java面试宝典PDF》等资料,助力求职者准备面试,提升技术水平。