二叉搜索树、B-树、B+树

二叉搜索树

二叉查找树,也称为二叉搜索树、有序二叉树或排序二叉树,是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 任意节点的左、右子树也分别为二叉搜索树;

在这里插入图片描述
如果二叉查找树是平衡的则查找、插入的时间复杂度为O(logn)。如果二叉查找树完全不平衡则时间复杂度为O(n)。

中序遍历二叉搜索树可以获得关键字的递增序列

二叉搜索树的查找算法

在二叉查找树b中查找x的过程为:

  1. 若b是空树,则搜索失败,否则:
  2. 若x等于b的根节点的值,则查找成功;否则:
  3. 若x小于b的根节点的值,则搜索左子树;否则:
  4. 查找右子树。

二叉搜索树的节点插入算法

向一个二叉搜索树b中插入一个节点s的算法,过程为:

  1. 若b是空树,则将s所指节点作为根节点插入,否则:
  2. 若s->data等于b的根节点的值,则返回,否则:
  3. 若s->data小于b的根节点的值,则把s所指节点插入到左子树中,否则:
  4. 把s所指节点插入到右子树中。(新插入节点总是叶子节点)

二叉搜索树的节点删除算法

  1. 若待删除节点*p为叶子节点则直接删除即可
  2. 若待删除节点*p只有左子树PL或右子树PR,则当*p是左子树(右子树)时直接令PL或PR成为其父节点*f的左子树(右子树)
  3. 若待删除节点*p的左子树或右子树均不为空,
    • 其一是令*p的左子树为*f的左/右(依*p是*f的左子树还是右子树而定)子树,*s为*p左子树的最右下的结点,而*p的右子树为*s的右子树;
    • 其二是令*p的直接前驱或直接后继替代*p,然后再从二叉查找树中删去它的直接前驱(或直接后继)。
      在这里插入图片描述

AVL树

AVL树得名于它的发明者格奥尔吉·阿杰尔松-韦利斯基和叶夫根尼·兰迪斯,他们在1962年的论文《An algorithm for the organization of information》中公开了这一数据结构。

AVL树是一种自平衡二叉搜索树,在AVL树中任一节点对应的两棵子树的最大高度差为1,查找、插入和删除在平均和最坏情况下的时间复杂度都是O(log n),增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。

平衡因子:节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。

旋转操作:

  • 右旋
    在这里插入图片描述
  • 左旋
    在这里插入图片描述

需要平衡的四种情况:
在这里插入图片描述

B-树

参考文章

B-树就是B树,中间的横线并不是减号

为什么数据库索引使用B-树而不是二叉搜索树?
考虑磁盘IO的问题,数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多,当我们利用索引查询的时候只能逐一加载每一个磁盘页这里的磁盘页对应索引树的节点,最坏情况下磁盘IO次数等于索引树的高度,所以需要把原本“瘦高”的树结构变得“矮胖”,这就是B-树的特征之一。

B树是一种多路平衡查找树,每个节点最多可以包含k个孩子,k为B树的阶(k的选择取决于磁盘页大小)

在这里插入图片描述

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

  1. 若根节点不是叶子节点则至少有两个子节点
  2. 每个中间节点都包含 k-1 个元素和 k 个孩子,其中 ⌈m/2⌉ <= k <= m
  3. 每个叶子节点都包含 k-1个元素,其中⌈m/2⌉ <= k <= m
  4. 所有的叶子节点都位于同一层
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素刚好是k个孩子包含的元素的值域分划。

B-树主要应用于文件系统以及部分数据库索引,比如著名的非关系型数据库MongoDB,大部分关系型数据库比如Mysql则使用B+树作为索引。

B树的插入操作

参考博客
插入操作是指插入一条记录,即(key, value)的键值对。如果B树中已存在需要插入的键值对,则用需要插入的value替换旧的value。若B树不存在这个key,则一定是在叶子结点中进行插入操作。

1)根据要插入的key的值,找到叶子结点并插入。

2)判断当前结点key的个数是否小于等于m-1,若满足则结束,否则进行第3步。

3)以结点中间的key为中心分裂成左右两部分,然后将这个中间的key插入到父结点中,这个key的左子树指向分裂后的左半部分,这个key的右子支指向分裂后的右半部分,然后将当前结点指向父结点,继续进行第3步。( 当阶数m为偶数时,需要分裂时就不存在排序恰好在中间的key,那么我们选择中间位置的前一个key或中间位置的后一个key为中心进行分裂即可。 )

