平衡二叉树、红黑树、B树、B+树

news2024/10/5 20:28:51

Tree

  • 1、前言
  • 2、平衡二叉树和红黑树
  • 3、B树和B+树
    • 3.1、B树的构建
    • 3.2、B树和B+树的区别
    • 3.3、数据的存储方式

1、前言

本文侧重在理论方面对平衡二叉树、红黑树、B树和B+树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C++中的实现,我的上一篇文章平衡二叉树(AVLTree)有所介绍。

2、平衡二叉树和红黑树

平衡二叉树又称平衡二叉搜索树,由于是Adelson-Velsky and Landis二人发明的,所以又叫AVL树。平衡二叉树要求左右子树的高度差不能大于一。所以极限条件下,搜索的时间复杂度是O(logn)。但由于其调整起来十分麻烦,所以并不适用于经常需要进行插入和删除的环境。因此引入红黑树(也是二叉搜索树的一种)来解决这一问题。
红黑树,顾名思义是有红黑两种节点。然而对于红黑树的构成却有许多限制,我们先来看看这些限制。

  • 1、根节点必须是黑色的。
  • 2、不能有两个红节点构成亲子关系,即不能有两个连在一起的红节点。
  • 3、从任意节点到叶子节点的所有路径都包含相同数目的黑节点。
  • 4、所有叶子节点都是黑色的,这里的叶子节点指的是最末端的虚拟节点(NULL节点)。个人觉得,设置这些虚拟节点,是为了使限制3不失一般性。

通过以上四点设置便可以限制左右子树的高度差在一倍之内。我们不妨设一种极限情况,从根节点出来的左路径全是黑节点,右路径全是红黑交叉的节点。那么由于红节点不能两两相连,且右路径的黑节点数必须和做路径相同,所以右路径的节点是顶多是左路径的两倍。
在这里插入图片描述
如果把所有红色节点擦除,那么N个黑色节点所构成的必然是一颗平衡二叉树,搜索时的时间复杂度是logn。那么加上所有红色节点,由于极限情况下,最长路径是纯黑色节点的两倍。故而搜索时间复杂度是2logn,忽略常数项,那么复杂度还是O(logn)。
此外,基于红黑树的限制条件,在插入一个新的节点之后,红黑树的调整次数通常较少,大多数情况下不超过三次旋转。这是因为红黑树的设计允许它在维持平衡的同时允许某种程度的不完全平衡,因此调整的复杂性和频率通常低于AVL树。
至于如何插入节点,仅作了解吧。
首先,除了根节点之外,任何新增的节点都先被视为红节点,然后再进行以下判定。请添加图片描述
这里的左旋右旋具体时如何操作的,和平衡二叉树那里基本差不多,所以不赘述了。
由于红黑树在搜索中,时间复杂度是O(logn),且插入节点所需的调整的频率也低于AVL树,所以应用比较广泛。如C++中map和set这两种容器的底层就是红黑树。
以map为例,在C++中,map和python的字典很想,其第一个元素被视为key,第二个元素被视为value。而key是不允许修改和重复的,存储key的数据结构正式红黑树。这也保证了map在搜索时,时间复杂度为O(logn)。

using namespace std;

map<int, int> myMap;
myMap[0] = 5;
myMap[1] = 7;

当然map也允许key是字符串类型,但即使是字符串类型,其还是会以红黑树的方式进行存储。只不过不再此时要按照字典顺序进行排序。

map<string, int> myMap1;
map<string, string>	myMap2;

3、B树和B+树

B树和B+树都是被广泛应用的数据结构。它们最显著的特征便是每一个节点可以存放多个数据,且可以有N个子树。下图是B树的示意图。
在这里插入图片描述
在构建一棵B树的时候,需要预先定义它的阶数m,限制一个节点至多存放m-1个值,并且也表明一个节点至多可以有m个子树。故而B树也可以被叫做m叉树。
一颗m叉树的每一个节点大概长这样。
在这里插入图片描述
n表示这个节点存放n个数据,k1,k2,…,kn-1是这个节点存放的数据,这些数据从小到达依次排序。p0,p2,…,pn是指向子树的指针。其中p0所指的子树的值全部在0和k1之间,p1所指子树的值全部在k1和k2之间,以此类推。

