当前位置: 首页 > news >正文

数据结构之B树和B+树

数据结构可视化演示链接,也就是视频中的网址

文章目录

  • 一、B-Tree
  • 二、B+Tree(B-Tree变种)
  • 三、原理
  • 四、对比
  • 总结


一、B-Tree

在这里插入图片描述

B树(B-tree)是一种自平衡的多路搜索树,它的每个节点可以有多个子节点,且每个节点的子节点数介于ceil(m/2)到m之间(其中m是B树的阶数)。B树的特点是能够保持树的平衡,使得树的深度较小,从而提高了查询效率。

B树的每个节点都包含关键字信息和指针信息。关键字信息用于存储关键字,指针信息用于指向子节点。当向B树中插入一个新元素时,如果该元素在某个节点的内部位置插入,则不会引起树的调整;如果该元素使得该节点超过m个关键字,则需要进行分裂操作。同样地,当从B树中删除一个元素时,如果该元素的删除使得某个节点少于ceil(m/2)-1个关键字,则需要进行合并或下移操作。

B树适用于读多写少的数据存储系统,如数据库和文件系统。由于B树能够保持树的平衡,因此在查询时可以获得较好的性能。


二、B+Tree(B-Tree变种)

在这里插入图片描述

B+树是B树的一种变体,它的每个节点同样可以有多于两个的子节点,但B+树的非叶子节点仅存储关键字信息,不存储数据记录。B+树的特点是所有叶子节点通过指针相连,便于顺序访问。

B+树的每个叶子节点包含关键字信息和指针信息。关键字信息用于存储关键字,指针信息用于指向子节点。由于非叶子节点仅存储关键字信息,使得B+树在插入和删除时需要维护关键字的有序性。当向B+树中插入一个新元素时,如果该元素在某个节点的内部位置插入,则不会引起树的调整;如果该元素使得该节点超过m个关键字,则需要分裂该节点。同样地,当从B+树中删除一个元素时,如果该元素的删除使得某个节点少于ceil(m/2)-1个关键字,则需要合并该节点或进行下移操作。

B+树适用于读多写少的数据存储系统,如数据库和文件系统。由于B+树的非叶子节点仅存储关键字信息,因此在插入和删除时需要维护关键字的有序性,这使得B+树在处理大量数据的场景下具有较好的性能。


三、原理

  • B树原理

B树的原理是为了存储设备或者磁盘设计的一种平衡查找树。通过对树高度的降低可以提升查找效率,尤其是在大量数据进行存储的时候会存储到外部磁盘,通过对外部磁盘的读取时需要快速的查找到对应的位置,所以需要一种高效的外村数据结构。B树也称B-树,它是一颗多路平衡查找树。描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是常见的二叉搜索树。

  • B+树原理

B+树是B树的一种变形,它把数据都存储在叶子节点,内部只存关键字(其中叶子节点的最小值作为索引)和孩子指针,简化了内部节点。B+树的遍历高效,将所以叶子节点串联成链表即可从头到尾遍历。B+树的优点:非叶子节点不会带上ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。 叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。

四、对比

  1. 数据存储位置:B树中,数据既可以在内部节点也可以在叶子节点存储;而B+树中,数据只可以在叶子节点存储。
  2. 索引方式:B树中,每个内部节点包含了关键字和指向子节点的指针;而B+树中,每个内部节点仅包含关键字和指向子节点的指针,而叶子节点包含了关键字和指向数据的指针。
  3. 查询效率:对于范围查询和顺序访问,由于B+树的叶子节点通过指针相连,所以效率更高;对于随机访问,B+树和B树的效率相当。
  4. 插入与删除操作:对于插入和删除操作,B+树相对B树来说更加稳定,因为B+树的非叶子节点不存储数据,所以不会因为插入或删除操作而频繁调整。
  5. 空间利用率:在相同的条件下,B+树的空间利用率更高。

总结

B树和B+树都是常用的自平衡多路搜索树,它们适用于不同的数据存储系统。B树适用于读多写少的数据存储系统,而B+树适用于处理大量数据的场景。在实际应用中,选择合适的B树或B+树需要根据具体的应用场景和需求来决定。

相关文章:

  • LeetCode 每日一题 2024/1/22-2024/1/28
  • 通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化
  • Prometheus---图形化界面grafana(二进制)
  • datawhale 大模型学习 第十一章-大模型法律篇
  • 订婚支出及共同生活消费是否属于彩礼?应否返还?
  • LabVIEW电液伺服控制系统
  • 二叉树-堆实现
  • 状态码400以及状态码415
  • NonDefUseDependency及例子
  • 《go语言实战》笔记第三章-go doc(文档)
  • 论文阅读-MapReduce
  • Netty源码三:NioEventLoop创建与run方法
  • Linux ---- Shell编程之正则表达式
  • Java 的 Map 與 List
  • linux新增用户,指定home目录和bash脚本且加入到sudoer列表
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • C语言笔记(第一章:C语言编程)
  • docker-consul
  • GitUp, 你不可错过的秀外慧中的git工具
  • IOS评论框不贴底(ios12新bug)
  • JavaScript HTML DOM
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • java正则表式的使用
  • JS笔记四:作用域、变量(函数)提升
  • Mysql数据库的条件查询语句
  • TCP拥塞控制
  • vue 配置sass、scss全局变量
  • yii2中session跨域名的问题
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 力扣(LeetCode)21
  • 前端代码风格自动化系列(二)之Commitlint
  • 悄悄地说一个bug
  • 深度学习在携程攻略社区的应用
  • 运行时添加log4j2的appender
  • 《天龙八部3D》Unity技术方案揭秘
  • MPAndroidChart 教程:Y轴 YAxis
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (蓝桥杯每日一题)love
  • (利用IDEA+Maven)定制属于自己的jar包
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)VC++中ondraw在什么时候调用的
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装