数据结构--B树
目录
回顾二叉查找树
如何保证查找效率
B树的定义
提炼
B树的插入和删除
概括B树的插入方法如下
B树的删除
导致删除时,结点不满足关键字的个数范围时(需要借)
如果兄弟不够借,需要合体
回顾B树的删除
B+树
B+树的查找
回顾B+树
B+树与B树对比
回顾二叉查找树
--能不能变成m叉查找树呢?

比如5叉查找树
紫色的是失败结点,每个子树内关键字结点都是有序的

比如查找目标是9(查找成功的情况)

比如查找目标是(查找失败的情况)
对于查找失败就是最后找到的是NULL

如何保证查找效率
策略:m叉查找树,除了根节点外,任何结点至少有 m/2 (向上取整)个分叉,即至少有m/2(向上取整)-1个关键字

为什么要除了根节点呢?原因如下:


所以如果可以规定一个下限,(1)分叉不是特别少,(2)同时高度都要相同(即绝对平衡)
满足这两个条件那么就是一颗B树
如下图就是一颗5叉的B树

接下来是时候展示B树的定义了!!!!!!!!
B树的定义


提炼
(自己可以容易理解的整理)
绝对平衡,是没有高度差的
终端结点:包含信息
叶子结点(本质就是失败节点,它是个空指针):不包含信息
分叉个数最多的就是阶,图中分叉最多是5个,所以是5阶
2)若根节点不是终端结点,则至少有两颗子树的原因:是保证绝对平衡,没有高度差
5)所有叶结点都出现在同一层原因:是保证绝对平衡,没有高度差
4)K是关键字,P是指针,n是记录实际关键字到底有几个;K1<K2<....Kn是说关键字必须有序(这里是递增,也可以递减,只要有序即可)


最小高度的计算

最大高度的计算

B树的本节总结

B树的插入和删除
以5阶的插入来演示过程
依次放 25,38,49,60,

放80,导致关键字超出了4个
此时要进行分裂

新元素一定是插入到最底层“终端结点”,用“查找”来确定插入位置
插入要保证这个结点的左边结点要比其小,右边要比关键字大
接着插入90

90的正确的插入位置应该如下,接着插入99

接着插入88

所以插入88的结果如下

接着插入70,83,87肉眼可见往最低层插入,发现出现了溢出,将关键字[m/2](向上取整)分成两部分即87位置

即最终插入80的位置如下

接着插入如果导致父节点也出现溢出,接着分裂,直至传到根节点为止。

概括B树的插入方法如下

B树的删除
(1)删除60

删除结果如下

如果删除80结点,会导致根结点为空
方法找直接前驱或者直接后继

此时用直接前驱70替代了80的位置,如下图
找直接前继的发法:关键字左侧指针所指子树中“最右下”的元素

接着删除77,如果利用77的直接后继,替代删除的元素77
找直接后继的发法:关键字右侧指针所指子树中“最左下”的元素

对非终端结点关键字的删除,必然可以的转化为对终端结点的删除操作
导致删除时,结点不满足关键字的个数范围时(需要借)
比如删除38后,导致结点不满足关键字的个数范围2<=n<=4时,需要借,如果借右兄弟时

删除结果如下

删除90后,导致关键字只剩下92,不在范围内,同时右兄弟手头紧张时,现象如下

借左兄弟
92的前驱所连指针是88,88前驱是左孩子的最右边结点87,用88插入到92前面,再用87替代88位置,
删除92后的最终结果B树是

关键:
要永远保证 子树0<关键字1<子树1<关键字2<子树2<
如果兄弟不够借,需要合体
如果删除49后形成如下情况,左右兄弟不够借
开始合并,但是要永远保证 子树0<关键字1<子树1<关键字2<子树2<,从父节点要来70,但是导致父节点又不够了
接着合并
删除最终的结果如下:



回顾B树的删除

B+树
上一层的一个关键字是其子树对应的最大值,比如叶子结点中1,3,最大的的是3,所以的父节点的一个关键字是3。接着叶子结点6,8,9最大的的是9,所以的父节点的另一个关键字是9,同理,从下往上找最大的值,作为上一层的一个关键字


注意的点:
3)重点:B+树的结点的子树个数与关键字个数相等

而B树如果有2个关键字是有3个子树的,如下图

4)叶子结点是整个的一块,比如47,48,50,56这个整体,并不是里面的某一部分,所以一个叶子结点可能包含m个关键字

B+树的查找
方式(1)
通过根节点往下查找,但是必须找到最下层,即叶子结点才可以,因为叶子结点才记录信息


方式2
可以从保存的指针p,查找

回顾B+树

B+树与B树对比









