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

对红黑树、跳表、B+树的一些理解

文章目录

      • 红黑树
        • 应用场景
      • 跳表
        • 使用场景
      • B+树
        • 使用场景

毫无疑问数据结构是复杂的,让人头大的,大学时唯一挂科的就是数据结构,上学时不用心,不晓得自己的职业生涯要一直被数据结构支配。

或多或少,面试抱佛脚时,数据结构都会背一背刷一刷,HashMap的红黑树,Redis的跳表一个个都跑不了。

当回归日常时,学习及理解数据结构真的有什么收益吗

举个例子,最近看到IO多路复用的时候,说到select,poll与epoll对比

有两个点
1.epoll通过维护一个链表来记录就绪事件,无需遍历所有文件描述符来获取所有就绪事件,而是通过事件通知机制,将就绪事件添加到链表中,epoll_wait()函数获取所有就绪事件。

int s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, ...);
listen(s, ...)int epfd = epoll_create(...);
epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1) {int n = epoll_wait(...);for(接收到数据的socket){//处理}
}

2.epoll通过红黑树来维护所有文件描述符。
在这里插入图片描述

当我看到第2点时,反应是居然是你,真的有你,可算再次遇到你了,除了HashMap中,终于又和你体会到了铺面而来的重逢喜悦感,另外带着一种原来你真的挺有用的欣慰感。

红黑树、B+树以及跳表这三个数据结构,之前在我心目中,地位是一样的,需要面试的时候,对于他们我口若悬河,头头是道,而日常开发就是,对不起,我们好像不太认识。

红黑树HashMap,B+树MySQL索引,跳表Redis跳表,我几乎快要把他们画等号了,背后的原理,为什么是这样的,却从来都想不起再去深究。

随着开发的生涯越走越远,我很欣慰自己没有原地踏步,那么为什么呢?

红黑树

红黑树不算是严格的二叉平衡查找树,标准的二叉平衡查找树父子上下节点的高度最大不会超过1,为了维护这个平衡,当新增或者删除数据时,标准的平衡二叉查找树需要耗费更多的资源,不可避免需要进行多次旋转。
红黑树使得二叉查找树能保持大体的平衡,不至于退化成链表,又不至于频繁的转换操作,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

红黑树在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。所以红黑树适用于搜索,插入,删除操作较多的情况。

应用场景

红黑树常用于存储内存中的有序数据,增删很快,内存存储不涉及 I/O 操作。

  • HashMap
  • IO多路复用-epoll
  • Linux公平调度器

跳表

1.对有序列表查询性能的优化。

2.跳表的基本思想是将有序链表分层,每个节点在不同层中拥有不同数量的前向指针。上层链表是下层链表的子集,且上层链表中的元素顺序与下层链表一致。

3.通过增加指针和添加层级的方式,跳表可以实现对数级别的查找效率。

4.实现简单

原以为除了Redis ZSet中,也不会再见到跳表了,直到看到LevelDB时,了解到其Memtable中使用的也是跳表实现。

使用场景
  • Redis zset
  • LevelDB底层数据结构

B+树

号称为文件系统而生的数据结构。

多路平衡二叉树,选用B+树最大的理由,我理解是树的高度,高度,还是tm的高度。
B+树只需要3层就能存储大约2kw的数据,定位一个数据,也就是页大的读取IO次数,最多3,4次,换成红黑树或者跳表,大概需要10倍左右;
对于文件系统、数据库的场景,需要从磁盘读取数据,IO的耗费相对于内存来说是不可接受的。

使用场景

B+ 树在处理磁盘I/O、范围查询和大数据量管理方面优势明显

  • 数据库:MySQL innodb索引,PostgreSQL索引,Oracle索引等基本主流的数据库
  • 文件系统:NTFS、ReiserFS、大名鼎鼎的HDFS等文件系统

相关文章:

对红黑树、跳表、B+树的一些理解

文章目录 红黑树应用场景 跳表使用场景 B树使用场景 毫无疑问数据结构是复杂的,让人头大的,大学时唯一挂科的就是数据结构,上学时不用心,不晓得自己的职业生涯要一直被数据结构支配。 或多或少,面试抱佛脚时&#xff0…...

C++ deque 双端队列

deque原理介绍 deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)。 与vector比较,头插效率高,不需要搬移元素&#xf…...

