为何红黑树在B/B+树之上仍然占据重要地位?

为何红黑树在B/B+树之上仍然占据重要地位?

  • 引言
  • 二、红黑树和B/B+树的基本原理
    • 2.1、红黑树的特点和性质
    • 2.2、B/B+树的特点和性质
    • 2.3、红黑树和B/B+树的比较
  • 三、B/B+树相对于红黑树的优势
  • 四、红黑树仍然占据重要地位的原因
  • 总结

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、数据结构与算法、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


引言

红黑树是一种具有平衡性质的二叉搜索树,它通过将节点着色为红色或黑色,并通过一组特定的规则来保持树的平衡。

  • 每个结点是红的或者黑的。
  • 根结点是黑的。
  • 每个叶子结点是黑的。
  • 如果一个结点是红的,则它的两个儿子都是黑的。
  • 对每个结点,从该结点到其子孙结点的所有路径上的 包含相同数目的黑结点 。

红黑树的平衡性能能够保证在最坏情况下的操作(插入、删除、查找)时间复杂度为O(log n)。

B/B+树是一种多路搜索树,主要用于在磁盘或其他多级存储介质上组织和管理大规模数据。一颗M阶B树T,满足以下条件:

  • 每个结点至多拥有M颗子树。
  • 根结点至少拥有两颗子树。
  • 除了根结点以外,其余每个分支结点至少拥有M/2课子树。
  • 所有的叶结点都在同一层上。
  • 有k课子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排序。
  • 关键字数量满足ceil(M/2)-1 <= n <= M-1。

B/B+树的平衡特性使得在大规模数据的增删改查操作中,其磁盘IO次数相对较少,能够提供更高的效率。

红黑树在数据结构中占据重要地位的原因包括其平衡性能、适用于索引结构、广泛应用于算法和数据处理,以及相对简单的实现方式。

  1. 红黑树在最坏情况下,红黑树的插入、删除和查找操作的时间复杂度都是O(log n)。
  2. 红黑树在算法和数据处理中广泛应用。例如,在图算法中,红黑树被用于存储顶点和边的关系,3. 以快速搜索和遍历图结构。
  3. 相对于其他平衡二叉搜索树数据结构,红黑树的实现方式相对简单。

二、红黑树和B/B+树的基本原理

2.1、红黑树的特点和性质

红黑树在二叉树的基础上具备如下的性质:

  • 每个结点是红的或者黑的。
  • 根结点是黑的。
  • 每个叶子结点是黑的。
  • 如果一个结点是红的,则它的两个儿子都是黑的。
  • 对每个结点,从该结点到其子孙结点的所有路径上的 包含相同数目的黑结点 。

满足以上性质的二叉树就是红黑树。其中第五条性质就决定了红黑树的平衡,它不像AVL树那样严格要求两边子树的高度差是1,而是要求黑色节点的高度一致即可。

从第四条和第五条的性质中,我们可以总结出一个数学结论:红黑树的根节点到叶子节点的最短路径与红黑树的根节点到叶子节点的最长路径之比是 1 : ( 2 × N − 1 ) 1: (2\times N - 1) 1:(2×N1)

在这里插入图片描述

2.2、B/B+树的特点和性质

对上面的六个性质进行精简描述一下:

  • 树开叉的数量上限是M颗,也就是定义了范围。
  • 形容M颗子树与Key值的关系。
  • 所有的叶子节点在同一层。
  • 除了根节点以外,每个节点最少有 M ÷ 2 M \div 2 M÷2 颗子树。

在这里再扩展一些知识:

  • B-tree / B tree:这种名称定义都是说的B树,不存在B"减"树这个数据结构。
  • B+tree:B树的所有节点都是存储数据的,B+树是B树的扩展或者变种,B+树的内节点不存储数据,只做索引,所有的数据都存储在叶子节点。此外,B+树适合范围查阅是由链表性质决定的。
  • B+树更适合做磁盘索引,性能优于B树;因为B+树的内结点不存储数据。同样的内存空间,B树的结点除了要存储key值,还要存储value值,所以B树的节点会比B+树的节点内存占用大,从而存储B树的节点会少于B+树的节点。

B树和B+树在使用场景上的差异说明:举个例子,假设有一个很大量的数据需要存储(比如100万个节点),内存上肯定无法全部存储,必然有很大部分在磁盘上。

  • 如果使用B树进行存储,由于每个节点都存储数据,必然有一部分节点存储在内存中,一部分节点存储在磁盘上。

  • 如果使用B+树存储,就有些不一样,由于B+树的内节点不存储具体数据,只做索引,所以B+树存储在内存中的节点数量会比B树多得多。所以,B+树做索引会更好,因为可以把所有的索引关系存储到内存中,然后通过一次性寻址找到存储具体数据的叶子节点。B树就无法做到这样,它只能一个节点一个节点的磁盘寻址。

B树和B+树都可以做索引,但是B+树更常用于做索引,特别是索引磁盘数据。比如MySQL、mongodb、PostgreSql等数据库的索引使用的就是B+树。
在这里插入图片描述

