数据结构--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树对比

 

 

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

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

相关文章

单链表经典OJ题:反转链表

题目&#xff1a; 给你单链表的头节点 head &#xff0c;i请你反转链表&#xff0c;并返回反转后的链表。 图例&#xff1a; 分析&#xff1a; 根据链表的特征&#xff0c;反转链表的本质便是改变节点内部的指针方向。 将原先指向下一个节点的指针进行修改&#xff0c;将其的…

PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术

近期&#xff0c;2023年中国模式识别与计算机视觉大会&#xff08;PRCV&#xff09;在厦门成功举行。大会由中国计算机学会&#xff08;CCF&#xff09;、中国自动化学会&#xff08;CAA&#xff09;、中国图象图形学学会&#xff08;CSIG&#xff09;和中国人工智能学会&#…

【物联网+JAVA 】智慧工地源码

一、什么是智慧工地&#xff1f; 工地本身不拥有智慧&#xff0c;工地的运作是依赖于人的智慧。工地信息化技术&#xff0c;能够减少对人的依赖&#xff0c;使工地拥有智慧。 智慧工地&#xff0c;就是立足于“智慧城市”和“互联网”&#xff0c;采用云计算、大数据和物联网…

python教程:selenium WebDriver 中的几种等待

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 强制等待:sleep() import time sleep(5) #等待5秒设置固定休眠时间&#xff0c;单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点&#xff1a; 不智能&#xff0c;使用太多的sleep会影响脚本运行速度。…

Vue 网络处理 - axios 异步请求的使用,请求响应拦截器(最佳实践)

目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使…

微信小程序--小程序框架

目录 前言&#xff1a; 一.框架基本介绍 1.整体结构&#xff1a; 2.页面结构&#xff1a; 3.生命周期&#xff1a; 4.事件系统&#xff1a; 5.数据绑定&#xff1a; 6.组件系统&#xff1a; 7.API&#xff1a; 8.路由&#xff1a; 9.模块化&#xff1a; 10.全局配置&…

【LeetCode】35. 搜索插入位置

1 问题 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例…

Linux性能优化--实用工具:性能工具助手

8.0 概述 本章介绍一些在Linux系统上可用的实用程序&#xff0c;它们能够加强性能工具的有效性和可用性。实用工具本身不是性能工具&#xff0c;但是当它们与性能工具一起使用时&#xff0c;它们可以帮助完成如下功能&#xff1a;自动执行繁琐的任务、分析性能统计数据&#x…

【Linux】adduser命令使用

我们经常在linux系统中创建用户。有时候用的是 useradd 有时候用的是 adduser &#xff0c;好混乱啊到底用哪个啊。今天咱们一起来学习一下。 adduser与useradd的区别 useradd 命令是内置的 Linux 命令&#xff0c;在任何 Linux 系统中都可用。然而&#xff0c;使用这种低级…

语法分析出错,不是 GROUP BY 表达式

报错 ### Cause: dm.jdbc.driver.DMException: 第 9 行, 第 69 列[30]附近出现错误: 语法分析出错 ; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 9 行, 第 69 列[30]附近出现错误: 语法分析出错at org.springframework.jdbc.support.SQLState…

一篇文章讲明白double、float丢失精度的问题

1.背景 1.10.1 1.2000000000000002 发现上面计算的值竟然和数学计算不一致 2. 问题 计算机是通过二进制计算的&#xff0c;如果我们在二进制的视角来看待上面问题&#xff0c;就很容易发现问题了。 例如&#xff1a;把「0.1」转成二进制的表示&#xff0c;然后还原成十进制&…

学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信

目录 3.串口通信实战实操简易的工作原理Tips:sprintf函数简介 总结课后练习 3.串口通信实战 做一个简易串口控制器。发送对应指令&#xff0c;让板子做相应的事情&#xff0c;或者传输数据&#xff08;文本模式下发送&#xff0c;不要选择HEX&#xff09;。 1.串口发送字符Ax\…

IDEA常用AI插件

只推荐免费的 一、对话式AI 1. ChatGPT GPT-4 - Bito AI Code Assistant ChatGPT GPT-4 - Bito AI Code Assistant 插件地址&#xff1a;https://plugins.jetbrains.com/plugin/18289-chatgpt-gpt-4–bito-ai-code-assistant支持自定义prompt支持解释代码支持生成代码注释支持…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

【Mac】时间机器频繁提示磁盘没有正常推出

问题描述 有一次在进行时间机器备份的时候总是提示“磁盘没有正常推出”&#xff0c;并且好几次直接导致系统重启… 估计是 MacOS 系统 bug 解决 看了 Vex 一个帖子之后设置了一个硬盘是否休眠就好了&#xff0c;不要勾选让硬盘处于休眠就可以了&#xff0c;在电池选项界面中…

C++ —— Tinyxml2在Vs2017下相关使用2(较文1更复杂,附源码)

相关链接 C —— Tinyxml2在Vs2017下相关使用1&#xff08;附源码&#xff09; tinyxml2简介 TinyXML2是一个简单&#xff0c;小巧&#xff0c;高效&#xff0c;CXML解析器&#xff0c;可以很容易地集成到其他程序中。TinyXML-2解析一个XML文档&#xff0c;并从中构建一个 可以…

排查手机应用app微信登录问题不跳转失败原因汇总及其解决方案

经过最近我发的文章,我个人觉得解决了不少小问题,因为最近很小白的问题已经没有人私聊问我了,我总结了一下排查手机应用app微信登录问题不跳转失败的原因汇总及其解决方案在这篇文章中,分析微信登录不跳转的原因,并提供解决方案。希望通过这篇文章,能够帮助大家顺利解决这…

MySQL数据库(一)

数据库 —— 基础 1. 数据库 DataBase 数据库管理系统 2. SQL语言2.1 DDL数据定义语言2.1.1 数据库基础操作2.1.2 数据表基础操作2.1.3 字段基础操作 2.2 DML表记录管理2.2.1 插入数据INSERT2.2.2 更新数据UPDATE2.2.3 删除数据DELETE 3. SQL数据类型3.1 数值类型3.1.1 整数类型…

钢铁异常分类140篇Trans 学习笔记 小陈读paper

钢铁异常分类 对比学习 比较好用 1.首先&#xff0c;为每个实例生成一对样本&#xff0c; 来自同一实例的样本被认为是正例&#xff0c; 来自不同实例的样本被认为是负例。 2.其次&#xff0c;这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下&#xff0c; …

element-ui 图片压缩上传

picture.js export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getCo…