Java | Leetcode Java题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; class Solution {Map<String, Integer> wordId new HashMap<String, Integer>();List<List<Integer>> edge new ArrayList<List<Integer>>();int nodeNum 0;public int ladderLength(String beginW…...

容器编排技术:现状、应用与未来

在当今的软件开发和运维中&#xff0c;容器技术已经成为一个核心组成部分。容器不仅改变了应用程序的开发、测试和部署方式&#xff0c;还推动了整个软件生命周期管理的革新。而容器编排技术作为容器管理和自动化的重要工具&#xff0c;进一步提升了容器的使用效率和灵活性。 …...

SQL158 每类视频近一个月的转发量/率

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:20011NULL210220012021-10-01 10:00:002021-10-01 10:00:15001NULL310320012021-10-01 11:00:502021-10-01 11:01…...

自动化办公01 smtplib 邮件⾃动发送

目录 一、准备需要发送邮件的邮箱账号 二、发送邮箱的基本步骤 1. 登录邮箱 2. 准备数据 3. 发送邮件 三、特殊内容的发送 1. 发送附件 2. 发送图片 3. 发送超文本内容 4.邮件模板内容 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议…...

Flutter 中的 ScrollConfiguration 小部件:全面指南

Flutter 中的 ScrollConfiguration 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 中&#xff0c;滚动是用户界面中一个常见的交互元素。ScrollConfiguration 是…...

网络网络层

data: 2024/5/25 14:02:20 周六 limou3434 叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.协议结构2.封装分离3.…...

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程&#xff01; 什么是Docker&#xff1f;看这一篇干货文章就够了&#xff01; UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#…...

el-table超过宽度强制显示滚动条

使用css强制显示&#xff1a; .el-table .el-table__body-wrapper::-webkit-scrollbar {display: block; }...

Vue3集成Phaser-飞机大战游戏(设计与源码)

文章目录 引言项目初始化游戏设计和结构游戏程序实现Vue页面嵌入PhaserPreloader 场景加载游戏场景功能实现功能类定义Boom爆炸类Bullet子弹类Enemy敌军类Player玩家类End游戏结束类 总结 更多相关内容可查看 引言 飞机大战&#xff08;也被称为射击游戏或空战游戏&#xff09…...

C51学习归纳1 --- led点亮、led闪烁、led流水灯

第一节主要是针对LED的控制学习。这个过程中我们需要掌握的&#xff1a;1、控制的实现方法&#xff0c;控制实现的方法在后续的学习中是通用的。2、如何知道谁控制谁&#xff0c;通过查找开发板原理图获取&#xff0c;原理图的阅读的能力&#xff0c;在日后也是非常常用的。 一…...

使用STM32和TB6600驱动器控制42BYGH步进电机

项目概述 1. 系统组成 STM32微控制器&#xff1a;作为主控制器&#xff0c;负责发出控制指令。TB6600驱动器&#xff1a;用于接收STM32的指令并驱动步进电机。42BYGH步进电机&#xff1a;作为执行元件&#xff0c;根据控制信号进行转动。电源&#xff1a;为STM32、TB6600和步…...

【Qt】对话框

文章目录 1 :peach:对话框介绍:peach:2 :peach:对话框的分类:peach:2.1 :apple:模态对话框:apple:2.2 :apple:非模态对话框:apple:2.3 :apple:混合属性对话框:apple: 3 :peach:Qt 内置对话框:peach:3.1 :apple:消息对话框 QMessageBox:apple: 1 &#x1f351;对话框介绍&#x…...

Python | 武理刷题

1. 为什么是非法的&#xff1f; a1a1 在Python&#xff08;以及大多数其他编程语言&#xff09;中&#xff0c;表达式 a1a1 是非法的&#xff0c;因为它试图将一个值&#xff08;a1 的结果&#xff09;赋给一个表达式&#xff08;a1 本身&#xff09;&#xff0c;而不是一个…...

如何设置让背景颜色不包括 padding 部分,顺带全面学习 background-clip 属性(可以实现文字渐变)

先解决需求 实现背景颜色不包括 padding 部分&#xff0c;直接给容器添加 css 属性&#xff1a;background-clip:content-box; 示例代码&#xff1a; .content-box-example {background-color: lightblue;padding: 20px;border: 1px solid black;background-clip: content-bo…...

Oracle 序列-SEQUENCE

文章目录 序列-SEQUENCE创建序列访问序列序列的修改和删除查询序列信息 序列-SEQUENCE 创建序列 访问序列 序列的修改和删除 DROP SEQUENCE SEQ_EKPO;查询序列信息 可以通过视图 dba/all/user_sequences 查询序列的相关信息 SELECT SEQUENCE_NAME FROM DBA_SEQUENCES WHERE …...

8岁儿童学编程基础好吗:探索早期编程教育的利与弊

8岁儿童学编程基础好吗&#xff1a;探索早期编程教育的利与弊 在数字化快速发展的今天&#xff0c;编程技能已成为一项重要的能力。许多家长开始思考&#xff0c;是否应该让8岁的孩子学习编程基础。这个问题看似简单&#xff0c;实则涉及多个层面的考量。下面&#xff0c;我们…...

vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法

小白写法嘿嘿 开发工具和关键词 开发工具&#xff1a; vscode 关键词&#xff1a;vue3、element-plus、axios 后端 后端业务逻辑处理使用的是unicloud的云函数&#xff0c;大家可以看我上一篇文章。 思路 1、禁止element-plus的el-upload组件自动上传&#xff0c;变成手动上传…...

面试题:谈谈你对观察者和订阅发布的理解

面试题&#xff1a;谈谈你对观察者和订阅发布的理解 1. 观察者设计模式 场景引入之杂志订阅&#xff1a;小王想要购买一本尚未出版的杂志&#xff0c;他向出版社预订该杂志并提供联系方式&#xff0c;一旦该杂志出版&#xff0c;出版社就会根据小王预留的联系方式通知他可以来…...

从零开始学SCL:手把手教你实现天塔之光、数码管显示等工业控制案例(含避坑指南)

从零开始学SCL&#xff1a;手把手教你实现天塔之光、数码管显示等工业控制案例&#xff08;含避坑指南&#xff09; 工业自动化领域中&#xff0c;PLC编程是核心技能之一。而SCL&#xff08;Structured Control Language&#xff09;作为IEC 61131-3标准中的高级文本语言&#…...

Phi-3 Forest Laboratory 与SpringBoot微服务整合:打造企业级AI中台

Phi-3 Forest Laboratory 与SpringBoot微服务整合&#xff1a;打造企业级AI中台 最近和几个做企业级应用开发的朋友聊天&#xff0c;大家不约而同地提到了同一个痛点&#xff1a;公司内部有好几个业务团队都想用上最新的AI能力&#xff0c;比如用Phi-3这样的模型做智能客服、文…...

告别SSH断连焦虑:用Tmux会话持久化拯救你的远程工作

远程开发者的救星&#xff1a;Tmux实战指南与高阶会话管理技巧 凌晨三点&#xff0c;服务器上的关键编译任务刚执行到一半&#xff0c;突然网络抖动导致SSH连接中断——这种令人抓狂的场景&#xff0c;每一位远程开发者都深有体会。传统终端会话的脆弱性让我们不得不反复重做工…...

AI系统-20AI芯片ISP视觉系统介绍

人有五感&#xff1a;眼睛、耳朵、鼻子、舌头和皮肤。 这些器官中的专门细胞和组织会接收原始刺激&#xff0c;并将其转化为神经系统可以使用的信号。 神经将信号传递到大脑&#xff0c;大脑将其解释为影像&#xff08;视觉&#xff09;、声音&#xff08;听觉&#xff09;、气…...

别再只盯着Loss曲线了!TensorBoard的SCALARS面板还有这些隐藏玩法(附GAN训练实战)

解锁TensorBoard SCALARS面板的隐藏战力&#xff1a;从GAN训练曲线中洞察模型灵魂 当你盯着GAN训练中那对纠缠不清的生成器和判别器Loss曲线时&#xff0c;是否感觉像在解读一部悬疑小说&#xff1f;TensorBoard的SCALARS面板远比大多数开发者想象的强大——它不仅是数据的展示…...

Granite TimeSeries FlowState R1赋能Java应用:商品销量预测微服务开发实录

Granite TimeSeries FlowState R1赋能Java应用&#xff1a;商品销量预测微服务开发实录 最近在做一个电商后台的优化项目&#xff0c;其中一个核心需求就是希望能提前知道商品未来一段时间的销量走势。老板想备货&#xff0c;运营想搞活动&#xff0c;都离不开这个数据。传统的…...

DeepSeek API实战:如何用Python脚本绕过Postman直接调用(附完整代码)

DeepSeek API高效调用指南&#xff1a;Python脚本开发实战 在当今快节奏的开发环境中&#xff0c;效率是衡量开发者生产力的关键指标。传统API测试工具如Postman虽然功能强大&#xff0c;但在自动化流程和持续集成场景中往往显得笨重。本文将带你探索一种更轻量、更灵活的解决方…...

GEMMA-3像素工作站效果展示:复古界面下的惊艳图像理解案例

GEMMA-3像素工作站效果展示&#xff1a;复古界面下的惊艳图像理解案例 1. 引言&#xff1a;当AI遇见像素艺术 在数字艺术与人工智能的交叉点上&#xff0c;GEMMA-3像素工作站创造了一种独特的体验。这款工作站将Google最先进的多模态大模型Gemma-3封装在一个充满90年代情怀的…...

PostgreSQL实战:使用pg_dump精准导出特定模式下的表结构

1. 为什么需要精准导出特定模式下的表结构 在实际的数据库管理工作中&#xff0c;我们经常会遇到只需要导出特定模式&#xff08;schema&#xff09;下表结构的需求。比如在微服务架构中&#xff0c;每个服务可能对应数据库中的一个模式&#xff1b;或者在进行数据库迁移时&…...

WindowsCleaner:智能化解救C盘空间危机的开源解决方案

WindowsCleaner&#xff1a;智能化解救C盘空间危机的开源解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 一、痛点剖析&#xff1a;C盘空间管理的深层困境…...