当前位置: 首页 > news >正文

为何红黑树在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+树的平衡调整操作(如节点的分裂和合并)可能更复杂。
    在这里插入图片描述

相关文章:

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

为何红黑树在B/B树之上仍然占据重要地位&#xff1f; 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 &#x1f4a1;一个热爱分享高性能服…...

【算法专题突破】滑动窗口 - 水果成篮(13)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;904. 水果成篮 - 力扣&#xff08;Leetcode&#xff09; 题目有很长一段话&#xff0c;但是我们读一遍题目可以提炼转化出题目的要求 &#xff1a; 其实就是找出一个最长…...

Peppercontent.io:人工智能驱动的内容生成工具

【产品介绍】​ 名称 Peppercontent.io 成立时间​ 成立于2017年 具体描述 Peppertype.ai 是一种基于GPT-3的AI辅助工具&#xff0c;而GPT-3则是一种深度学习自回归语言模型。这一技术潜藏着巨大的潜力&#xff0c;可以立刻为企业和创作者提供创意内容&…...

docker镜像管理-实操

一.docker镜像管理 1.拉取镜像 docker image pull <repository>:<tag> 镜像名称和标签使用 : 进行分隔&#xff0c;如果省略了标签&#xff0c;则默认为 latest docker image pull nginx:latest 或者docker pull nginx:latest 拉取下来的镜像默认保存在&#xff1…...

SpringMVC-----JSR303以及拦截器

目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架&#xff0c;已经包含在JavaEE6.0中1。 JSR303通过在Bean属性中标…...

基于若依框架实现markdown在线编辑

基于若依框架实现markdown在线编辑 1. 下载mavon-editor npm install mavon-editor --save2. 打开main.js文件, 添加如下 // markdown组件 import { mavonEditor } from "mavon-editor"; import "mavon-editor/dist/css/index.css";// markdown组件 Vue…...

CentOS7上从0开始搭建Zookeeper集群

CentOS7上搭建Zookeeper集群 环境准备安装jdk安装zookeeper下载zookeeper解压zookeeper修改zookeeper配置文件 搭建zookeeper集群修改zoo.cfg文件添加myid文件启动zookeeper集群 环境准备 首先你需要准备三台zookeeper&#xff08;待会会讲zookeeper的安装流程&#xff09;&am…...

康耐视读码器DataMan软件详细使用步骤

1、 点击桌面已经安装好的 dataman 软件并打开 2、 打开之后,点击刷新,刷出来读码器的图标,双击进行连接,或者选中后,点击右下角 的连接。(也可先进行第 9—(2)步更改读码器的 IP,对应的连接对象也更改到同一网 段)如图 3、 连接之后,在设置 快速设置下面把实时显…...

408强化(番外)文件管理

有点看不下去书&#xff0c;408&#xff0c;哎好久没看了&#xff0c;死磕数学时完全不想看其他科目&#xff0c;数学分数也尚未质变。 突然想到一个好点子&#xff0c;只看大纲尝试回忆一下这章的内容。 文件就是为了方便用户使用&#xff0c;按名访问而提出的&#xff0c;从…...

iptables 防火墙配置

文章目录 iptables 防火墙配置规则链的分类–五链处理的动作iptables 常用参数和作用iptables 防火墙配置查看规则链清空规则链设置默认规则将流入的流量丢弃允许ICMP协议流量通过删除默认策略允许所以流量通过设置将所有流入22端口的流量全部拒绝允许指定网段的22端口通过设置…...

面试官:我们深入聊聊Java虚拟机吧

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 前言面试Java虚拟机内存模型垃圾收集器…...

【电源专题】案例:异常样机为什么只在40%以下电量时与其他样机显示电量差异10%,40%以上电量差异却都在5%以内。

本案例发生在一个量产产品的测试中,因为产品带电池,所以需要测试产品对于电池电量显示的精确程度。产品使用的是最简单的开路电压查表法进行设计。 案例测试报告的问题在于不同样机之间电量百分比存在差异,大部分是在3%~4%之间。但在7.2V电压时,能够差异10%左右。 在文章:…...

React 全栈体系(七)

第四章 React ajax 一、理解 1. 前置说明 React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react应用中需要集成第三方ajax库(或自己封装) 2. 常用的ajax请求库 jQuery: 比较重, 如果需要另外引入不建议使用axios: 轻…...

NVIDIA 显卡硬件支持的精度模式