2.3、红黑树和B/B+树的比较

红黑树对于范围查询操作不如B/B+树高效。在红黑树中,需要进行中序遍历才能获取范围内的键值。B/B+树内部节点通过键值范围进行连接,因此在范围查询时,只需遍历相应的叶子节点链表即可,效率更高。

红黑树适用于内存中的高效搜索和平衡需求,而B/B+树适用于大规模数据的组织和管理,特别是在磁盘或其他多级存储介质中。

三、B/B+树相对于红黑树的优势

B/B+树在存储效率、范围查询效率、磁盘I/O优化、顺序访问性能以及分裂和合并操作效率等方面具有优势。这使得B/B+树成为在磁盘或其他多级存储介质上管理和组织大规模数据的一种重要的数据结构。

  1. B/B+树的节点可以存储多个键和对应的值,相比红黑树,每个节点能够容纳更多的数据。这样就减少了节点的数量,降低了存储空间的开销。
  2. B/B+树的内部节点通过键值范围进行连接,并且叶子节点通过链表连接在一起。这种结构的特点使得范围查询操作非常高效。只需遍历相应的叶子节点链表,而不需要像红黑树一样对整棵树进行中序遍历。
  3. B/B+树常用于在磁盘或其他多级存储介质上组织和管理大规模数据。B/B+树的分层结构使得在查找数据时只需进行少量的磁盘I/O操作,大大提高了访问速度。
  4. B/B+树中的键是按顺序存储的,这使得对数据的顺序访问效率非常高。对于需要顺序访问或顺序扫描大量数据的场景,B/B+树是一个很好的选择。

四、红黑树仍然占据重要地位的原因

  • 在最坏情况下,红黑树的插入、删除和查找操作的时间复杂度都是O(log n),对于需要快速的搜索和排序操作的场景非常重要。
  • 许多重要的数据结构和算法都是基于红黑树实现的,包括数据库系统、文件系统、编译器、图算法等。
  • 红黑树的实现比较简单。
  • 红黑树的性质非常稳定,插入和删除操作不会频繁地改变整棵树的结构。
  • 红黑树经过了充分验证和优化,已存在许多成熟的实现和优化方案。

总结

尽管红黑树可能导致树的高度相对较高,但其存储效率、数据局部性、平衡性能和范围查询效率等特点在内存中或需要更好的数据局部性时,红黑树更好。

  1. 相比B树或B+树,红黑树的节点结构相对简单,每个节点只需额外存储一个颜色位。
  2. 红黑树在插入和删除操作时能够通过旋转和重新着色来保持平衡性质。相比之下,B树或B+树的平衡调整操作(如节点的分裂和合并)可能更复杂。
    在这里插入图片描述

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

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

相关文章

Vue echarts 饼图 引导线加小圆点,文字分行展示

