数据结构笔记 B 树 B+树

news2024/11/18 15:34:49

1 B树

Balanced 树,多路平衡搜索树

1.1 特征

一个m阶的B树具有如下几个特征:

  • 根结点的儿子数为[2, M];
  • 除根结点以外的非叶子结点的儿子数为[M/2, M];(M/2向上取整)
  • 每个结点存放至少M/2-1(M/2向上取整)和至多M-1个关键字;
  • 非叶子结点的关键字个数=指向儿子的指针个数-1;
  • 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  • 非叶子结点的指针:P[1], P[2], …, P[M];
    • P[1]指向关键字小于K[1]的子树
    • P[M]指向关键字大于K[M-1]的子树
    • 其它P[i]指向关键字属于(K[i-1], K[i])的子树;
  • 所有叶子结点位于同一层

上面这些特征可能看得云里雾里的,我们直接看一个例子:

1.2 举例

1.3 查询

比如查询9:

从根节点开始,先跟8比较

大于8,所以找到8的右孩子,也就是(0010,0012)节点

跟10比较,比10小,所以找到该节点的最左孩子9

跟9比较,等于要查找的数值,返回

 1.4 插入

首先查找,找到合适的位置,也就是(0013,0015)这个节点

 16插入该节点,变成(0013,0015,0016)

由于这是一个3阶B数,所有每个节点里面最多有3-1=2个关键词

 

 为了符合B-树的特性,将会增加父节点的元素个数

 

向上传递元素,传递的原则就是中间值优先,所以传递元素为15

 此时父节点不满足3阶B数特性了,所以再往上一级传递元素,传递元素为12

 

根节点,变成了(0008,0012),他需要有三个孩子,所以将根节点的右孩子,拆分成了两个

1.5 删减

首先还是要先找到目标值,即16这个结点 

将其删除,此时15节点的子孩子只有一个,不符合3阶B树需要[3/2+1,3]个子孩子的限制

 

将16的父节点元素较大值15往下放

同时将15的父节点元素较大值12往下放

此时根节点只有一个元素8,只能有两个子节点

将10和12合并成(0010,0012)

 

 2 B+树

B-树的变体,也是一种多路搜索树

2.1  B+树特征

一棵m阶B+树和m阶的B-树的差异在于:

  • 有n棵子树的节点中含有n个关键字(即每个关键字对应一棵子树);
  • 叶子节点中包含了全部关键字的信息, 及指向含这些关键字记录的指针
  • 叶子节点本身依关键字的大小自小而大顺序链接;
  • 所有的非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字哦(非叶子节点不含有任何信息)
  •  除根节点外,其他所有节点中所含关键字的个数必须>=⌈m/2⌉(比B树多一个)

2.2 举例

  • 通常在B+树上有两个指针头, 一个指向根节点,另一个指向关键字最小的叶子节点。
  • 因此,可以对B+树进行两种查找运算: 一种是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找

2.3 B+树相比于B树的优势

2.3.1 磁盘读写代价更低

  • B+树的内部结点并没有指向关键字具体信息的指针,因此其内部结点占用内存相对B 树更小。
  • 如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存中的可以查找的关键字也就越多。
    • ——》相对来说IO读写次数也就降低了;

2.3.2 查询效率更加稳定

  • 由于非叶子结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。
  • 所有关键字查询的路径长度相同,导致每一个数据的查询效率相当

2.3.3 便于范围查询

  • 范围查找是数据库的常态
  • B树虽然提高了IO性能,但是并没有解决元素遍历的效率低下

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

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

相关文章

SpringBoot写接口小记 以及 几个层的功能总结(自用 勿喷)

目录 Entity层&#xff1a;实体层 数据库在项目中的类 Mapper层&#xff1a; 持久层 主要与数据库进行交互 Service层&#xff1a;业务层 控制业务 Controller层&#xff1a;控制层 控制业务逻辑 Entity层&#xff1a;实体层 数据库在项目中的类 Entity层是实体层&#xff…

保驾“双十一” 博睿数据助力电商零售迎高峰无烦忧

如果说“双十一”大战的A面是由天猫、京东、拼多多、唯品会等电商平台&#xff0c;以及一些MCN机构、头部主播拉动的一系列购物狂潮&#xff0c;那么B面则是零售、物流、制造、银行保险等全产业链面对海量流量之下&#xff0c;以强大的心力、脑力与体力应对流量增加和交易陡增的…

最新PS 2024 虎标正式版来啦,附带AI神经滤镜(支持win/mac)

软件简介 文件名称 PS2024 虎标正式版 支持系统 windows、Mac 获取方式 文章底部 分享形式 百度网盘 小伙伴们&#xff0c;下午好&#xff01;今天给大家的是PS 2024 25.0虎标正式版。 PS 2024 25.0 正式版介绍 经历了多次Photoshop 2023 Beta 测试之后&#xff0c;今天…

字体压缩:font-spider

1、全局安装插件 npm install font-spider -g2、打开字体文件夹 3、新建一个 index.html 文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-wid…

计算机视觉:人脸识别与检测

目录 前言 识别检测方法 本文方法 项目解析 完整代码及效果展示 前言 人脸识别作为一种生物特征识别技术&#xff0c;具有非侵扰性、非接触性、友好性和便捷性等优点。人脸识别通用的流程主要包括人脸检测、人脸裁剪、人脸校正、特征提取和人脸识别。人脸检测是从获取的图…

Linux脚本shell中将Windos格式字符转换为unix

众所周知&#xff0c;windos的文档直接复制到linux服务器上去&#xff0c;是需要进行格式转换的&#xff0c;否则可能出现以下报错&#xff1a; 解决方法&#xff1a; vim 脚本 输入 :set ff ##会显示字符格式 :set ffunix ##转换为unix格式 :wq ##保存退出

