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

B-树和B+树区别

图片来源: link.

在这里插入图片描述
一个m阶的B-树和B+的区别,具有如下几个特征:

关键词 B-树 B+树 备注
最大分支,最小分支 每个结点最多有m个分支(子树),最少⌈m/2⌉(中间结点)个分支或者2个分支(是根节点非叶子结点)。 同左 m阶对应的就是就是最大分支
n个关键字与分支的关系 分支等于n+1 分支等于n
关键字个数(B+树关键字个数要多) 大于等于⌈m/2⌉-1小于等于m-1 大于等于⌈m/2⌉小于等于m B+树关键字个数要多,+体现在的地方。
叶子结点相同点 每个节点中的元素互不相等且按照从小到大排列;所有的叶子结点都位于同一层。 同左
叶子结点不相同 不包含信息 叶子结点包含信息,指针指向记录。
叶子结点之间的关系 B+树上有一个指针指向关键字最小的叶子结点,所有叶子节点之间链接成一个线性链表
非叶子结点 一个关键字对应一个记录的存储地址 只起到索引的作用
存储结构 相同 同左

B+树是B-树的一种变体,而B-树是二叉排序树的一种升级。二排序树是二路查找,而b+树树多路查找,一个m阶的b+树每个节点最多有m个分支,节点最多会有m个关键字,是有序排列的,每个关键字的左分支节点的内关键字都比它的值小,而有分支节点内的关键字都比他大。

回答思路:

  1. m阶B-树和B+树都满足**:m阶就是结点最大分支m**。
  2. 但是B+树的“+”体现在哪呢:首先,B+树的每个结点内关键字n个数最大值比B-树多1
  3. 根据1,2得知**:n个关键字与分支的关系:B-树分支为n+1,B-树分支为n**。
  4. 再考虑叶子结点相同点**:每个节点中的元素互不相等且按照从小到大排列;所有的叶子结点都位于同一层**。
  5. 再考虑叶子结点不同点**:B+树上有一个指针指向关键字最小的叶子结点,所有叶子节点之间链接成一个线性链表**。
  6. 再考虑叶子结点不同点2**:B+树结点不包含信息;叶子结点包含信息,指针指向记录**。
  7. 再考虑叶子结点不同点**:B-树非叶子结点一个关键字对应一个记录的存储地址;B+树非叶子结点只起到索引的作用**。

【题目拓展:B+树比B树的优势】

  1. 单一节点存储更多的元素,使得查询的IO次数更少;

这也使得B+树相对于二叉查找树和b-树,都更加矮胖,

  1. 所有查询都要查找到叶子节点,每次查询IO次数相同,查询性能稳定;

任何关键字的查询必须走从根结点到叶子结点,查询路径长度相同

  1. 所有叶子节点形成有序链表,便于范围查询。
浅析Mysql索引数据结构演变

https://blog.csdn.net/weixin_34019144/article/details/93181425

相关文章:

  • 红黑树
  • 负载均衡之基于L3/4负载
  • 跳表
  • 关于CookieUtile的相关代码
  • iOS_15_通过代码自己定义cell_微博UI
  • 排序
  • 哈希冲突解决方法
  • Activiti的引擎与引擎配置对象
  • dfs和bfs
  • ajax done和always区别
  • 数据库三大范式
  • 一个最小化的SpringBoot项目
  • char 和 varchar 的区别?
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Mysql的存储引擎以及区别
  • 30秒的PHP代码片段(1)数组 - Array
  • Apache Spark Streaming 使用实例
  • Git初体验
  • PHP CLI应用的调试原理
  • python 装饰器(一)
  • Quartz初级教程
  • Spring声明式事务管理之一:五大属性分析
  • Vue 重置组件到初始状态
  • vue中实现单选
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 记一次用 NodeJs 实现模拟登录的思路
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #单片机(TB6600驱动42步进电机)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (30)数组元素和与数字和的绝对差
  • (6)添加vue-cookie
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (转载)Google Chrome调试JS
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Transactional 竟也能解决分布式事务?
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [1] 平面(Plane)图形的生成算法
  • [2018-01-08] Python强化周的第一天
  • [2023-年度总结]凡是过往,皆为序章
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++]C++入门--引用
  • [cb]UIGrid+UIStretch的自适应
  • [ffmpeg] av_opt_set 解析
  • [hdu 1247]Hat’s Words [Trie 图]
  • [HDU] 1054 Strategic Game 入门树形DP
  • [HNOI2008]Cards
  • [Linux] LVS+Keepalived高可用集群部署