3.1、B树的构建

为了方便演示,我所展示的一个B树是一棵三叉树,即m=3。然后我依次插入1,3,5,2。流程图如下,当我们插入的数大于3个数的时候,变会取中间的值变成一个新的节点。当然我应该再演示一下它有三个子树的情况,但已经懒得画了。。。
在这里插入图片描述
总之B树的构建大抵如此。
其实B树更像是在2叉树和单链表之间妥协的产物。因为在每一个节点上进行搜索,其实就相当于在链表上进行搜索,所以当m取很大的时候,其搜索时间复杂度就接近一个链表了。当然由于其是一个有序的链表,我们在节点上也可以进行二分查找以降低复杂度。总而言之,m的取值是两种数据结构的权衡,故而也很重要。

3.2、B树和B+树的区别

顾明思意B+树事B树的升级版,克服了B树的许多缺点,有更高的搜索效率。但它们之间的较量关乎内存和磁盘,我放在最后讲。先来看看B树和B+树在构成上的区别。

  • 1、B+树的每一个子节点都会存储父节点的key,这里的key就是图中节点的值。
  • 2、B+树的所有叶子节点(末端的那些节点)通过指针串在一起。因而B+树除了随机搜索的方式(从根节点开始搜索),还多了一种顺序搜索方式(直接从叶子节点开始按顺序搜索)。

在这里插入图片描述
以上两点就是B树和B+树从观感上比较明显的差别。但其核心差距还是在存储方式上。

3.3、数据的存储方式

前文反复提到了B树和B+树节点中存放的数字是一个key,key有钥匙的含义。之所以这样叫,是因为key是访问另一个信息的钥匙。以B树为例,很多时候,节点中的key存放的看似是一个数字,其实是一个段文本信息的代表。而如果希望这些文本信息不至于在程序结束的时候随着程序而丢失,我们就需要将其放入磁盘当中。
在这里插入图片描述
这就涉及到一些操作系统的知识。我们在运行一个程序的时候,实际上是在RAM(Random Access Memory)上开辟一块区域,此时如果需要读取看到磁盘中的内容,就需要通过I/O操作以block为单位去把磁盘中的内容加载进RAM中。这里的block是数据读取的最小单位。在B树中,一般一个节点的数据,包括key,key指向的文本信息,指针等都放在同一个block中。这样block存储的key就不会很多,那么搜索一个信息的时候就不得不读取很多个block,进行很多次I/O操作。而I/O操作时非常费时的。
在这里插入图片描述
为了解决这个问题,B+树在非叶子节点(末端节点)上,只存放key,而把各个节点key对应的文本信息都存放到最后一个叶子节点上。通过这样的操作,每个block,即每个非叶子节点能存放的key就大大增多。当我们搜索一个信息的时候,需要经过的节点就减少了,从而I/O操作的频率也随之降低,进而提高了搜索效率。这便是B树和B+树的核心区别。

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

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

相关文章

【openLooKeng-1.10.0集群环境安装部署】

openLooKeng-1.10.0集群环境安装部署 一、摘要二、正文1. 环境说明2. 集群拓扑图3. 安装过程(以root用户安装)3.1 在Coordinator和Worker两个节点都需要安装jdk1.8+3.2 在Coordinator上安装配置openLooKeng3.3 在Worker节点上进行配置openLooKeng3.4 在Coordinator节点上先启…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

FineBi中创建自定义的图表

FineBi中增加自己的自定义图表组件,比如: 的相关笔记: 1 获取有哪些BI自定义图表组件:http://localhost:8080/webroot/decision/v5/plugin/custom/component/list?_=1713667435473[{"name": "图表DEMO_EK","chartType": "amap_demo&q…

知识付费平台的搭建重点,会用到哪些三方服务?

知识付费平台的搭建重点主要包括以下几个方面&#xff1a; 确定目标用户群体&#xff1a;首先需要明确平台的目标用户是谁&#xff0c;他们有什么样的学习需求和付费习惯。这有助于为平台制定合适的内容策略和推广策略。内容策划与制作&#xff1a;知识付费平台的核心是内容&a…

