B+ B-树

定义:

1、根结点至少有两个子女;
2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;(数据项的个数比子节点个数少1)
3、除根结点以外的子节点的个数:┌m/2┐ <= k <= m ;
4、所有的叶子结点都位于同一层。

PS:m是阶数

查找:类似二叉查找树

插入:插入类似23查找法
先插入 然后将中间的元素冒泡到父节点,然后将剩下的分裂为两个子节点

插入图解参考资料:
http://www.cnblogs.com/nullzx/p/8729425.html

B树其实是23查找树的一种拓展 数据项跟子节点个数

B+树
B树的一种变形树

非叶结点存放索引信息,数据信息存放在叶结点中。
所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录

B树跟B+树的区别

B+树数据都存放在最底层,因此每次都需要到底层去取数据,如果是靠近根节点的数据,B树取的最快

扫描二维码关注公众号,回复: 6192620 查看本文章

B+树,因为数据都在底层并且有相关链接,数据比较密集,磁盘数据加载的时候会预先读取一部分数据存放在缓存里,缓存命中率会比较高,因为
有很大的可能会去查询本次查询附近的数据
而B树 数据节点相对比较独立,缓存命中率明显的不如B+树

使用的场景

文件系统,以及数据库的索引都采用的B+树的数据结构来进行缓存数据,考虑到其数据密集性

为什么会使用B+树来做索引文件的数据结构呢?

	数据文件如果过大,一般会存放在磁盘中,而磁盘中数据的查找是依靠磁盘的旋转,磁针先去寻找磁道再去寻找对应的扇区的方式查找的,属于一种机械的物理查找,非常缓慢,因此要提高查找效率得减少磁盘查找	次数也就是减少IO读写操作
相应的查找的索引文件的数据结构就要求时间复杂度越低越好,
    可以变相的理解为数据阶层越少:
    节点中存放的索引key能劲量的多存储一点这个无疑B树满足
    磁盘数据读取有个名词叫缓存命中率,也就是该次查找的数据其附近的数据有极大的可能会被使用到,因此磁盘读取数据的时候会去多查询几页的数据返回,也就是数据存储比较密集,相邻的数据存放在一起,而B+树明显的满足这个特性,因为他的数据都存放在底层的叶子节点上,数据密集度比较高,而且非叶子节点又释放了部分空间,因为不去存放数据了,都去存放索引key,因此又起到了降阶的效果,所以B+树完美契合了磁盘读取性能的特性。

参考资料:
https://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html

猜你喜欢

转载自blog.csdn.net/qq_30228707/article/details/90072322