数据结构(六):复杂树之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次即可,在性能上有很大的优化

   

posted @   纪煜楷  阅读(627)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示