B树和B+树

概述

这篇文章主要将一下B树和B+树的结构,性质,特点以及应用场景。


什么是B树

B树是一种平衡的多路查找树,它和平衡的二叉查找树的区别在于B树的一个节点可以有多个键值存在,也就是有多个链接存在,B树中节点最大的孩子数目称为B树的阶。到这里大家可能会发现其实2-3树,2-3-4树等都是B树的一种实例,2-3树是3阶B树,2-3-4树是4阶B树。

B树的性质

一个m阶的B树具有如下属性:

  • 如果根节点不是叶节点,则至少有两棵子树
  • 每一个非根的分支节点都有k-1个元素和k个孩子,其中(m/2)<=k<=m,每一个叶子节点n都有k-1个元素,其中(m/2)<= k<=m
  • 所有叶子节点都位于同一层次
  • 每个节点都有n个关键字,节点起始位置处存放数据n表明该结点的关键字个数,n个关键字由小到大依次排列;n+1个链接,在一个关键字右侧的链接上的关键字都大于该关键字,左侧的链接上的关键字都小于该关键字

B树的增删查

在B树上查找的过程是一个顺时针查找节点和在节点中查找关键字的交叉过程,因为一个节点中可能含有多个关键字。使用上面这幅图来距离B树查找一个关键字7的过程:先在根节点中查找,发现3,5,8不含7但是7在5和8之间,于是锁定了A2节点,再在A2节点中查找关键字7,成功找到。其实多叉查找树和二叉查找树的查找思想都是一样的,只不过多叉查找树的一个节点中可能包含有多个关键字,而二叉查找树的一个几点只会有一个关键字。

往B树中插入一个节点的过程其实和往2-3树种插入一个节点的过程是大致相同的,只不过B树的阶数可能会很大。还是用上面的图来举例,现规定该树是一个4阶的B树,当我们要往树中插入关键字10的时候,先对其进行未命中的查找,结果会落在A3所指的节点上,此时节点上面只有一个关键字为9,由于阶数还未达到4阶,所以直接将10插入到该节点中去。如果待插节点的阶数已是4阶,那么我们先构造一个临时的5阶节点将其插进去,然后提取出当前节点中最小的一个关键字,将其插入到父节点中,依次类推,直到根节点。如果根节点的阶数也是4阶,那么就将根节点分解为两层,再将树高加1.

删除B树中的一个节点时,我们用一幅图来说明,我们可以看到不论我们删除哪个节点,都必须保证B树的完美平衡性。


什么是B+树

B+树是B树的变形树,在B树中,每个关键字只会在树中出现一次,有可能在叶子节点上,也可能在分支节点上。而B+树中,出现在分支节点中的元素会被当作它们在该分支节点位置的中序后继者再次列出。除此之外,B+树和B树的一个很大的不同在于B+树中的每一个叶子节点都会保存一个指向后一叶子节点的指针。下图就是一棵B+树的示意图,灰色关键字即是根节点中的关键字在叶子节点中再次列出。

B+树的性质如下:

  • 有n棵子树的节点中包含有n个关键字
  • 所有的叶子节点包含全部关键字的信息,以及指向含有这些关键字记录的指针,叶子节点本身依关键字的大小自小而大顺序链接
  • 所有分支节点可以看成是索引,节点中仅含有其子树中的最大关键字

B树的应用场景

B树和B+树的应用场景应该说在绝大多数情况下和数据在磁盘中的存储有关。我们通常用B树或者B+树来记录数据在磁盘中的位置。众所周知,如果内存与外村交换数据次数频繁,那么会造成特别低的效率,那么B树是如何做到减少磁盘的I/O次数的呢?

我们经常用的硬盘是将所有的信息分割成相等大小的页面,而操作系统在读写硬盘的时候都是以页面为单位来进行的。在一个典型的B树应用中,要处理很大的磁盘数据,因此无法一次性全部装入内存。那我们就使B树的阶数与硬盘的页面大小相匹配,当一棵B树的阶数为1001,高度为2时,它可以存储超过10亿个关键字,我们只要让根节点保留在内存中,那么在这棵树上寻找一个关键字,至多需要两次硬盘的读取即可。通过这种方法在有限内存的情况下,每次访问磁盘我们都可以获得最大数量的数据,由于B树每节点可以具有比二叉树多得多的元素,所以它们减少了必须访问节点的数据块的数量,从而提高了性能。

B树的缺陷

尽管B树有很多的好处,但是它还是有缺陷的。在B树的结构中,我们访问一个节点也就意味着一次磁盘I/O。如下图,当我们要遍历这棵B树时,顺序是这样的:页面2,页面1,页面3,页面1,页面4,页面1,页面5。而且我们每经过一个节点都要遍历其中的数据,这些不必要的操作非常的损耗性能。

B+树的优势

因为B树这些缺陷的存在,我们在它的基础上进行改进,创造了B+树。由于B+树的特有性质:出现在分支节点中的元素会被当作它们在该分支节点位置的中序后继再次列出,而且每个叶子节点都会保存一个指向后一叶子节点的指针。这样的数据结构最大的好处在于,当我们需要从最小关键字进行从小到大的遍历时,我们可以从最左侧的叶子节点出发,不经过分支节点,而是沿着指向下一叶子的指针就可以遍历所有的关键字。这种结构对于范围查找有着与生俱来的优势。


总结

本文粗略的介绍了B树和B+树的结构,特性,和一些应用场景。基于B+树的这种优势,mysql的innodb存储引擎就是使用的B+树索引类型,并且取得了不错的效果。本文部分内容摘自程杰的《大话数据结构》。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值