需求 重点代码 完整代码 initChart() {// 创建 echarts 实例。var myChartOne this.$echarts.init(this.$refs.Echart);myChartOne.setOption({tooltip: {trigger: "item",},title: {top: center,text: [{name| this.chartTitle.name },{value| this.chartTitle.…

ROS学习笔记(四)---使用 VScode 启动launch文件运行多个节点

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 一、什么是launch文件 虽然说Terminator终端是能够比较方便直观的看运行的节点…

2.10 PE结构:重建重定位表结构

Relocation&#xff08;重定位&#xff09;是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中&#xff0c;由于程序中使用了各种全局变量和函数&#xff0c;这些变量和函数的地址还没有确定&#xff0c;因此它们的地址只能暂时使用一个相对地址。当…

虚幻动画系统概述

本文主要整理一下高层次的概述&#xff0c;方便后续查阅 1.动画流程 DCC产出动画文件 -> UE动画导入 -> 动画蓝图驱动&#xff08;类似unity的动画状态机&#xff09; ->动画后处理蓝图驱动&#xff08;例如修型骨&#xff0c;骨骼矫正等后期处理&#xff09; 2.动…

数据结构与算法:树

目录 树 定义 结构 二叉树 定义 结构 形式 满二叉树 完全二叉树 存储 链式存储结构 数组 孩子节点 父节点 应用 查找 维持相对顺序 遍历 深度优先遍历 前序遍历 中序遍历 后序遍历 广度优先遍历 层序遍历 二叉堆 定义 自我调整 操作 插入加点 删…

左神算法之中级提升班(9)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析 平凡解技巧 从业务中分析终止条件 重点】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【动态规划代码】…

使用SSH地址拉取远程仓库代码报下面的错误

说明&#xff1a;配置了SSH秘钥后&#xff0c;使用SSH地址克隆代码&#xff0c;依旧无法拉取代码&#xff0c;提示下面这个信息。 Their offer&#xff1a;ssh-rsa&#xff0c;ssh-dss fatal&#xff1a;Could not read from remote repository. Please make sure you have the…

sqlserver2012性能优化配置:设置性能相关的服务器参数

前言 sqlserver2012 长时间运行的话会将服务器的内存占满 解决办法 通过界面设置 下图中设置最大服务器内存 通过执行脚本设置 需要先开发开启高级选项配置才能设置成功 设置完成之后将高级选择配置关闭&#xff0c;还原成跟之前一样 --可以配置高级选项 EXEC sp_conf…

开源库源码分析:Okhttp源码分析(一)

开源库源码分析&#xff1a;OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了&#xff0c;作为最常用的网络请求库&#xff0c;OkHttp以其强大的功能深受Android开发者的喜爱&#xff08;比如说我&#xff09;&#xff0c;还有对该库进行二次封装而成的热门库&a…

前端设计模式基础笔记

前端设计模式是指在前端开发中经常使用的一些解决问题的模式或思想。它们是经过实践证明的最佳实践&#xff0c;可以帮助我们更好地组织和管理我们的代码。 一、单例模式&#xff08;Singleton Pattern&#xff09; 单例模式是一种创建型模式&#xff0c;它保证一个类只有一个…

⑩ vue新特性

ref 或者reactive ref相当于data methods props和context props &#xff01;&#xff01;&#xff01;setup中没有this关键字&#xff0c;使用context&#xff08;简写&#xff1a;ctx&#xff09;就是this 在steup中使用生命周期函数 Provide / Inject 1、原来是 a传…

基于YOLOv2和传感器的多功能门禁系统

文章和项目源码已经归档至【Github仓库&#xff1a;https://github.com/timerring/face-recognition-door 】或者公众号【AIShareLab】回复 人脸识别门禁 也可获取。 文章目录 1.系统制作方案概述1.1系统设计的立意1.2系统的主要组成1.3系统的制作方案1.3.1制作方案框图1.3.2制…

python-xpath语法-爬取彼岸图4k高清动漫壁纸

安装 pip install lxml导入 from lxml import etreexpath使用路径表达式提取html文档中的元素或元素集&#xff0c;然后元素通过沿路径path或步steps来选取数据 XPath常用语法格式 表达式描述div选取div元素的所有子元素/div选取根元素divul//li选取ul元素下的所有li子元素…

大数据-玩转数据-oracel字符串分割转化为多列

一、建表 create table split_string_test(id integer primary key,test_string varchar2(500) );二、插入测试数据 insert into split_string_test values(1, 10,11,12,13,14,22); insert into split_string_test values(2, 22,23,24); insert into split_string_test valu…

TMS320F280049最小系统原理图

TMS320F280049最小系统原理图 1.概述2. 典型的 F2800x 系统方框图3. 最小系统原理图设计3.1 封装和器件决策3.2 电源及去耦电容3.3 晶振3.4 GPIO3.5 ADC模块3.6 JTAG 最近做了个新车规项目&#xff0c;第一次接触TMS320F280049&#xff0c;记录一下&#xff0c;最小系统原理图设…

PostgreSQL 事务并发锁

文章目录 PostgreSQL 事务大家都知道的 ACID事务的基本使用保存点 PostgreSQL 并发并发问题MVCC PostgreSQL 锁机制表锁行锁 总结 PostgreSQL 事务 大家都知道的 ACID 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常要求要么都成功&#xff0c;要么都失败。在关系…

Linux下运行Jmeter压测

一、在Linux服务器先安装SDK 1、先从官网下载jdk1.8.0_131.tar.gz&#xff0c;再从本地上传到Linux服务器 2、解压&#xff1a;tar -xzf jdk1.8.0_131.tar.gz&#xff0c;生成文件夹 jdk1.8.0_131 3、在/usr/目录下创建java文件夹&#xff0c;再将 jdk1.8.0_131目录移动到/u…

长胜证券:十大流通股东占比例高好还是低好?

近年来&#xff0c;跟着我国本钱商场的不断发展&#xff0c;越来越多的投资者开始了解和关注股东占比这个目标。而在股东占比中&#xff0c;十大流转股东的持股份额是一个重要的目标。可是&#xff0c;关于投资者来说&#xff0c;十大流转股东占比是高好还是低好&#xff1f;本…

微信小程序+echart实现点亮旅游地图

背景 最近看抖音有个很火的特效就是点亮地图&#xff0c;去过哪些地方&#xff0c;于是乎自己也想做一个&#xff0c;结合自己之前做的以家庭为单位的小程序&#xff0c;可以考虑做一个家庭一起点亮地图的功能。 效果图 过程 1&#xff0c;首先就是得去下微信小程序适配的ec…

牛客: BM4 合并两个排序的链表

牛客: BM4 合并两个排序的链表 文章目录 牛客: BM4 合并两个排序的链表题目描述题解思路题解代码 题目描述 题解思路 以链表一为主链表,遍历两条链表 若当前链表二的节点val小于当前链表一的下一个节点val,则将链表链表二的该节点连到链表一的节点的下一个,链表一的当前节点往…