数据结构学习笔记——查找算法中的树形查找(B树、B+树)
目录
- 前言
- 一、B树
- (一)B树的概念
- (二)B树的性质
- (三)B树的高度
- (四)B树的查找
- (五)B树的插入
- (六)B树的删除
- 二、B+树
- (一)B+树的概念
- (二)B+树的性质
- (三)B+树的查找
前言
B树和B+树属于树形查找算法中的一种,主要用于数据库系统、文件系统和磁盘存取等方面,都是用于存储和索引大量的数据,以提高检索效率。例如,在磁盘存储中,通过将数据分散到多个磁盘块中,并使用树形结构来组织这些磁盘块,从而提高了查找速度和查找效率。若设B树中所有结点的孩子结点个数的最大值为m,则该B树是一棵m阶B树,另外B+树则是B树的变形。
一、B树
(一)B树的概念
二叉排序树也称为查找树(注意:与二分查找的判定树不同),其中各结点值的大小关系是:左子树<根结点<右子树,且左、右子树也是一棵二叉排序树满足其条件。
前面给过二叉查找树的定义,简单的来说,B树是二叉查找树的推广,即一棵m阶B树可看作一棵m叉查找树,但两者有些方面不同,如下:
1、结点与关键字不同:二叉查找树遵循二叉树的原则,每个结点最多只有两个孩子结点,且每个结点只包含一个关键字;而B树的每个结点最多有m个结点,即最多含有m-1个关键字。
2、平衡性:二叉查找树不一定是一棵平衡二叉树,查找过程中查找效率可能随着查找树的结构变化;而B树是一棵多路平衡查找树,通过限制结点的子树和关键字数量,使B树的高度保持相对稳定,从而提高查找效率。B树也正是在保持平衡的前提下能够更高效地处理大量数据,从而非常适合应用在需要高效存储和访问大量数据的场景中。
(二)B树的性质
B树中与二叉查找树相同的性质,二叉查找树各结点值的大小关系是:左子树<根结点<右子树,而B树中关键字的值的大小关系是:子树1<关键字1<子树2<关键字2<子树3…,一棵m阶B树中,除了根结点外所有结点中关键字个数为:⌈m/2⌉-1 ≤ n ≤ m-1。例如,一棵5阶B树中,除了根结点外所有结点中关键字的个数为2 ≤ n ≤ 4,即关键字个数最少为2,最多为4。

1、m阶B树中,根结点至多有m棵子树,若B树的根结点不是终端结点,则该B树至少有两棵子树。
2、B树中结点内关键字均以升序或降序排列。
3、B树是一棵多路平衡查找树,所有结点的平衡因子均为0。
4、m阶B树中,若根结点没有关键字,则B树无子树,B树为空;若有关键字,由于子树个数等于关键字个数加1,所以子树一定大于或等于两棵。
5、m阶B树中,根结点最少含1个关键字,而除根结点外,每个非叶子结点至少有⌈m/2⌉棵子树,且至少有⌈m/2⌉-1个关键字;由于最少情况下,根结点至少有一个关键字,所以B树中所有结点包括的关键字个数至少为(n-1)(⌈m/2⌉-1)+1个。
6、结点的孩子结点的个数等于该结点关键字的个数加1,即具有n个关键字的m阶B树,应有n+1个叶结点。另外,B树中所有的叶子结点均在一层上,且不带任何信息,这一点与二分查找判定树中查找失败的结点类似,实际上这些叶子结点不存在,代表查找失败的情况,如下:

(三)B树的高度
在求B树的高度时,不计入叶子结点,若设m阶B树中包括n(n≥1)个关键字,其高度为h,可得到B树的最小高度和最大高度范围区间:logm(n+1) ≤ h ≤ log⌈m/2⌉[(n+1)/2]+1。
⌈ ⌉表示向上取整,取比自己大的最小整数,⌊ ⌋表示向下取整,取比自己小的最大整数。
(四)B树的查找
B树的查找类似二叉查找,首先在B树中查找结点,然后在结点所包含的关键字K1,…,Kn中查找给定的关键字,可通过顺序查找或二分查找进行查找,若找到等于给定值的关键字,则查找成功;否则,继续查找,直至找到或指针为空时,此时查找失败,即查找到B树的叶子结点时失败。
(五)B树的插入
B树的插入操作不仅需要找到要插入的位置(定位),而且需判断插入后是否会导致不满足B树的定义,由于B树中查找成功结点的关键字个数在 ⌈m/2⌉-1 ≤ n ≤ m-1间,如下:
1、第一种情况:若插入后结点的关键字个数小于m,则直接插入。

2、第二种情况:若插入后结点的关键字个数大于m-1,则需要进行调整,从关键字中间位置⌈m/2⌉处将关键字分为两部分,左半部分放在原结点中,右半部分放在新的相邻右边结点中,中间关键字元素⌈m/2⌉上移到原结点的父结点中,另外,若父结点的空间也不够,则继续按照以上方式进行调整。

(六)B树的删除
B树的删除分两种情况,如下:
1、第一种情况:
若要删除的关键字在终端结点中时:
(1)若要删除的关键字所在结点的关键字个数大于或等于⌈m/2⌉时,即关键字删除后结点仍满足相应的关键字个数,则可直接删去。
(2)若要删除的关键字当前所在结点的关键字个数等于⌈m/2⌉-1时,且左/右兄弟很充裕时,即其关键字个数大于或等于⌈m/2⌉时,需要进行调整(向兄弟借),用当前结点的前驱/后继、前驱的前驱/后继的后继代替,从而满足B树的定义。

