B树 二叉树 B-Tree B+Tree 详解

要想知道B树,首先要了解二叉树(binary tree)

B树产生的原因:B树是一种查找树,这一类树(二叉树,红黑树等)最终生成的目的都是为了解决某一系统中,查找效率低的问题。B树也是如此,它最初启发于二叉查找树,二叉查找树的特点是每个非叶子结点都是只有两个孩子节点。然而这种做法会导致数据量非常大时,二叉查找树的深度过深,搜索算法根节点向下搜索时,需要访问的节点也就变得相当多。如果这些节点存储在外存储器中,每访问一个节点,相当于就是进行了一次I/O操作,随着树高度的增加,频繁的I/O操作一定会降低查询的效率。

二叉树:

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

特点:1.非叶子节点只能允许最多两个子节点的存在;

           2.每个非叶子节点数据(父节点)分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里的值是基于自己的算法规则而定义的,比如hash值);

           3.树的左右两边的层级树相差不会大于1;

           4.没有值相等重复的节点;

B树:

定义:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个)

特点:1.排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;

           2.子节点树:非叶子结点(根节点)的子节点数>1,且<=M,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);

           3.关键字:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数,如ceil(1.1)结果为2);

           4.所有叶子结点均在同一层、叶子结点除了包含了关键字和关键字记录的指针外也有指向某子节点的指针只不过其指针地址都为null对应下图最后一个节点的空格子;

备注:非叶节点是除了最下面没有分叉的节点如下图的AC-EF-HKL-RS-WXYZ,关键字是节点上的值(和二叉树节点上的值很类似)如下的字母就是

 下面根据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树是如何形成的了。

B-Tree:

定义:B-Tree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongnDB的索引技术就是基于B树的数据结构,B树也可以看作是最查找树的一种扩展。

一个m阶的B-Tree有以下性质:

1.每个节点最多有m个子节点
2.每个非叶子节点(根节点除外)至少含有m/2个子节点
3.如果根节点不是叶子节点,那么根节点至少有两个子节点
4.每个节点上,所有的关键字都是有序的,从左到右,依次从小到大排序
5.每个关键字的左子树的均值小于当前关键字,右子树的均值大于当前关键字
6.每个节点都存有索引和数据
7.对于一个非叶子节点而言,它最多能存储m-1个关键字
8.所有叶子节点位于同一层

B-树插入
对于一个m阶B树,新节点一般是插在叶子层,但是需要根据实际的情况考虑是否需要裂变。

    若该节点中关键码个数小于m-1,则直接插入
    若该节点中关键字个数等于m-1,则将进行分裂,以中间关键字为界点将节点一分为2,产生一个新的节点,并把中间那个关键字插入到父节点中,继续判断父节点的关键字个数是否等于m-1,依次判断是否分裂,最坏情况下可一直分裂到根节点,整个树增加一层。
B-树删除
B树的删除也非常复杂

      如果关键字所在节点的原关键树>=(m/2),说明删除后仍可满足B树的结构,可以直接pass掉。
      如果被删除后不再满足B树的结构,则需要一定的调整过程
      如果其左右节点中有多余的关键字,即与该节点相邻的节点中关键字的数目大于(m/2)-1,就会将节点中的最大(左)或者最小(右)移到夫节点上,然后将双方节点中小于(右节点上移)或者大于(左节点上移)关键字的关键字下移到被删关键字的节点中。
       如果其左右都没有多余关键字的时候,情况将变得非常非常复杂;需把删除关键字节点与其左(或者右)节点中的关键字合并到(父节点指向该删除关键字节点的左(右)节点的指针)所指向的左右节点中去,如果因此父节点中的关键字个数小于规定值,则需要对父节点做同样的处理,最坏情况下会使得整个树减少一层。

B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘块大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了很多,大大减少了数据查找和比较的次数,提高了效率。

B+Tree:

B+Tree中如果有N个关键字则会拥有n个分支,而B树中n个关键字的节点包含n+1个分支。

B+Tree中,每个非根节点中的关键字个数是>=( m / 2 )且 < =m,而B树是 >=(m / 2)-1且< = (m-1)。

  B+Tree中根节点的关键字个数是>=1且<=m,而B树是>=1且<=(m-1)。

  B+树是B树的一个升级版,因为B+Tree非叶子节点不存储关键字记录的指针,所以其相对于B树来说B+树更充分的利用了节点的空间,让查找速度更加稳定,其速度完全接近于二分查找。

   1.  B+树的非叶子节点不对关键字记录的指针进行保存,只进行数据索引,使得B+树非叶子节点能保存关键字的能力大大提升,而且树的层级会更少;
   2.  B+树叶子节点保存了其父节点的关键字记录的指针,所以每次查询必须到叶子节点才能真正获取到相关数据,而且平很多叉树的特点是所有子节点的层级相差不会超过一,所以查询速度相对是非常稳定的;
   3.  B+Tree树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针;
   4.  非叶子节点的子节点树=关键字数。

B+树插入
    插入操作全部在叶子节点中进行

    若为空树,创建一个叶子节点,然后将记录插入,同时这个叶子节点也是根节点
    若被插入的关键字所在的节点,其含有的关键字数目小于m,则直接插入
    若被插入关键字所在的节点的关键字数等于m的时候,则需要分裂为两个节点,并将m/2的关键字上移到父节点中,同时判断父节点的关键字个数是否大于m,如果需要分裂继续按照上面的流程进行分裂
B+树删除
    如果要删除关键字所在节点的关键字个数,如果大于m/2,直接删除即可;
    当删除关键字所在节点的关键字个数等于m/2的时候,若兄弟节点中含有多余的关键字,也可从兄弟节点中借用关键字完成删除操作;
    若兄弟节点没有多余的关键字,则需要与其他兄弟进行合并;
    如果合并后导致父节点不再符合B+树的结构,则需要按照上面的规律进行再次结构的调整;
    注意B+树的结构(非叶子节点会存储索引信息,叶子节点才会存储数据指针),修改完后还需修改其父节点中的索引值。
总结
    B+树的层级更少
    B+树查询速度更加稳定
    B+树天然具备排序功能,由于B+树所有的叶子节点数据构成了一个有序链表,在查询范围区间数据的时候会更加方便,数据紧密性很好高
    B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,而B树需要对每一层进行遍历,所以B+树更有利于全表扫描43

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值