以5阶B树为例,介绍B树的插入操作,
在5阶B树中,结点最多有4个key,最少有2个key。

  1. 在空树中插入39
    在这里插入图片描述
    此时根结点就一个key,此时根结点也是叶子结点
  2. 继续插入22、97、41
    在这里插入图片描述
    根结点此时有4个key
  3. 继续插入53
    在这里插入图片描述
    插入后超过了最大允许的关键字个数4,所以以key值为41为中心进行分裂,结果如下图所示,分裂后当前结点指针指向父结点,满足B树条件,插入操作结束。(当阶数m为偶数时,需要分裂时就不存在排序恰好在中间的key,那么我们选择中间位置的前一个key或中间位置的后一个key为中心进行分裂即可。)
    在这里插入图片描述
  4. 依次插入13、21、40
    在这里插入图片描述
    同样会造成分裂,结果如下图所示。
    在这里插入图片描述
  5. 依次插入30、27、 33 ;36、35、34; 24、29
    • 插入 30、27、 33
      在这里插入图片描述
    • 插入 36、35、34;
      在这里插入图片描述
      在这里插入图片描述
    • 插入24、29
      在这里插入图片描述
  6. 插入26
    在这里插入图片描述
    当前结点需要以27为中心分裂,并向父结点进位27,然后当前结点指向父结点,结果如下图所示。
    在这里插入图片描述
    进位后导致当前结点(即根结点)也需要分裂,分裂的结果如下图所示。
    在这里插入图片描述
    分裂后当前结点指向新的根,此时无需调整。
  7. 最后再依次插入key为 17、28、31、32 的记录
    在这里插入图片描述
    在这里插入图片描述

B树的删除操作

删除操作是指,根据key删除记录,如果B树中的记录中不存对应key的记录,则删除失败。

  1. 如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步
  2. 该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。
  3. 如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。
    否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。
    有些结点它可能即有左兄弟,又有右兄弟,那么我们任意选择一个兄弟结点进行操作即可。

以5阶B树为例,介绍B树的删除操作
5阶B树中,结点最多有4个key,最少有2个key

  1. 原始状态
    在这里插入图片描述
  2. 在上面的B树中删除21,删除后结点中的关键字个数仍然大于等2,所以删除结束
    在这里插入图片描述
  3. 在上述情况下接着删除27。从上图可知27位于非叶子结点中,所以用27的后继替换它。从图中可以看出,27的后继为28,我们用28替换27,然后在28(原27)的右孩子结点中删除28。删除后的结果如下图所示。
    在这里插入图片描述
    删除后发现,当前叶子结点的记录的个数小于2,而它的兄弟结点中有3个记录(当前结点还有一个右兄弟,选择右兄弟就会出现合并结点的情况,不论选哪一个都行,只是最后B树的形态会不一样而已),我们可以从兄弟结点中借取一个key。所以父结点中的28下移,兄弟结点中的26上移,删除结束。结果如下图所示。
    在这里插入图片描述
  4. 在上述情况下接着删除32,结果如下图。
    在这里插入图片描述
    当删除后,当前结点中只有一个key,而兄弟结点中也仅有2个key。所以只能让父结点中的30下移和这个两个孩子结点中的key合并,成为一个新的结点,当前结点的指针指向父结点。结果如下图所示。
    在这里插入图片描述
    当前结点key的个数满足条件,故删除结束。
  5. 上述情况下,我们接着删除key为40的记录,删除后结果如下图所示。
    在这里插入图片描述
    同理,当前结点的记录数小于2,兄弟结点中没有多余key,所以父结点中的key下移,和兄弟(这里我们选择左兄弟,选择右兄弟也可以)结点合并,合并后的指向当前结点的指针就指向了父结点。
    在这里插入图片描述
    同理,对于当前结点而言只能继续合并了,最后结果如下所示。
    在这里插入图片描述
    合并后结点当前结点满足条件,删除结束。

B+树

参考文章
B+树是B-树的一种变体,有着比B-树更高的查询性能
一个m阶的B+树具有如下几个特征:

  1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点
  2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)的元素

在这里插入图片描述
在B-树中无论是中间节点还是叶子节点都有卫星数据(牵引元素所指向的数据记录),而在B+树中只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。

B+树的优点

  • 单行查询
    在单元素查询的时候,B+树会自顶向下逐层查找节点,最终找到匹配的叶子节点。步骤与B-树类似,但是B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素,在数据量相同的情况下B+树比B-树更加“矮胖”查询IO的次数也更少。其次,B+树的查询必须最终查找到叶子节点,而B-树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点,因此B-树的查找性能不稳定(最好情况是根节点,最坏情况是叶子节点),而B+树的每次查找都是稳定的

  • 范围查询
    B-树的范围查询只能依靠繁琐的中序遍历,B+树的范围查询只需要在链表上做遍历即可

总结:

  1. 单一节点存储更多的元素,使得查询的IO次数更少。
  2. 所有查询都要查找到叶子节点,查询性能稳定。
  3. 所有叶子节点形成有序链表,便于范围查询。

红黑树

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop大数据应用:HDFS 集群节点缩容

目录 一、实验 1.环境 2.HDFS 集群节点缩容 二、问题 1.数据迁移有哪些状态 2.数据迁移失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署…

Windows系统安装GeoServe结合内网穿透实现公网访问本地位置信息服务

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

C语言学习笔记day8

一维数组冒泡排序法 1. 作用 将乱序的一维数组按照从小到大的顺序排列 2. 原理示意图 3. 代码 #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int a[5] {0};int len sizeof(a) / sizeof(a[0]);int i 0;int j 0;int tmp …

onnx 格式模型可视化工具

