数据结构——二叉树(四)

五:B树

首先补充一点,"B-树"就是“B树”,它们都是B-Tree的翻译,里面不是减号-,是连接符-。因为有人把B-Tree读成"B-树",让人误以为“B树”和"B-树"是两种树,实际上两者都是同一种树。还有,大家在读的时候千万不要读成“B减树”,读成“B树”就行了,不然就外行了。

下面开始今天正文,我们依然从数据库的检索开始,我们知道数据库的索引是使用树结构来实现的,是因为树的查询效率高,而且还可以保持有序的状态。上篇中讲到的二叉查找树效率就很高,但是为什么没有使用二叉查找树来实现索引呢?其实从算法逻辑上讲,二叉查找树的查找次数和比较次数都是最小的,但是我们必须还要考虑一个现实问题:磁盘的IO(磁盘读写)。

数据库的索引是存储在磁盘上的,当数据量非常大的时候,索引的大小可能有几个G甚至更多,当我们利用索引查询的时候显然不可能将整个索引全部加载到内存,正常的操作都是逐一加载每一个磁盘页,这里的磁盘页就对应着索引树的节点。

                                         

我们如果利用二叉查找树做索引结构,查找情形是什么样子的呢?假设树的高度是4,要查找的值是10。

                                

                             

磁盘IO的次是4次,即树的高度,最坏的情况就是磁盘IO的次数等于索引树的高度。既然如此,为了减少磁盘IO的次数,我们就需要把原来的“瘦高”树结构变得“矮胖”,这就是本文所要说的B-树的特征之一。

B-树(以下都称作B树)是一种多路平衡查找树,它的每个节点最多包含k个孩子,其中,k被称为B数的阶,k的大小取决于磁盘页的大小。

一个m阶的B树具备如下几个特征:

1、根节点至少有两个子女;

2、每个中间节点都包含k-1个元素和k个孩子,其中m/2<=k<=m;

3、每个叶子节点都包含k-1个元素,其中m/2<=k<=m;

4、所有的叶子节点都位于同一层;

5、每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分。

我们以一个3阶B树为例来看一下B树的结构,树中的具体元素和上面的二叉查找树是一样的。

                             

接下来我们来看一下B树的查询过程,看看会带来什么效果,假如我们要查询的数值是5

从上面我们看出,其实B树在查询中的比较次数并不比二叉查找树少,尤其当单一节点中的元素数量很多时。可是相对磁盘IO的速度,在内存中比较耗时几乎可以忽略,所以只要树的高度足够低,磁盘IO次数足够少,就可以提高查询性能。就算单个节点内元素多一点也没关系,仅仅是多了几次内存中的交互,可以忽略用时。其实说白了B树的优势和高效就是因为B树将一部分的IO负担到内存中来了,用内存的高效和强大提升了查询性能。



作者:Stephen_Xie
链接:https://www.jianshu.com/p/fd49b1510dfd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

六:B+树

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

一个m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

 

B-树中的卫星数据(Satellite Information):

B+树中的卫星数据(Satellite Information):

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

第一次磁盘IO:

第二次磁盘IO:

第三次磁盘IO:

B-树的范围查找过程

自顶向下,查找到范围的下限(3):

中序遍历到元素6:

中序遍历到元素8:

中序遍历到元素9:

中序遍历到元素11,遍历结束:

B+树的范围查找过程

自顶向下,查找到范围的下限(3):

通过链表指针,遍历到元素6, 8:

通过链表指针,遍历到元素9, 11,遍历结束:

B+树的特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

B+树的优势:

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值