平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了

平衡二叉树

  • 概念

平衡二叉树是基于二分法的策略提高查找速度的二叉树的数据结构

  • 特点:

平衡二叉树采用的是二分法的思维把数据按规则组装成一个树形的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:

1.非叶子节点只能允许最多两个节点存在
2.每个非叶子节点数据分布规则为左边的子节点小于当前的节点值,右边的子节点大于当前节点值(这里的值基于自己的算法规则而定,比如hash值)

在这里插入图片描述

平衡树的层级结构:因为平衡树查询性能和树的层级(h高度)成反比,h值越小查询越快,为了保证树的结构左右两端数据大致平衡降低二叉树的查询难度一般会采用一种算法机制实现节点数据结构的平衡实现了这种算法的有比如Treap(指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树),红黑树,使用二叉树能保证数据的左右两边的节点层级相差不会大于1,通过这样避免树形结构由于删除增加变成线性链表影响查询效率,保证数据平衡的情况下查找数据的速度近与二分法查找。在这里插入图片描述
总结平衡二叉树特点:

  • 非叶子节点最多拥有两个子节点
  • 非叶子节值大于左边子节点,小于右边子节点;
  • 树的左右两边的层级树相差不会大于1
  • 没有值相等的重复节点
拓展:

叶子结点:一颗树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。叶子是指度为0的结点,又称为终端结点。
度分为三种:

树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度:树中最大的结点度

相关术语:

数的结点(node):包含一个数据元素及若干指向子树的分支
孩子结点(chid node):结点的子树的跟称为该结点的孩子
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
祖先结点: 从根到该结点的所经分支上的所有结点
子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层

B树(B-tree)

  • 概念:

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);
  • 所有叶子节点均在同一层,叶子节点除了包含了关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为nil对应下图最后一层节点的空格子;

最后我们用一个图和一个实际的例子来理解B树(这里为了理解方便我就直接用实际字母的大小来排列C>B>A)在这里插入图片描述

  • B树的查询流程:
    如上图我要找图中E字母,查找流程如下:
    1.获取根节点的关键字进行比较,当前根节点关键字为M,E<M(26个字母顺序),所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的节点,右边放大于当前节点值的节点);
    2.拿到关键字D和G,D<E<G所以直接找到D和G中间的节点
    3.拿到E和F,因为E=E所以直接返回关键字和指针信息(如果树结构里面没有包内含所要查找的节点返回null)
  • B树的插入节点流程
    定义一个5阶树(平衡5路查找树),现在我们要把3,8,31,11,23,29,50,28这些数字构建出一个5阶树出来;
    遵循规则:
    1.节点拆分规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须<=5-1(这里关键字数>4就要进行节点拆分);
    2.排序规则:满足节点本身比左边节点大,比右边节点小的排序规则

先插入3,8,31,11
在这里插入图片描述
再插入23、29

在这里插入图片描述
再插入50、28

在这里插入图片描述

  • B树节点的删除
    1.节点合并规则:当前是要组成一个5路查找树,那么此时m=5,关键字必须大于等于ceil(5/2) (这里的关键字数<2就要进行节点合并)
    2.满足节点本身比左边节点大,比右边节点小的排序规则;
    3.关键字数小于二时先从子节点取,子节点没有符合条件时就向父节点取,取中间值往父节点放在这里插入图片描述
  • 特点:
  • B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是B树应该用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每一块的大小为4k,每次IO进行读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘块大小范围;把树的节点关键字增多后树的层级比原来二叉树少了,减少数据查找的次数和复杂度

B+树

  • 概念

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。

  • 规则

1.B+树跟B树不同B+树的非叶子子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子子节点所保存的关键字大大增加;
2.B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须到叶子节点才能获取到,所以每次数据查询的次数都一样;
3.B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针
4.非叶子节点的子节点数=关键字数在这里插入图片描述

  • 特点

1.B+树的层级更少:相较于B树B+树每个非叶子节点存储的关键字数更多,树的层级更少,所以查询数据更快
2.B+树查询速度更稳定:B+树所有关键字数据地址都存在叶子节点上,因此每次查询次数都相同,所以查询速度要比B树更稳定
3.B+树天然具备排序功能:B+树所有的叶子节点数据构成了有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高
4.B+树全节点遍历更快:B+树遍历整颗树只需要遍历所有叶子节点即可,而不需要像B树一样需要对每一层进行遍历,这样有利于数据库做全表扫描

B*树

  • 规则:
    B*树是B+树的变种,相对于B+树他们的不同之处如下:

(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是ceil(m/2),b树的初始化个数为(ceil(2/3m))
(2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;

  • 特点:

在这里插入图片描述
在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;

总结

  • 相同的思想策略

从平衡二叉树,B树,B+树,B*树总体来看它们的贯彻思想是相同的都是才用二分法和数据平衡策略来提升查找数据的速度

  • 不同的方式的磁盘利用

不同点是他们一个个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的

原文链接

如果还没理解的话推荐以下资料描叙的很详细:
二分法查找原理
从B树、B+树、B*树谈到R 树
BTree和B+Tree详解
B树和B+树的插入、删除图文详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值