很多炼丹师不知道自己英伟达显卡支持哪些精度模式&#xff0c;本文整理了NVIDIA官网的数据&#xff0c;为你解开疑惑。 1. 首先了解CUDA计算能力及其支持的精度模式&#xff1b; 2. 查看自己显卡&#xff08;或其它NVIDIA硬件&#xff09;的计算能力值为多少。 表1 CUDA计算…...

【Java|golang】210. 课程表 II---拓扑排序

一、拓扑排序的定义&#xff1a; 先引用一段百度百科上对于拓扑排序的定义&#xff1a; 对一个有向无环图 ( Directed Acyclic Graph 简称 DAG ) G 进行拓扑排序&#xff0c;是将 G 中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点 u 和 v &#xff0c;若边 <…...

STM32CubeMX systick bug?

发觉用新版&#xff08;V6.9.1&#xff09;的它生成代码&#xff0c;会有问题。可能是 BUG。具体如下&#xff1a; 一个简单的点灯程序&#xff0c;用 Keil MDK 5.38a&#xff08;compiler version 6&#xff09;编译。 如果在变量前&#xff0c;不加上关键字“volatile”&am…...

徐亦达机器学习:Kalman Filter 卡尔曼滤波笔记 (一)

P ( x t P(x_t P(xt​| x t − 1 ) x_{t-1}) xt−1​) P ( y t P(y_t P(yt​| x t ) x_t) xt​) P ( x 1 ) P(x_1) P(x1​)Discrete State DM A X t − 1 , X t A_{X_{t-1},X_t} AXt−1​,Xt​​Any π \pi πLinear Gassian Kalman DM N ( A X t − 1 B , Q ) N(AX_{t-1}B,Q)…...

Java和vue的包含数组组件contains、includes

