树的遍历之B树及其变种

1.基本概念

1.1.B树的引进

我们发现,之前的二叉树、AVL,2-3树…这些树每一个节点所存储的数值量就只有一个,而这个数据量(键值)的目的是进行比较的,因为结合了数组和链表的操作,所以在进行排序的时候非常的方便。但是这种数据结构在数据库中查找数据或者是说对大容量设备,比如磁盘,SD卡,并不起作用。因此,B树诞生了。B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树。也就是说B树中每一个节点所包含的键值数量比较多, 而它的作用不仅仅是为了比较大小,而是当作索引,用作方向标,一层一层地递推指向数据最后的数据存储位置。也可以把B树当做是2-3树的加强版!

你会发现B树的实现确实是将B树中的键值用作比大小的对象,但是实际上远远不至于比大小,像文件系统的分类,磁盘设备的管理都可以用B树以及变种,那么B树中的键值可以把它当作方向标,当作索引来看。

1.2.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[3],…,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树(可能有部分人会习惯上把B-树读为B减树,其实并不存在B减树,只是读法上的不同而已),B就是balanced,平衡的意思。B-树就是指的B树,特此说明一下。

1.3.B树的举例

在这里插入图片描述

上图所示就是一副M等于3的B树。

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果

命中则结束,否则进入查询关键字所属范围的儿子结点。重复,直到所对应的儿子指针为

空,或已经是叶子结点;

B-树的特性:

  • 关键字集合分布在整颗树中
  • 任何一个关键字出现且只出现在一个结点中
  • 搜索有可能在非叶子结点结束
  • 其搜索性能等价于在关键字全集内做一次二分查找
  • 自动层次控制;

2.B+树

B+树是B-树的变体,也是一种多路搜索树:其定义基本与B-树相同,除了:

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

  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)

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

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

在这里插入图片描述

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+树的特性:

  1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的

  2. 不可能在非叶子结点命中

  3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层

B+树的意图非常的明显,直接就是把键值当作成方向标

3.B*树

B*树是B+树一种变形,它是在B+树的基础上,将索引层以指针连接起来,使搜索取值更加快捷。

在这里插入图片描述

B*树的作用我觉得就是在相邻节点中有一个索引方向,方向也是按照升序的方式,这样的话对数据的操作灵活性更强了。

4.总结

B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点, 所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值