相关文章:
数据结构--B树
目录 回顾二叉查找树 如何保证查找效率 B树的定义 提炼 B树的插入和删除 概括B树的插入方法如下 B树的删除 导致删除时,结点不满足关键字的个数范围时(需要借) 如果兄弟不够借,需要合体 回顾B树的删除 B树 B树的查找 …...
【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
嵌入式养成计划-43----QT QMainWindow中常用类的使用--ui界面文件--资源文件的添加--信号与槽
一百零九、QMainWindow中常用类的使用 109.1 菜单栏 QMenuBar 菜单栏 QMenuBar 最多只能有一个 109.2 工具栏 QToolBar 工具栏 QToolBar 可以有多个 109.3 状态栏QStatusBar 状态栏 QStatusBar 最多只能有一个 109.4 浮动窗口QDockWidget 浮动窗口 可以有多个 109.5 代…...
【Yarn】清除Yarn的缓存,更新Yarn本身、更新项目的依赖项
要清除Yarn的缓存,可以运行以下命令: yarn cache clean这将清除Yarn的缓存目录。 要更新Yarn本身,可以运行以下命令: yarn self-update这将下载并安装最新版本的Yarn。 如果要更新项目的依赖项,可以运行以下命令&a…...
点云从入门到精通技术详解100篇-雨雾环境下多传感器融合SLAM方法(续)
目录 4 基于球面投影的激光视觉融合里程计 4.1 引言 4.2 视觉惯性里程计 4.2.1特征点提取与匹配...
解决GET请求入参@NotNull验证不生效问题
一、问题 get请求NotNull验证不生效 二、解决方案 两个步骤: 在该方法的controller类上加Validated;在参数面前加NotNull; 三、其他注解 //被注释的元素必须为null Null //被注释的元素不能为null NotNull //被注释的元素必须为true Ass…...
《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)
文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求…...
环境变量【使用命令行参数引出环境变量】
前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…...
【Java 进阶篇】JavaScript BOM History 详解
当用户浏览网页时,可以使用JavaScript的BOM (Browser Object Model)中的History对象来访问浏览器的历史记录。这个对象允许您在不更改页面的情况下导航到不同的历史记录项,或者查看有关用户访问过的页面的信息。 在本篇博客中,我们将围绕Jav…...
【计算机网络】https协议
文章目录 1 :peach:基本概念:peach:1.1 :apple:什么是HTTPS?:apple:1.2 :apple:什么是加密?:apple:1.3 :apple:常见的加密方式:apple:1.3.1 :lemon:对称加密:lemon:1.3.2 :lemon:⾮对称加密:lemon: 1.4 :lemon:数据指纹:lemon: 2 :peach:HTTPS的⼯作过程…...
React之受控组件和非受控组件以及高阶组件
一、受控组件 受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据 举个简单的例子: class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…...
中国移动集采120万部,助推国产5G赶超iPhone15
近期媒体纷纷传出消息指中国移动将大规模集采,预计将采购国产5G手机120万台,加上另外两家运营商的集采数量,估计集采数量可能达到300万部,如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市,获益…...
华为云HECS服务器下docker可视化(portainer)
一、docker安装 华为云HECS安装docker-CSDN博客 二、portainer安装 portainer地址:Portainer: Docker and Kubernetes Management Platform 当前portainer分CE(开源版) 和 BE(商业版),用CE即可 1 创建…...
postman发送soap报文示例
一、soap简介 soap是一种基于XML的协议 二、postman发送soap请求 1、发送post请求,url: https://www.dataaccess.com/webservicesserver/NumberConversion.wso 2、headers设置,添加Content-Type,值为text/xml 添加SOAP…...
力扣-python-两数之和
题解: class Solution(object):def twoSum(self, nums, target):# 遍历列表for i in range(len(nums)):# 计算需要找到的下一个目标数字res target-nums[i]# 遍历剩下的元素,查找是否存在该数字if res in nums[i1:]:# 若存在,返回答案。这里…...
算水质TDS加温度补偿
先上图,就图里这款水质检测,用树莓派3/4的话,要配个温度检测作为温度校正,以及一个adc 元器件。我选ds18b20和ads1115。 再把模拟数据计算过程放一下: 温度检测元器件在农历钟那里提过,就是同款。此处先测个…...
wps/word 如何让表格的标题和表格名称文本(表1-1 xxx)跨页显示(已解决)
第一步: 打开wps 创建一个跨页的表格表格,如下图 第二步 大家都知道 表格标题跨页 就是1)在菜单表格工具 点击重复标题 或者 2)表格属性--》行--》在各页顶端以标题行形式出现,详细如下图。 1) 第一…...
攻防世界web篇-PHP2
直接点击进入到http网页中,会得到这样一个界面 这里,我最开始使用了burp什么包也没有抓到,然后接着又用nikto进行探测,得到的只有两个目录,当时两个目录打开后,一个是fond界面,一个是这个网页的…...
Kotlin中的步长
步长是 Kotlin 中用于迭代区间或集合时控制迭代步进的概念。在 Kotlin 中,我们可以使用 step 关键字来指定迭代时的步长。 在 Kotlin 中,有多种方式可以定义一个区间(Range)。我们将通过以下示例代码来展示不同类型的区间以及如何…...
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
本地部署drawDB结合内网穿透技术实现数据库远程管控方案
文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...
