B树与B+树

原创 2015年07月09日 17:20:05

二叉搜索树、平衡二叉树、红黑树都属于二叉树,由于每个节点只有一个元素,每个节点只能连接两个节点。对于像文件系统、数据库这样需要数目庞大读写删除操作,如果采用这种数据结构将会大大降低系统的效率,遇到I/O读写的瓶颈。

有没有一种数据结构可以降低往返于节点之间的次数呢?答案是有的,就是B树。什么是叫B树呢?和二叉树有啥区别呢?

了然于心二叉树的劣势,这个B树每个节点必然不是只是含有一个节点了,可以进行多路查找,B树是一种平衡的多路查找树。下图就是一颗B树


一个m阶的B树,满足以下性质:

1、非叶子节点至少有两个子树,最多m个子树;

2、非根的分支节点,有k-1个键值,有k个子树,并且按照升序进行排列。每一个叶子节点均含有k-1个元素。这里的([m/2]<k<=m),这里的m/2需要向上取整;

3、所有的叶子节点位于同一层次;

4、每一个节点含有键值、指向子树指针等相关的信息。

提到B树,既然是一颗树,就对树的元素的插入与删除比较感兴趣。

插入过程:

首先是在恰当的叶子结点中添加关键码,如果该结点中关键码不超过m-1个,则插入成功。

否则要把这个结点分裂为两个。并把中间的一个关键码拿出来插到结点的父结点里去。父结点也可能是满的,就需要再分裂,再往上插。

最坏的情况,这个过程可能一直传到根,如果需要分裂根,由于根是没有父结点的,这时就建立一个新的根结点。

插入可能导致B树朝着根的方向生长。

下面以一棵阶数为3的B树为例,说说B树的插入与删除的过程,此过程中每次的插入或者删除都要调整B树使得满足B树的几个条件。





节点的删除过程(红色标记的为待删除的节点)如下:


以上为3阶B树的插入删除过程的一个例子,可以在此基础上进行体会。在实际的生产中一般B树的阶数很大,具体的删除规则与此类似。

B树使用最多的场景是文件系统与数据库,必然涉及到查找。那么一个含有n个元素,m阶的B树的最大深度是多少?

第一层含有1个节点;

第二层至少有两个节点,由于分支节点至少含有[m/2]个节点。

第三层至少有2*[m/2]个节点;

第四层至少有2*[m/2]*[m/2];

以此类推。。。

第k层至少有个节点;

则叶子层k+1层有个节点。

查找不成功的次数为n+1。则有如下结果:


所以含有n个关键元素的m阶B树的深度最大为:


下面看B树的另一种方式B+树。

首先看下B+树的形式:


观察此树每个节点的内容可以看出,子节点包含父节点的所有关键字。所以所有的叶子节点包含全部的关键字信息。


所以B+树相对于B树的变化的情况是:

有n棵子树的节点含有n个关键字;

所有的叶子节点含有所有的关键字,以及指向包含这些关键字记录的指针,叶子节点本身的关键字自小到大依次排列;

所有分支节点都看成是索引,节点中仅仅含有其子树中最大或者最小的关键字。


看了B树与B+树的不同,在进行查找的时候,利用B树需要频繁地往返于每个节点之间,这就意味着,我们必须经过多次的访问才能得到结果,每次遍历的时候可能要频繁经过某个节点,这降低了查找的性能。而B+可以解决重复访问节点的问题。


B+树查找的时候,如果从根节点开始遍历查找关键字,在节点处查找到结果,这个也只是用以索引,不是真实的访问记录,还是要遍历到叶子节点才结束;若从小到大查找,只需要从叶子节点的最左端开始,顺序遍历就可以得到。


B+树的一缺点:B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。解决B+树这一问题可采用LSM树,即Log-Structured Merge-Trees。其中Hbase中就利用LSM,感兴趣可以多查查LSM树相关的知识,这里就不再赘述。

版权声明:本文为博主原创文章,未经博主允许不得转载。

B树

常见的动态查找树有:二叉查找树(BST)、平衡二叉查找树(AVL)、红黑树(RB-Tree)、B-tree/B+-tree。   由于前面三种树都属于二叉树,因此树的高度为(log2N)。树查找的时...
  • u012658346
  • u012658346
  • 2016年04月26日 18:48
  • 5168

红黑树和B树应用场景总结

红黑树和B树应用场景有何不同? 2者都是有序数据结构,可用作数据容器。 红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。 B树多用在内存里放不下,大部分数...
  • benpaobagzb
  • benpaobagzb
  • 2016年03月04日 21:50
  • 5455

B树与B+树的区别

B树: B+树: 结构上 B树中关键字集合分布在整棵树中,叶节点中不包含任何关键字信息,而B+树关键字集合分布在叶子结点中,非叶节点只是叶子结点中关键字的索引;B树中任...
  • Random__Walker
  • Random__Walker
  • 2016年07月28日 08:35
  • 1055

B树、B+树的区别

一、B树 1、B树的定义 B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件: (1)每个结点至多有m个子结点; (2)除根结点和叶结点外,其它每个结...
  • yangshuangtao
  • yangshuangtao
  • 2015年09月27日 14:51
  • 3581

各种B树之比较

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针...
  • oceansw
  • oceansw
  • 2017年09月27日 16:52
  • 36

B树简单理解

平衡二叉排序树便于动态查找,因此用平衡二叉排序树来组织索引表是一种可行的选择。当用于大型数据库时,所有数据及索引都存储在外存,因此,涉及到内、外存之间频繁的数据交换,这种交换速度的快慢成为制约动态查找...
  • u013782203
  • u013782203
  • 2016年07月21日 13:16
  • 4602

B树,B-树和B+树的区别

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针...
  • zwz2011303359
  • zwz2011303359
  • 2017年03月18日 17:26
  • 3142

B-树详细分析及B树B-树B+树B*树概念

B- 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。 B- 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的...
  • guanyasu
  • guanyasu
  • 2016年12月03日 11:04
  • 646

二叉查找树,B树,B+树,B*树

原文: http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
  • chj90220
  • chj90220
  • 2014年06月13日 15:20
  • 1218

B树、B-树、B+树、B*树都是什么

B树、B-树、B+树、B*树都是什么         今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会...
  • qq_23217629
  • qq_23217629
  • 2016年09月12日 08:46
  • 331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:B树与B+树
举报原因:
原因补充:

(最多只允许输入30个字)