b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解

89d491602dd0603f1a0c552c37ea0268.png

B树

B树又叫做二叉搜索树,倒状的树形结构。如下图所示

d2bfc4affb9d06940c6d0165e625f8a5.png
特点:
  • 所有的非子夜节点最多拥有两个子节点树(左子树和右子树)。

  • 所有结点存储一个关键字。

  • 节点的左右儿子,左边是比该节点小的,右边是比该节点大的。

缺点:

因为二叉搜索树不存在平衡算法,所以在某些特殊的情况下,二叉搜索树等同于线性,出现蹩脚的情况,设计者们发现降低树的高度自然就可以提高查找效率。那么如何解决降低树的高度的问题?在这种基础上设计者给二叉树加入了平衡算法,出现了平衡树。

c8c5de7b11cb1d4884884f8a5fbac676.png

二叉树搜索树的查询原理,先从根节点开始,和根节点匹配,若是比根节点小就进入左子节点,若是比根节点大进行右子节点,依次按照这样的逻辑进行,找到就返回。

另一方面树的高度也会影响查询的效率,设计者又是怎么解决的呢?
假设大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的,即使存储在平衡二叉树中,在大量数据的储存情况下,这样导致二叉平衡查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。在这种前提下,B-、B+、B*也就是这样的数据结构,多路搜索树,不再是只有二路。

所谓的平衡就是加上平衡算法,在B树在经过多次插入与删除后,有可能导致不同的结构,极端一点就是出现线性的蹩脚树,通过平衡算法(左旋和右旋),使树的节点分布均匀,是树的查找算法等同于二分查找。所以对于树而言要提高查找的效率,一个是保存平衡;另一个是减少树的高度。

B-树

基于减少树的高度上,B-树是一种多路搜索树,并不是二叉的。如下图所示:

431678b8465a043594f4bc4bf1f54c8e.png
特点:
  • 所有的非叶子结点最多有M个儿子(且M>2)。

  • 根结点的儿子数为[2, M],其它非叶子结点的儿子数为[M/2, M]。

  • 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)。

  • 非叶子结点的关键字个数=指向儿子的指针个数-1。

  • 非叶子结点的关键字中从左到右由大到小排序。即A[1]

  • 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])范围的子树,最后一个指针P[M]指向大于随后一个关键字A[M-1]范围的值。

  • 关键字集合分布在整颗树中,并且只会在节点中出现一次。

  • 搜索可能在非子叶节点或者子叶节点结束,即非子叶节点也存储数据的身,这个与B+树有根本区别。

  • 所有叶子结点位于同一层。

缺点:

  • 当数据量大的时候不是依然会查询到最底层的叶子节点。这就是B-树的缺点,但是相比B树而言已经优化了很多。

B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题。由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并。

B+树

B+树是B-树的变体,也是一种多路搜索树。如下图所示:

02fd3f8f6ca1ed15ea0085d390ae36b9.png
B+基本与B-树同,以下是与B-树的区别:
  • 非叶子结点的指针与关键字个数相等,而B-树的关键字=指针个数-1;

  • 指针P[i],指向关键字值属于[K[i], K[i+1])范围的子树,而在B-树是开区间。

  • 所有叶子结点增加一个指针,指向下一个的兄弟叶子节点。

  • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的,搜索只会在叶子节点结束,叶子节点存储所有关键字的值。

  • 不可能在非叶子结点命中;非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储。

B树与B+树的区别:

  • 所有的叶子节点包含了全部关键子信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。(而B树的叶子节点并没有包括全部需要查找的信息)。

  • 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而B树的非终节点也包含需要查找的有效信息)。

这些链指针在链表中是有序存储的,在搜索中能省大量的时间。那这些链指针可不可以加在所有的节点中呢,答案是可以的,除了根节点,所有的节点都可以加上链指针。这就是B*树索引。

B*树

B*树是在B+树的基础上,在B+树的非根和非叶子结点增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3。

f36f82a06cd0fd70525b5f083cd245b7.png
特点:
  • B*树定义了非叶子结点关键字个数至少为(2/3)M,即块的最低使用率为2/3(代替B+树的1/2)

  • 在非根和非叶子结点增加指向兄弟的指针。

B+树与B*树的区别:
(1)B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针。
(2)B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。结论:
所以,B*树分配新结点的概率比B+树要低,空间使用率更高。

关于回表查询:
比如select name from table where id=?,如果name没有索引,那在查询的时候先得得到的是id对应这条数据所在的行数。拿着这个行数,再去表中查询这条数据,得到name字段。而拿着这个行数去得到name字段的动作,就是回表查询。

我们如何避免回表查询呢,首先就是不要用 ” * “ 查询,因为这时候会默认查询的字段没有索引,必定进行回表查询。

长按订阅更多面经分享

551380c057dfa18b13fecf1c74bf3666.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯2016初赛]煤球数目-找规律

题目描述 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形)&…

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)

