数据结构(六):复杂树之B+B-树
一、 B-树概述
B-树是在2-3树的基础上,一个结点允许多个键(>=3)存在的树状数据结构。
二、 B-树特性
- B-树允许一个结点存在>=3个键
- 一颗M阶的B-树,存在M-1层的树层级
- 一颗M阶的B-树,每个结点最多有M-1个键,并且升序排列
- 每个结点最多能有M个子结点
- 根结点至少有两个子结点
如下为一颗M=5阶的B-树示意图
如下为一颗M=5阶的B-树存储数据的示意图
插入13,21
插入40
三、 B-树的应用场景
计算机中文件是存储在磁盘上的,计算机通过操作文件系统对磁盘上的文件进行增删改操作,文件系统就是使用的B-树。
由于存储介质特性,磁盘读取比主存要慢很多,为了减少磁盘I/O,磁盘不会按需读取,而是会有预读操作,即使只需要一个字节,磁盘也会从该位置开始,向后读取一定长度的数据放入主存
这是根据计算机中的局部性原理:当一个数据被使用时,其附近的数据也通常会被马上使用。因此预读可以提高I/O效率。
页是计算机存储的逻辑块,磁盘存储区被分割为大小相等的块,每个存储块为一页,通常是1024个字节或其整数倍,预读长度一般为页的整倍数。主存和磁盘以页为单位交换数据。
当读取的数据不在主存中时,会触发缺页异常并向磁盘发出信号,磁盘会将数据读取的起始位置处往后的几页数据读取并载入内存中。
为什么B-树更适用于文件系统读取,假设有10亿个数据,那么一个1024阶的B-树读完只需要三层,而二叉树需要20层,B-树对于大数据量的读取,优势还是非常明显的。
四、 B+树概述
B+树是B-树的变形树,B+树中非叶子结点的父结点只存索引,不存具体数据。
五、 B+树和B-树区别和优劣
区别:
1、B+树中非叶子结点的父结点只存索引,不存具体数据
2、B+树所有叶子结点构成一个有序链表,可在最左的叶子结点有序的往后遍历
如图所示为B+树和B-树数据存储上的区别
继续插入18
优劣:
B+树相比B-优点在于:B+树非叶子结点不存储数据,只存索引,因此内存空间复杂度小,又因为叶子结点组成了有序链表,对整棵树的遍历,只需一次性遍历叶子结点即可。
B+树相比B-缺点在于:B-树每个结点都包含Key和Value,因此当我们遍历匹配到Key时就可以直接获取到值,而无需像B+树一样,需遍历到叶子结点才能获取到value。
六、 B+树的应用场景
数据库主键索引查询:
在如下的数据库表中,若要找到id=18的username,需要遍历6次
userid |
username |
7 |
cat |
3 |
dog |
10 |
monkey |
12 |
rabbit |
22 |
lion |
18 |
tiger |
8 |
fish |
而对这部分数据转化为B+树存储后,如下图,只需根据根结点索引,找到id=12的树节点并往后遍历1次即可,在性能上有很大的优化