B树与B+树

本文简单介绍B树和B+树的概念,以及它们有何区别,还有各自的适用场景。

一. B树

  1. B树的定义

B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。最坏查找情况是查完整个树的深度。

  1. B树的特点

如下中的M表示阶数:

  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 除根节点外的其它节点至少有M/2个子节点
  1. B树示意图

下图是一个M=4阶的B树:

avatar

二. B+树

  1. B+树的特点

B+树是对B树的一种变形树,它与B树的差异在于:

  • 有k个子结点的结点必然有k个关键码;
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
  1. B+树示意图

avatar

三. B树和B+树的区别

B树和B+树的区别示意图:

avatar

  1. 本身数据结构上的区别

A. 关键字数量不同:B+树分支结点M个关键字,叶子节点也有M个;B树分支结点则存在 k-1 个关键码

B. 数据存储位置不同:B+树数据存储在叶子结点上;B树存储在每个结点上

C. 查询不同:B+树是从根节点到叶子节点的路径;B树是只需要找到数据就可以

D. 分支节点存储信息不同:B+树存索引信息;B树存的是数据关键字

  1. 性能上的区别

A. B+树的层级更少:相较于B树B+树的每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;

B. B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;

C. B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

D. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

E. B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。

四. 应用场景

  1. B树和B+树存在的意义

二叉查找树的时间复杂度是O(logN),效率已经足够高。为什么出现B树和B+树呢?当大量数据存储在磁盘上,进行查询操作时,需要先将数据加载到内存中(磁盘IO操作),而数据并不能一次性全部加载到内存中,只能逐一加载每个磁盘页(对应树的一个节点),并且磁盘IO操作很慢,平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。为了减少磁盘IO的次数,就需要降低树的深度,那么就引出了B树和B+树:每个节点存储多个元素,采用多叉树结构。这样就提高了效率,比如数据库索引,就是存储在磁盘上,采用的就是B+树的数据结构。

  1. B树应用场景

B树大量应用在数据库和文件系统当中。
它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。B树算法减少定位记录时所经历的中间过程,从而加快存取速度。

  1. B+树应用场景

B+树应用于数据库的索引中,例如MySQL使用B+树作为索引。

坚持原创技术分享,您的支持将鼓励我继续创作!

------本文结束 感谢您的阅读------