onnx 格式模型可视化工具 0. 引言1. 可视化工具2. 安装 Netron: Viewer for ONNX models 0. 引言 ONNX 是一种开放格式&#xff0c;用于表示机器学习模型。ONNX 定义了一组通用运算符&#xff08;机器学习和深度学习模型的构建基块&#xff09;和通用文件格式&#xff0c;使 A…

疫情网课管理系统|基于springboot框架+ Mysql+Java+Tomcat的疫情网课管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 ​编辑 学生功能模块 管理员功能 教师功能模块 系统功能设计 数据库E-R图设计 lun…

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

27-Java MVC 模式

Java空对象模式 实现范例 MVC模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式MVC模式用于应用程序的分层开发 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO 它也可以带有逻辑&#xff0c;在数据变化时更新控制…

WebRTC实现一对多直播模式和弹幕发送功能

在上一篇webrtc实现一对一音视频和类IM即时通讯中已经实现了一对一视频&#xff0c;大体上熟悉了WebRTC的基本用法以及它的会话流程。WebRTC的本质就是 P2P&#xff0c;即点对点的即时通讯&#xff0c;现在学习一下一对多直播模式。 粉丝福利&#xff0c; 免费领取C音视频学习资…

【机器学习】无监督学习:解锁数据中的潜在结构与关系

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

回到街头 - 数字时尚嘉年华:Web3的时尚未来,4月香港兰桂坊盛大启幕

随着区块链技术的不断发展&#xff0c;Web3世界正在逐渐改变我们的生活方式。作为这一变革的重要推动者&#xff0c;Vertex Labs荣幸地宣布&#xff0c;将在香港举办一场前所未有的“回到街头-数字时尚嘉年华”。这不仅是一场时尚与科技的完美结合&#xff0c;更是全球顶级IP和…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器&#xff0c;可以构建灵活高效的查询条件&#xff0c;可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xf…

代码+视频,R语言使用BOOT重抽样获取cox回归方程C-index(C指数)可信区间

bootstrap自采样目前广泛应用与统计学中&#xff0c;其原理很简单就是通过自身原始数据抽取一定量的样本&#xff08;也就是取子集&#xff09;&#xff0c;通过对抽取的样本进行统计学分析&#xff0c;然后继续重新抽取样本进行分析&#xff0c;不断的重复这一过程N&#xff0…

闯关升级游戏特点,闯关小程序游戏开发

闯关升级类游戏一直以来都备受玩家青睐&#xff0c;其独特的游戏性和吸引力让人们乐此不疲。这类游戏以挑战性关卡和角色成长为核心&#xff0c;让玩家在不断的冒险中获得成就感与乐趣。让我们一起深入探讨这类游戏的特点&#xff0c;以及为何它们如此受欢迎。 挑战性关卡设计…

java数据结构与算法刷题-----LeetCode55. 跳跃游戏

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n n n)&#xff0c;空间复杂度…

组件化开发

一、引言 Vue.js 的组件化开发是其核心特性之一&#xff0c;它允许开发者将复杂的界面拆分为可复用的、独立的、小的组件&#xff0c;从而提高开发效率和代码的可维护性。 二、关键点 1.组件的定义 在components下创建.vue文件timecard.vue用来编辑内容。 文件创建完毕后&am…

视频桥接芯片#LT8912B适用于MIPIDSI转HDMI+LVDS应用方案,提供技术支持。

1. 概述 Lontium LT8912B MIPI DSI 转 LVDS 和 HDMI 桥接器采用单通道 MIPI D-PHY 接收器前端配置&#xff0c;每通道 4 个数据通道&#xff0c;每个数据通道以 1.5Gbps 的速度运行&#xff0c;最大输入带宽高达 6Gbps。 对于屏幕应用&#xff0c;该桥接器可解码 MIPI DSI 18bp…

算法——贪心

「贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优」 贪心无套路 1. 分发饼干 贪心策略&#xff1a; &#xff08;1&#xff09;局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩 &#xff08…

中霖教育好吗?口碑怎么样?

中霖教育专注于教育培训&#xff0c;口碑是非常好的&#xff0c;尤其是近年来职业证书考试受到了广大学生和家长的关注&#xff0c;一个机构的好坏和口碑是大家考虑的首要因素。 1、看教学质量 中霖教育的教师都是有着丰富教学经验的&#xff0c;不仅掌握扎实的基础知识&…

JavaWeb:vue、AJax、ELement、maven、SpringBoot、、Http、Tomcat、请求响应、分层解耦

1 Vue 1.1 Vue介绍 VUE是前端框架&#xff0c;基于MVVM&#xff0c;实现数据双向绑定 框架是半基础软件&#xff0c;可重用的代码模型 1.2 Vue指令 <script src"js/vue.js"></script></head> <body><div id"id"><!--…

可视化搭建一个智慧零售订单平台

前言 智慧零售行业是在数字化浪潮中快速发展的一个领域&#xff0c;它利用先进的信息技术和大数据分析来提升零售业务的效率和顾客体验。智慧零售订单平台&#xff0c;具有跨平台、数据智能清洗和建模&#xff0c;以及更加丰富的数据展示形式等优势。智慧零售订单平台可以以文…
最新文章