平衡二叉树B树B+树,B*树的区别
Posted IT工匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡二叉树B树B+树,B*树的区别相关的知识,希望对你有一定的参考价值。
平衡二叉树
定义:基于二分法的策略提高数据的查找速度的一种二叉树数据结构;
特点:平衡二叉树是采用二分法思想把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程遵循以下规则:
(1)非叶子节点只能允许最多两个子节点存在。
(2)每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里值是基于自己的算法规则而定的,比如hash值);
平衡树的层级结构:因为平衡二叉树查询复杂度和树的层级(h高度)成反比,h值越小查询越快,为了保证树的左右两端数据大致平衡以降低二叉树的查询难度一般会采用一种算法机制实现节点数据结构的平衡,实现了这种算法的有比如AVL、Treap、红黑树等,使用平衡二叉树能保证数据的左右两边的节点层级相差不会大于1,这样可以避免树形结构由于删除增加变成线性链表进而影响查询效率。保证数据平衡的情况下查找数据的速度近于二分法查找。
总结平衡二叉树特点:
非叶子节点最多拥有两个子节点;
非叶子节值大于左边子节点、小于右边子节点;
树的左右两边的层级数相差不会大于1;
没有值相等重复的节点;
B树
定义:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构(今天数据库课上刚学到的)。
规则:
排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
子节点数:非叶节点的子节点数>1,且<=M (M>=2),空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);
关键字数:枝节点的关键字数量大于等于
ceil(m/2)-1
个且小于等于M-1
个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);
示意图如下图所示,这里假设字母的排序规则为A>B>C…:
如上图我要从上图中找到E,查找流程如下
获取根节点的关键字进行比较,当前根节点关键字为M,E<M,所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);
拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点;
拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);
B+树
概念:B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别。
规则:
B+跟B树不同之处在于B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
非叶子节点的子节点数=关键字数,另一种规则是非叶节点的关键字数=子节点数-1,虽然这两种规则数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现;
特点:
1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
B*树
规则:B*树是B+树的变种,相对于B+树他们的不同之处如下:
(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b*树的初始化个数为(cei(2/3m))
(2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;
特点:
在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;
总结
1、相同思想和策略
从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法和数据平衡策略来提升查找数据的速度;
2、不同的方式的磁盘空间利用
不同点是他们一个一个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的;
以上是关于平衡二叉树B树B+树,B*树的区别的主要内容,如果未能解决你的问题,请参考以下文章
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...