交换机堆叠 配置(H3C)

堆叠用来干什么&#xff1f; 一台交换机网口有限&#xff0c;无法满足网络需求&#xff1b; 无法达到网络要求&#xff0c;为了扩展核心设备的转发要求&#xff0c;不改变原来网络&#xff0c; 可以使用新交换机和原来交换机组成IRF。 配合聚合可以达到备用作用&#xff0c;防…

java创造对象

java创造对象主要分为以下几个步骤 获取对应的类&#xff0c;查看是否加载&#xff0c;如果没有加载把类进行加载根据类的信息可以直接获取到实例的大小&#xff0c;分配对应内存调用实例的方法 比如说 class bb implements Serializable {private String bb; }class aa ext…

跟着 Tubi 同事吃遍全世界

在过去的一年里&#xff0c;Tubi 北京办公室的 Pantry 非常忙&#xff0c;忙于接收 Tubi 同事从全球各地带回的美食。而我们也有幸跟随慷慨的同事们尝遍了大江南北的味道。 细数这 30 多次美食分享&#xff0c;我们发现&#xff0c;大家分享的不仅是食物&#xff0c;还是…… …

从0开始学习JavaScript--JavaScript基础

JavaScript作为一门前端编程语言&#xff0c;在现代web开发中扮演着不可替代的角色。它不仅为网页增添了动态和交互性&#xff0c;而且随着Node.js的崛起&#xff0c;也在服务器端开发中占据了重要地位。在本章节中&#xff0c;我们将探讨JavaScript的作用、重要性以及与其他前…

23款奔驰E300L升级几何多光束大灯 自适应远近功能

奔驰新款E300L升级几何多光束大灯&#xff0c;单侧的LED头灯分别由84颗独立的LED光源组成&#xff0c;与风挡玻璃上的立体摄像机配合&#xff0c;每秒钟可对路况进行100次扫描&#xff0c;针对不同的路况和驾驶状态&#xff0c;智能调整84个独立光源 几何多光束大灯每侧大灯都拥…

rocketmq一主多从搭建

1.四台服务器192.168.4.202&#xff08;master&#xff09;&#xff0c;192.168.4.203&#xff0c;192.168.4.204&#xff0c;192.168.4.205 分别在四台机子上跑namesrv&#xff0c;无需修改参数及启动命令&#xff0c;官方默认启动即可。 2. broker 以下内容复制到4台机子的…

如何用AI交互数字人打造数智文旅?

随着旅游业不断发展壮大&#xff0c;景区的功能不断扩展、业态不断延伸、硬件不断升级&#xff0c;但如何利用自身文旅资源打造差异化、数智化文旅景点&#xff0c;吸引游客与市民成为一大经营痛点。 而AI交互数字人的出现&#xff0c;可以极大地将文旅资源以可视化、具象化的…

Vatee万腾智能创新探索:Vatee科技引领创新发展

在Vatee万腾的智能创新探索中&#xff0c;我们见证了一场科技领域的革命。Vatee万腾通过其独到的智能时代愿景&#xff0c;正引领着科技创新发展的浪潮&#xff0c;塑造着未来的数字化格局。 Vatee万腾以其卓越的科技引领力&#xff0c;将智能创新推向新的高度。通过整合先进的…

源码级JVS低代码功能新增:动态配置、逻辑多级循环嵌套等等

低代码更新功能 新增: 1.下拉组件选项新增动态配置&#xff1b; 选项的内容可以根据特定的条件或数据源进行动态变化的功能&#xff0c;通过动态配置&#xff0c;用户可以灵活地设置下拉组件的选项内容&#xff0c;例如从数据库或其他数据源中获取选项数据&#xff0c;或者根…

AXglyph——轻量级科研绘图软件

今天博主将推荐一款简约却不简单的制图软件——axglyph。 AxGlyph是一款十分优秀的矢量绘图软件&#xff0c;官方版界面简洁&#xff0c;功能强大&#xff0c;支持自由矢量画笔、混合矢量路径和矢量漫水填充。支持自由定义的磁力点阵&#xff0c;支持插图编号及引用管理&#…

idea启动类运行后报错:Port 6380 was already in use.

问题原因&#xff1a; idea窗口中某个项目还在启动中时 误关了窗口&#xff0c;导致在其他项目运行时报错端口被占用 解决办法&#xff1a; 先杀掉占用端口&#xff0c;再重新启动 步骤如下&#xff1a; 1.先找到6380端口对应pid winr打开cmd命令行窗口 输入命令&#xf…

RT-Thread STM32F407 DMA

这里以串口的DMA方式接收为例&#xff0c;串口1进行调试&#xff0c;串口2进行DMA接收 第一步&#xff0c;进入RT-Thread Settings配置DMA 第二步&#xff0c;进入board.h&#xff0c;定义串口及DMA宏 第三步&#xff0c;回到main.c&#xff0c;配置串口及DMA模式 第四步…

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性&#xff0c;可以用来控制语音合成的过程&#xff0c;包括设置语音、音调、语速等。 下面是一个简单的示例&#xff0c;用来演示如何使用 …

专业的SRM系统全流程管理服务

一、什么是SRM系统 SRM系统&#xff0c;即供应商关系管理&#xff0c;是供应链管理中的重要组成部分&#xff0c;帮助企业与供应商建立、维护和改善业务关系&#xff0c;以实现双方共赢。本文将从供应商寻源到合同签订、订单履行、到付款及供应商评价等环节&#xff0c;阐述SR…