List<String> tempList Arrays.asList("10018","1007","10017","1012"); if(tempList.contains(initMap.get("asset_type_id").toString())){// todo 计算运营终点桩号-起点桩号BigDecimal diffSum collectNum(col…...

OpenCV_CUDA_VS编译安装

一、OpenCV 我这里是下载的OpenCV4.5.4&#xff0c;但是不知道到在vs里面build时一直报错&#xff0c;后面换了4.7.0的版本测试&#xff0c;安装成功。 Release OpenCV 4.5.4 opencv/opencv GitHub 这个里面有官方预编译好的OpenCV库&#xff0c;可以直接食用。 扩展包&am…...

基于减法优化SABO优化ELM(SABO-ELM)负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

记录第一个启动代码的诞生

核使用R52&#xff0c;参考汇编模板&#xff0c;一步一步来实现。 首先是ld文件&#xff0c;这个没啥好说的&#xff0c;主要是关注给vector_table划一块地址、stack地址&#xff0c;如下&#xff1a; .text.intvec :{_vectors_start .;KEEP(*(.text.intvec))_vectors_end .;…...

基于STM32的简化版智能手表

一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目&#xff0c;使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换&#xff0c;搭配DHT11&#xff0c;RTC&#xff0c;LED&#xff0c;KEY等器…...

揭秘弹幕游戏制作

最近好多人问弹幕游戏&#xff0c;甚至是招人的也要DOTS做弹幕游戏... 实际上目前的弹幕游戏绝大多数应该和DOTS没有半点关系&#xff0c;别忘了DOTS这项技术渲染问题还没能够被合理解决呢 所以目前用的全都是GPU Instance这项技术&#xff0c;于是乎我决定下场写这篇帖子&am…...

2327. 知道秘密的人数;1722. 执行交换操作后的最小汉明距离;2537. 统计好子数组的数目

2327. 知道秘密的人数 核心思想&#xff1a;动态规划&#xff0c;每天的人可以分为三种&#xff0c;可分享秘密的人&#xff0c;不可分享秘密的人&#xff0c;忘记秘密的人。定义f[i]为第i天可分享秘密的人&#xff0c;那么第(idelay ,iforget)天&#xff0c;会增加f[i]个可分…...

【TCPDF】使用TCPDF导出PDF文件

目录 一、安装TCPDF类库 二、安装字体 三、使用TCPDF导出PDF文件 目的&#xff1a;PHP通过TCPDF类库导出文件为PDF。 开发语言及类库&#xff1a;ThinkPHP、TCPDF 效果图如下 一、安装TCPDF类库 在项目根目录使用composer安装TCPDF&#xff0c;安装完成后会在vendor目录下…...

MacBook苹果电脑重装、降级系统

1、下载balenaEtcher镜像启动盘制作工具 https://tails.net/etcher/balenaEtcher-portable.exe 2、选择从文件烧录选择下载好的Mac 镜像文件 百度网盘 请输入提取码&#xff08;Mac OS 10.10-12版本镜像文件&#xff09; 第二步选择目标磁盘&#xff0c;这里需要准备一块1…...

Java 解决long类型数据在前后端传递失真问题

问题&#xff1a;雪花算法的id长度为19位&#xff0c;前端能够接收的数字最多只能是16位的&#xff0c;因此就会造成精度丢失&#xff0c;得到的ID不是真正的ID。 解决&#xff1a; 在拦截器中加入Long类型转换&#xff0c;返回给前端string package io.global.iot.common.c…...

IDEA的快捷键大全

快捷键 说明 IntelliJ IDEA 的便捷操作性&#xff0c;快捷键的功劳占了一大半&#xff0c;对于各个快捷键组合请认真对待。IntelliJ IDEA 本身的设计思维是提倡键盘优先于鼠标的&#xff0c;所以各种快捷键组合层出不穷&#xff0c;对于快捷键设置也有各种支持&#xff0c;对…...

简单记一下Vue router 路由中使用 vue-i18n 进行标题国际化

引入状态管理和国际化文件 import store from ../store import i18n from /configs/i18n使用状态管理设置路由当前国际化选项 // 使用状态管理 i18n.locale store.state.setStore.i18n??zh路由中使用i18n { path: /login, name: login, component: LoginPage, meta: { ti…...

【Gitea】 Post “http://localhost:3000/api/internal/hook/pre-receive/aa/bbb“ 异常

引 使用 JGit 做了一个发布代码到 Gitea 的接口&#xff0c;使用该接口发布代码到 http://xxx-local/{name}/{project} &#xff0c;报了 Post "http://localhost:3000/api/internal/hook/pre-receive/{name}/{project} 相关的异常。具体内容如下&#xff1a; Gitea: In…...

佛山附近做网站的公司有哪些/太原搜索引擎优化招聘信息

文章目录1. 组件注册1.2 全局注册1.2 局部注册2. 组件间数据交互2.1 父组件向子组件传值2.2 子组件向父组件传值2.3 兄弟之间的传递3. 组件插槽3.1 匿名插槽3.2 具名插槽3.3 作用域插槽1. 组件注册 1.2 全局注册 Vue.component(组件名称, { })全局组件注册后&#xff0c;任何…...

如何管理好一个网站/360搜索建站

版本管理工具GIT篇 一、版本管理工具干什么用的? 备份文件 作用同U盘 网盘 保存每天的成果 若是本地文件丢失 损坏 找备份如 打游戏时候的存档记录历史网盘 U盘存储的是文件最新状态 历史操作没有 作用同 history命令 找到历史操作的版本 记录 修改时间 修改内容等(提交…...

wordpress 面包插件/在线培训网站次要关键词

我们知道目前很多应用系统中的内容传输协议采用的HTTP协议&#xff0c;因此不管你是前端人员、后端人员、运维人员&#xff0c;甚至是管理人员&#xff0c;都需要掌握HTTP知识&#xff01;&#xff01;HTTP发展历史 HTTP/0.9 该版本只有一个命令GET&#xff1b;没有HEADER等描…...

推荐手机网站建设/点击排名软件哪个好

2019独角兽企业重金招聘Python工程师标准>>> Apache/lighttpd: 相当于一个request proxy&#xff0c;根据配置&#xff0c;把不同的请求转发给不同的server处理&#xff0c;例如静态的文件请求自己处理&#xff0c;这个时候它就像一个web server&#xff0c;对于fas…...

大良营销网站建设行情/营销培训课程ppt

在python中&#xff0c;我想从一行中提取一个子字符串&#xff0c;但保留子字符串中出现的空格。例如&#xff0c;在下面的&#xff1a;Python提取子字符串&#xff0c;但保留空格34 -1 1 10 C2H4 OH C2H3 H2O 8.020E13 0.00 5955.035 -0.301029996 0.301029996 2 C2H3 O2 …...

长沙百度做网站多少钱/推广软件赚钱的平台

手机上有好用的时钟APP&#xff0c;时钟软件哪个好用? 每个人的手机屏幕都有着自己独特的设计&#xff0c;而时钟软件能够为用户的手机再增添一些风采和魅力&#xff0c;更有专为来年人设计的大字体桌面时钟&#xff0c;更加的清晰直观&#xff0c;各种特色的桌面时钟app中都有…...