数据结构之B,B+树

首先要说下B-树,B-树其实就是B树,网上的部分都是错的

B树为什么存在?

如果一个通过一个二叉树来查找,或许对在内存中的数据很方便,但是如果是对磁盘的数据那么利用率太低了,因为层数太高我们每一层都需要去磁盘取出信息,消耗io资源太大

那么我们就想出了B树:

让层数变的小,每层元素特别多,我们可以将多个元素视为一个整体。这样每次去磁盘取出的信息会特别多

注意叶子结点必须都在一层,而且根节点要么有大于两个要么没有,就像一个完全二叉树

       1.关键字集合分布在整颗树中;

       2.任何一个关键字出现且只出现在一个结点中;

       3.搜索有可能在非叶子结点结束;

       4.其搜索性能等价于在关键字全集内做一次二分查找;

       5.自动层次控制;

 

接下来说B+树:

上面的树有一种问题,问题在于当我们进行全局查询时,因为是一个二叉排序树 ,所以按序查询的结果需要中序遍历

那么我们先获取根节点的磁盘空间,然后得到左节点的磁盘空间输出,再获得根节点的磁盘空间输出,最后再获得右节点的磁盘空间输出,那么很消耗io资源,我们引入b+树:

       1.其定义基本与B-树同,除了:

       2.非叶子结点的子树指针与关键字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树

(B-树是开区间);

       5.为所有叶子结点增加一个链指针;

       6.所有关键字都在叶子结点出现;

我们增减一个链表。并且将非叶子节点的数据全部放入叶子结点,用链表链接叶子结点,

从最小关键字顺序遍历时:,直接通过链表即可得到全部

随机遍历时:像b树一样,但是这里的非叶子节点只是索引了,还是要遍历到最后的根节点去,取出相应的顺序,因为如果你随便选一个数字遍历(不是第一个关键字),我们找到了这个数字,当我们需要获得顺序时,再去它的子树遍历时发现子树已经有了这个关键字了,那么造成数据重复,会出错。

猜你喜欢

转载自blog.csdn.net/Sunmeok/article/details/81664641