数据结构之B,B+树的的索引

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

B树为什么存在?

1.如果一个通过一个二叉树来查找,如果是对磁盘的数据存取,那么利用率太低了,因为层数太高我们每一层只能取出一个结点信息,取多个会有多次io,消耗io资源太大

2.上面说的那种情况其实计算机已经有了解决办法叫做局部性原理:当我们就算只读一个字节的时候,其实会预读取(预读取的大小一般是页的整倍数)这个字节后面一定的长度,因为一般一个数据被用到时,它附近的数据也会被用到, 如果是二叉平衡树那种结构,它的附近的节点只是逻辑地址相同,物理地址并不一定相同,那么每次预读取会取得很多无用的数据,但是B/B+树每个节点一般设置为一个页的大小,这样每次读取只需要一次I/O即可。

那么我们就想出了B树:

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

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

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

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

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

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

       5.自动层次控制;

《数据结构之B,B+树的的索引》

 

接下来说B+树:

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

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

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

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

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

(B-树是开区间);

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

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

《数据结构之B,B+树的的索引》

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

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

随机遍历时:像b树一样,要从中根据大小一步一步找到相应的数据

当B+树进行查找时,它的所有数据都存在叶子结点,非叶子节点的数据也存在了非叶子结点,所以就算我们在非叶子节点找到了数据,但是还是要遍历到最低层去取得相应的数据。否则可能出现数据重复。

 

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