AOI在SMT生产线的关键作用

在SMT&#xff08;表面贴装技术&#xff09;的生产过程中&#xff0c;AOI&#xff08;自动光学检测&#xff09;技术发挥着不可替代的作用。通过本文&#xff0c;我们将深入探讨AOI在提升SMT生产线效率和产品质量方面的关键优势。 AOI技术在SMT生产线的核心作用 精确检测元件位…

柱形图“变个装”,跟上时尚步伐!

前言 职场中&#xff0c;日报、周报、月报、年度总结&#xff0c;都离不开图表的制作&#xff0c;而柱状图又是最常用的一种&#xff0c;怎样的柱状图&#xff0c;才能让领导更容易阅读&#xff0c;甚至是眼前一亮呢&#xff1f;今天小编就将为大家介绍一下如何借助葡萄城公司…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

JavaEE——spring MVC请求处理

目录 主要目的&#xff1a; 1. Spring web 项目搭建 2. 添加依赖 3. 配置插件 4. 配置设置类 5. 编写controller层类 6. 编写测试的http请求 主要目的&#xff1a; 创建一个spring web项目&#xff1b; 创建控制类&#xff1b; 掌握如何配置MVC&#xff1b; 编写htt…

前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法

目录 1. 引言2. 跨源资源共享和实现方法3. 在Django项目中配置django-cors-headers库Reference 1. 引言 在进行后端API开发时&#xff0c;有时会遇到“跨域资源共享 (CORS) 请求…被阻止“的错误&#xff0c;如图1所示。本文讲解如何在使用DRF&#xff08;Django REST Framewo…

区块链技术与应用学习笔记(12-13节)——北大肖臻课程

目录 12.BTC-匿名性 一、什么是匿名&#xff1f; 1&#xff0c;有可能破坏比特币匿名性的两个方面 2&#xff0c;如何提高匿名性 一个比特币用户能采用什么样的方法尽量提高个人的匿名性? 分解&#xff1a; 1、网络层怎么提高匿名性? 2、应用层怎么提高匿名性? 零知…

微信小程序开发:1.微信开发者工具应用

app.json文件作用 pages 记录所有的页面路经 window 全局定义小程序样式 style v2代表使用全新样式 sitemapLocation 指名sitemap.json存放路经 Project.config.json 是项目配置文件&#xff0c;用来记录我们对小程序个性化配置 setting保存了编辑相关配置projectna…

mac 教程 终端如何拆墙

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

FFmpeg下载教程(Windows版)

文章目录 下载地址步骤 下载地址 https://ffmpeg.org/download.html 步骤

保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库

离线在银河麒麟高级操作系统v10安装mysql5.7 下载mysql5.7 MySQL :: Download MySQL Community Server (Archived Versions) 2、把下载好的包上传到服务器 3、解压 [root1-0001 ~]# cd /data/mysql[root1-0001 mysql]# tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型.检索增强的大语言模型输入优化策略.指令微调策略.预训练策略.总结应用建议未来方向大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径上具…

算法项目(9)—— 大模型实现PDF检索加QA

本文包含什么? 使用大语言模型进行多个PDF问答检索加QA.gradio实现的网页界面操作,全套代码以及代码介绍运行有问题? csdn上后台随时售后.项目说明 本项目实现使用大语言模型为核心,gradio框架,调用vicuna实现多个pdf QA 代码运行 python3 main.pyimport gradio as gr fr…

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码&#xff0c;解压即可食用&#xff0c;支持在本地浏览器打开。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护

【中级软件设计师】上午题12-软件工程&#xff08;2&#xff09; 1 系统测试1.1 单元测试1.2 集成测试1.2.1 自顶向下1.2.2 自顶向上1.2.3 回归测试 2 测试方法2.1 黑盒测试2.1.1 McCabe度量法 2.2 白盒测试2.2.1 语句覆盖-“每个流程”执行一次2.2.2 判定覆盖2.2.3 条件覆盖-A…

LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。 这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。 在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真…