(3)若要删除的关键字当前所在结点的关键字个数等于⌈m/2⌉-1时,且左/右兄弟不是很充裕时,即其关键字个数只等于⌈m/2⌉-1时,则将关键字删除后需要进行合并,即与当前结点的兄弟结点以及双亲结点中的关键字合并。

2、第二种情况:
若要删除的关键字不在终端结点中时,用该关键字的直接前驱或直接后继代替,转换成第一种情况,再进行删除。


二、B+树
(一)B+树的概念
B+树可以由分块查找推广,所以也称为多级分块查找,即m阶B+树,它是B树的变形,与B树相同,B树和B+树都是平衡的多叉树,都用在文件索引结构和数据库索引中,但B+树更加适用。B树的结点包含关键字对应记录的存储地址,且B树中的叶子结点不带信息,而B+树的叶子结点带信息,而其中其他的非叶子结点只是作索引作用。
(二)B+树的性质
B+树中,n个关键字对应n棵子树,即每个关键字对应一棵子树,且子树的个数与结点的关键字个数相等,每个分支结点至少有 ⌈m/2⌉棵子树。

B树与B+树中结点的关键字个数对比如下表:
| 名称 | B树 | B+树 |
|---|---|---|
| 根结点关键字个数 | 1 ≤ n ≤ m-1 | 2 ≤ n ≤ m |
| 非根结点关键字个数 | ⌈m/2⌉-1 ≤ n ≤ m-1 | ⌈m/2⌉ ≤ n ≤ m |
(三)B+树的查找
B树支持随机查找,而B+树支持顺序查找和随机查找。
B树不支持顺序查找的原因是查找时可能查找到树中的任何一层,所以其查找速度和稳定性没有B+树高。
相关文章:
数据结构学习笔记——查找算法中的树形查找(B树、B+树)
目录 前言一、B树(一)B树的概念(二)B树的性质(三)B树的高度(四)B树的查找(五)B树的插入(六)B树的删除 二、B树(一…...
python包chromadb安装失败总结
1,背景: 最近在学习langchain的课程,里面创建自己的知识库的Retrieval模块中,需要用到向量数据库。 所以按照官方的教程(vectorstores),准备使用chroma的向量数据库。图片来源 2,问…...
机器学习(四) -- 模型评估(2)
系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…...
泊松分布与二项分布的可加性
泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 X , Y X,Y X,Y 相互独立 , X ∼ P ( λ 1 ) X\sim P(\lambda_1) X∼P(λ1) , Y ∼ P ( λ 2 ) Y\sim P(\lambda_2) Y∼P(λ2) , 求证 Z X Y ZXY ZXY 服从参数为 λ 1 λ 2 \lambda_1 \lambda_2 λ1λ2 …...
【PostgreSQL】约束-排他约束
【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束,用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...
Java重修第一天—学习数组
1. 认识数组 建议1.5倍速学习,并且关闭弹幕。 数组的定义:数组是一个容器,用来存储一批同种类型的数据。 下述图:是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢?为了解决在某些场景下,变…...
【C#】知识点实践序列之Lock的锁定代码块
大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇验证Lock锁定代…...
StringBad ditto (motto)
第12章 类和动态内存分配 StringBad ditto (motto): // calls StringBad (comst StringBad &) StringBad metoo - motto: // calls StringBad (const StringBad &) StringBad also StringBad (motto): // calls StringBad (const StringBad &) StringBad * pStri…...
Redis缓存击穿、缓存雪崩、缓存穿透
缓存击穿(某个热点key缓存失效) 概念 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大和缓存雪崩的…...
【PCB专题】Allegro封装更新焊盘
在PCB封装的绘制中,有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢? 打开封装,选择Tools->Padstack->Refresh... 选择Refresh all …...
ES6之Reflect详解
✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...
文件监控-IT安全管理软件
文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化,防止未经授权的访问和修改,并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动,包括文件的创建、修…...
达梦数据库安装超详细教程(小白篇)
文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。 达梦数…...
复试 || 就业day09(2024.01.04)算法篇
文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 💫你好,我是辰chen,本文旨在准备考…...
Win10电脑关闭OneDrive自动同步的方法
在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…...
linux(centos)相关
文件架构: bin--binary--二进制命令,可直接执行 sbin systembin系统二进制命令,超级管理员 lib 库目录 类似dll文件 lib64 64位系统相关的库文件 usr 用户文件 boot 引导分区的文件,链接,系统启动等 dev device设备目录…...
外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南
外贸网站显示不安全警告怎么办?当用户访问你的网站,而您的网站没有部署SSL证书实现HTTPS加密时,网站就会显示不安全警告,这种警告,不仅有可能阻止用户继续浏览网站,影响网站声誉,还有可能影响网…...
Java:HeapMemory和DirectMemory配置与使用介绍
目录 一、Heap内存 1、查看Heap内存配置的最大值 2、配置Heap内存最大值的方式 3、配置Heap内存最小值的方式 4、查看已使用Heap内存的方式 5、查看未使用Heap内存的方式 二、Direct内存 1、查看Direct内存配置的最大值 2、配置Direct内存最大值的方式 3、获取Direct…...
记 -bash: docker-compose: command not found 的问题解决
docker-compose: command not found 错误表明系统无法找到 docker-compose 命令。这可能是因为 docker-compose 并未正确安装,或者其可执行文件的路径未包含在系统的 PATH 变量中。 以下是我遇到时解决方法: 确保 Docker 和 Docker Compose 已安装&…...
分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析
引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文,主要涉及图神经网络,大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式,回复&am…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
