【数据结构】B-/B+树的分析

首先B/B+树一般是用于索引结构中,用来在大量数据中快速定位查找到想要的数据。但是这种快速查找的数据结构很多,比如查找树,红黑树,那B-/B+树又有什么不同那,以致它被用在大量的数据中快速定位,而不是使用二叉查找树。对于红黑树可以查看文章底层的链接。

下面会进行解释,在解释之前首先向对B-/B+树是什么东西做一下简单介绍。

B+是B-(下午我们直接称B树,正确读法应该就是B树)的一种变种,主要的变化就是内部节点存储的数据的不同。

B树是一个这样的树:

《【数据结构】B-/B+树的分析》

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树,深度为m。它或者是空树,或者是满足下列性质的树: 1、根结点至少有两个子女; 2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ – 1 <= j <= m – 1;(┌m/2┐指的是向上取整)

3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故
内部子树个数 k 满足:┌m/2┐ <= j <= m ; 4、所有的叶子结点都位于同一层。

可以看出,它每个非根、非叶节点中会有很多个key,而每个key直接又有一定的规律从大到小排列。其存储的数据(n,P0,K1,P1,K2,P2,…,Kn,Pn),其中n关键字个数,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。也就说pi指针指向的一个节点中的所有数据都会小于Ki,很明显也会小于ki+1。这样在查找一个key会非常快。首先通过二分查找判断是否在当前节点中或者在本节点下面的某个子节点,然后递归查询,可以看出最大的查找深度为树的深度:log┌m/2┐((N+1)/2 )+1

可以看出B树是一种比较复杂的数据结构,对其进行插入和删除操作的时候还是需要对该数据结构按照其定义进行重新调整与维护。

其中B+树是B树的一种变种,其内部节点不在存储关键字数据而是存储下一个关键字的位置:

《【数据结构】B-/B+树的分析》

1.有n棵子树的结点中含有n个关键字。
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的非终端结点可以看成是索引部分,结点中仅含其每个子树(根结点)中的最大(或最小)关键字。有几颗子树就有几个关键字,

而该关键字是其对应的子树所含有的关键字中的最大。

  通过上图可以看到非叶节点不含有关键字信息,这样每个节点占据的大小就会小很多。这是非常重要的,因为在计算机中占据的存储很小,这样每次IO读取就会读取
更多的
节点进来。而IO和cpu的处理速度不是在一个数量级上,所以每次读取的节点数目越多,这样对处理时间就会更少。所以数据库文件一般都是采用B+树。

再深一步讲,为何读取更多 节点就可以减少IO次数那。是因为计算机中存在局部性原理,就是当用到一个地方的数据的时候,和其相邻的数据也会很快就会用到。这下就懂了吧。

  接着分析文章开头提出的问题,为何不是使用二叉查找树来快速定位。通过上面分析可以看到快速定位,最主要的就是按照树的一个分支进行向下查找,

所以能查找的深度越小,那么查找的速度肯定会越快。二叉查找树查找深度是log2N的,而B树是log┌m/2┐((N+1)/2 )+1,对于B+查找深度也是如此,

但是他每次能获取到的节点更多,一定程度上查找效率要高于B树,所以这就解决了为何不是使用二叉查找树。

再一次吐槽编辑器如此难用

红黑树详细介绍:http://blog.csdn.net/zwan0518/article/details/12219055

    原文作者:B树
    原文地址: https://blog.csdn.net/zwan0518/article/details/8854911
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