06 | 作用域与对象释放行为作用域主要由 IServiceScope 这个接口来承载对于实现 IDisposable 类的实例的对象,容器会负责对其生命周期进行管理,使用完毕之后,他会释放这些对象实现 IDisposable 接口类型的释放:1、容器只会负责由其…

word List 42

word List 42 如果存在什么问题,欢迎批评指正!谢谢!

利用AppMetrics对Web进行监控教程

一、基础准备1. 安装依赖这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本):Install-Package App.Metrics.AspNetCore.Mvc -Version 2.0.0由于我们需要兼容Prometheus进行监控,所以我们还需要安…

matlab贝叶斯优化工具箱_经济学人的神器——BEAR(贝叶斯估计、分析和回归工具包)...

武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋。——金庸《倚天屠龙记》Bayesian Estimation, Analysis and Regression(简写为BEAR) Toolbox是欧央行(ECB)发布的一个综合 (面板)VAR工具箱,通过图…

计算机网络----wireshark抓包

计算机网络----wireshark抓包 抓包截图: 先了解,后期将细讲!!! 如果存在什么问题,欢迎批评指正!谢谢!

如何为.NETCore安装汉化包智能感知

引言具体不记得是在群里还是什么地方有人问过,.NETCore有没有汉化包,答案是有,目前微软已经为我们提供了.NETCore多种语言的语言包。下面看看如何安装与使用吧。本文介绍:如何安装这些下载的本地化版本。如何修改Visual Studio安装…

[召集令]-Dijkstra的单源最短路径算法

2021.3.10 题目背景 墨家家主发出召集令&#xff0c;所有弟子得迅速到指定地点集合。 题目描述 给定一张地图&#xff0c;含有n个地点(n<10000)&#xff0c;地点从1开始编号&#xff0c;地图上还含有m条单向路(m<100000)连接着这些地点&#xff0c;墨家家主在1号位置&am…

word List 43

word List 43 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

小微技术团队的DevOps体系折腾之路(顺带发布52ABP新版本)

加个“星标★”&#xff0c;好文必达&#xff01;本想纯粹说下52ABP新版本发布&#xff0c;但是写着写着,过去的时间更多折腾的是DevOps体系的建设。这篇同样适用于小公司或者个人开发者脱离人肉运维的方法。说下52ABP&#xff0c;我们发布了新版本&#xff0c;版本号3.1.0&…

word List44

word List44 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

python序列数据类型_Python 数据类型 之 序列类型

序列&#xff1a;表示索引为非负整数的有序对象集合&#xff0c;所有序列都支持迭代 序列类型有&#xff1a;字符串&#xff0c;列表&#xff0c;元组 三种 字符串也是一种序列 列表和元组是任意python对象的序列或叫有序集合 字符串和元组不可变序列&#xff0c;列表支持插入、…

word List 45

word List 45 One of the pressing problems our nation faces today is how to strike a balance between economic development and environmental protection. 我们国家当今面临的最紧迫的问题之一就是如何平衡经济发展和环境保护之间的关系。 Corruption has existed since…

2020 年 中国.NET开发者调查报告

微信公众号dotnet跨平台2020年初做的一个关于中国.NET开发者调查收到了开发者近 1400 条回复。这份调查报告涵盖了开发者工具链的所有部分&#xff0c;包括编程语言、应用架构、应用服务器、运行时平台、框架技术、框架配置、IDE、.NET/.NET Core 发行版部署模式、构建工具和Ku…

列名无效如何解决_XSKY ClickHouse如何实现存算分离

在介绍ClickHouse之前&#xff0c;说一下OLAP。OLAP也叫联机分析处理(Online Analytical Processing)。OLAP系统以维度模型来存储历史数据&#xff0c;其主要存储描述性的数据并且在结构上都是同质的。01ClickHouseOLAP应用有如下特点&#xff1a;1、大多数的请求是读请求&…

word List 46

word List 46 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)

06 | 作用域与对象释放行为接下来&#xff0c;把服务切换为单例模式&#xff0c;通过工厂的方式services.AddSingleton<IOrderService>(p > new DisposableOrderService());启动程序&#xff0c;输出如下&#xff1a;1 2 接口请求处理结束可以看到代码实际上不会被释放…

C++实现邻接表存储的图及bfs遍历

#include <iostream> #include <queue> using namespace std; typedef char VerTexType; #define MVNum 100 typedef char OtherInfo; bool vis[MVNum];//邻接表 typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;OtherInfo info; } ArcNode;//弧(边)t…

cmd小游戏_使用pygame制作Flappy bird小游戏

原文链接&#xff1a;【Python】使用Pygame做一个Flappy bird小游戏&#xff08;一&#xff09;​mp.weixin.qq.com最近看到很多大佬用强化学习玩Flappy bird。所以打算也上手玩一玩&#xff0c;但是苦于没找到pc上的这个游戏&#xff0c;找了点资料&#xff0c;发现并不是很难…

word List 47

word List 47 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;