B树到B+树再到B*树

原创 2015年11月19日 17:03:36

有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树!

二,B树!

B树是为了减少磁盘IO操作或为了其它存储设备而设计的多路平衡查找树。与之前介绍的红黑树很相似,但在降低磁盘I/0操作方面要更好一些。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树,B*树来存储信息!(如关系数据库就是用的B+树索引)。

B树与红黑树最大的不同在于,B树的结点可以有许多子女,从几个到几千个。那为什么又说B树与红黑树很相似呢?因为与红黑树一样,一棵含n个结点的B树的高度也为O(lgn),但可能比一棵红黑树的高度小许多,应为它的分支因子比较大。所以,B树可以在O(logn)时间内,实现各种如插入(insert),删除(delete)等动态集合操作。

B 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下:

           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[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树中的每个结点根据实际情况可以包含大量的关键字信息和分支(当然是不能超过磁盘块的大小,根据磁盘驱动(disk drives)的不同,一般块的大小在1k~4k左右);这样树的深度降低了,这就意味着查找一个元素只要很少结点从外存磁盘中读入内存,很快访问到要查找的数据。

为了简单,这里用少量数据构造一棵3叉树的形式,实际应用中的B树结点中关键字很多的。上面的图中比如根结点,其中17表示一个磁盘文件的文件名;

假如每个盘块可以正好存放一个B 树的结点(正好存放2个文件名)。那么一个BTNode结点就代表一个盘块,而子树指针就是存放另外一个盘块 的地址。 下面,咱们来模拟下查找文件29的过程: 
    (1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】 
    (2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。 
    (3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】     

    (4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。 
    (5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】     

    (6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

分析上面的过程,发现需要3次磁盘IO操作和3次内存查找操作。关于内存中的文件名查找,由于是一个有序表结构,可以利用折半查找提高效率。至于3次磁盘IO操作时影响整个B树查找效率的决定因素。 
当然,如果我们使用平衡二叉树的磁盘存储结构来进行查找,磁盘IO操作最少4次,最多5次。而且文件越多,B树比平衡二叉树所用的磁盘IO操作次数将越少,效率也越高。

三,B+树!

B+-tree:是应文件系统所需而产生的一种B-tree的变形树。

一棵m阶的B+树和m阶的B树的差异在于: 
      1.有n棵子树的结点中含有n个关键字; (而B 树是n棵子树有n-1个关键字)       

      2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 
      3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)。

 
1)     为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?

1) B+-tree的磁盘读写代价更低 
B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 
    举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。

2) B+-tree的查询效率更加稳定 
由于非终端结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

四,B*树!

B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)!

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针!

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。 
所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

五,B树系列总结!

通过以上介绍,大致将B树,B+树,B*树总结如下: 

B树:有序数组+平衡多叉树; 
B+树:有序数组链表+平衡多叉树; 

B*树:一棵丰满的B+树。



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

GNS3 1.4.0b3 MSTP多生成树配置实验

一、实验目标   掌握MSTP多生成树配置,VLAN配置,trunk配置,etherchannel配置 二、实验平台   系统:WIN7以上windows,X64版本。CPU支持虚拟化指令,并在BIO...
  • shile
  • shile
  • 2015年10月22日 17:54
  • 3388

【算法总结】B+树的实现

【参考资料】 从B树、B+树、B*树谈到R 树 【B+树是什么】 b+树是b树的变种。b+树与b树最大的不同在于:b+树的关键字数量跟孩子节点数量一致,这与b树不一样。并且,b+树的叶子节点包含...
  • cdnight
  • cdnight
  • 2013年09月17日 15:21
  • 5083

数据结构课设--用B树实现图书管理系统

此文章是分享一下上学期数据结构课程的课程设计,我选择的是以B树为数据结构,开发一个图书管理系统,B树的优点在于查询快,增删结点相对于链表或者顺序表效率更好,因此用来存储大量图书信息更加合适。(开发环境...

ACMCLUB 问题 B : 二叉树问题

题目描述 现给定一棵二叉树的先序遍历序列和中序遍历序列,要求你计算该二叉树的高度。 输入格式 输入包含多组测试数据,每组输入首先给出正整数N(...

第15周项目3 - B-树的基本操作

#include #include #define MAXM 10 //定义B-树的最大的阶数 typedef int KeyType; ...

为什么mysql用B-树

红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构,这一节将结合计算机组成原理相关知识讨论B-/+Tree作为索引的理论基础。一般来说,索引本身也很大,不...

B树和hash的区别与联系

关系型数据库中,索引大多采用B/B+树来作为存储结构,而全文搜索引擎的索引则主要采用hash的存储结构,这两种数据结构有什么区别? hash结构的特点:检索效率非常高,索引的检索可以一次到位...
  • ranjea
  • ranjea
  • 2013年05月18日 18:20
  • 1942

算法#16--B树完整代码Java实现

为什么要引入B树?一种外部多路查找树。而红黑树查找需要将内容存入内存。...
  • tclxspy
  • tclxspy
  • 2016年09月14日 10:30
  • 1294

InnoDB存储引擎B+树索引介绍

一、InnoDB索引概述: InnoDB存储引擎支持B+树索引、哈希索引、全文索引和空间索引,后两种很少用到,本文主要介绍B+树索引。 B+树是从最早的平衡二叉树(AVL)演变而来,但是B+树不是...

InnoDB的B+树索引

B+树索引其本质就是B+树在数据库中的实现,但是B+索引在数据库中有一个特点就是其高扇出性,因此在数据库中,B+树的高度一般都在2~3层,也就是对于查找某一键值的行记录,最多只需要2到3次IO,这倒不...
  • dz45693
  • dz45693
  • 2017年11月28日 18:52
  • 100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:B树到B+树再到B*树
举报原因:
原因补充:

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