数据库:与红黑树不同的延迟序列

news2025/1/22 18:07:02

在内存里维护一个序列,可能第一个想到的就是红黑树。但是,红黑树算法复杂,这还不是主要的,主要的问题是:红黑树的空间利用率低。

红黑树的空间利用率

一个红黑树的节点,包括父节点指针、两个子节点指针、一个红黑属性、一条数据。其中,数据若是一个机器字,一般为8字节,则空间利用率是1/5。

但是,采用malloc函数分配内存时,还有两个数的开销。整体算下来,利用率是1/7。

延迟序列的使用场景

内存够用的时候,当然是红黑树更好。但是,当内存不足时,传统的数据库会启用硬盘上的数据结构。在这两者之间,是延迟序列的应用场景。即,用红黑树报告内存不足,但实际上内存还有6倍余量,这时,应使用“延迟序列”。

延迟序列的数据结构

初步的版本,由四个序列组成。三个原始序列,长度分别是100、1万、100万个数据,一个删除序列,长度为100个数据。这四个序列均预先分配,用指针指出首尾,避免realloc函数的使用。这个函数有时会把整个内存块完整地复制一遍,这很慢,需避免。
在这里插入图片描述
如图,红色长条表示删除序列,左侧的三个长条表示原始序列,它们的长度一个比一个长。

延迟序列的增删改查

这里没有用平衡二叉树存储序列,而是用数组。这导致在增加数据时,会产生批量的数据移动。例如,插入位置在数组的中间,则需要把后边的一半数据全都向后移动一格,再插入。

同理,若要删除一条数据,需要把后边的数据批量向前移动一格才可以。

当频繁插入、删除数据时,批量移动数据会显得很低效,不建议采用。所以,就有了延迟序列,它有“延迟插入、延迟删除”的特性。

当删除数据时,有一套方案是,暂时把数据改为0,表示删除了,过一会儿,或攒够了一定数量再整理。但是,0数据存在于序列中,会降低二分查找的效率,不推荐。所以,才有的一个单独的删除序列。

增加

在延迟序列里增加一条数据,先查看删除序列里有没有,如果有则删除它,就表示增加了数据。如果删除序列很长,甚至像原始序列那样有百万数据,则增加操作是缓慢的。所以,删除序列不宜过长,在初始的版本中,设计为100个数据。

若删除序列里没有,则在原始序列的第一层增加,使用插入排序,即接受小规模的批量移动数据。如果第一层满了,就引发归并排序,向第二层合并。如果第二层满了,就向第三层归并。

如果全满了,就报告内存不足。这时,应该像往常那样,启动硬盘上的数据结构,往硬盘里写。

删除

多数情况下,删除操作只是在不太长的删除序列里添加一项。当删除序列满了,就批量删除一次。由于删除序列也是有序的,所以应该叫归并删除?

查询

在延迟序列里查询一项,需要进行多个二分查找。先在原始序列的第一层查找,这里也是使用率最高的那些数据,根据数据的局部性原理,落在缓冲里的概率也较大。

若在第一层没找到,需要去第二层找。若还没找到,需要进第三层找。第三层里有百万数据,使用二分查找,需要找一阵子呢。最后,在删除序列里找,如果有则查找失败。

修改

大家熟悉的“增删改查”还有一个改,在序列中修改一个值,值的位置也会变化。所以“改”解释成先删除再增加,可否?

计算

据说,机械硬盘比内存慢百万倍,所以,原始序列里设计为100万个数据。即使执行插入操作,要把数据移动百万次,仍然比访问硬盘快。这只是个粗略的计算,固态硬盘的普及将改变这个数字,需要重新计算。

总结

在内存里维护一个序列,一般使用红黑树,但红黑树存在空间利用率低的缺点,所以,就有了“延迟序列”,它在红黑树内存满了以后、启动硬盘数据结构之前使用,能应付一阵子。

具体来说,要在红黑树内存即将满了,还没满的时候使用延迟序列。对红黑树进行中序遍历,把数据按顺序取出来,这也需要一部分内存。

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

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

相关文章

智慧校园发展趋势:2024年及未来教育科技展望

展望2024年及未来的教育科技领域,智慧校园的发展正引领着一场教育模式的深刻变革,其核心在于更深层次地融合技术与教育实践。随着人工智能技术的不断成熟,个性化学习将不再停留于表面,而是深入到每个学生的个性化需求之中。通过精…

SpringMVC系列七: 手动实现SpringMVC底层机制-上

手动实现SpringMVC底层机制 博客的技术栈分析 🛠️具体实现细节总结 🐟准备工作🍍搭建SpringMVC底层机制开发环境 实现任务阶段一🍍开发ZzwDispatcherServlet🥦说明: 编写ZzwDispatcherServlet充当原生的DispatcherSer…

电脑怎么录音?分享2种音频录制方法

在日常生活和工作中,我们经常需要录制电脑上的音频,无论是为了记录会议内容、保存网络课程,还是为了制作自己的音频素材,录音功能都显得尤为重要。那么电脑怎么录音?本文将详细介绍2种方法教你如何在电脑上进行录音&am…

如何避免接口重复请求(axios推荐使用AbortController)

前言: 我们日常开发中,经常会遇到点击一个按钮或者进行搜索时,请求接口的需求。 如果我们不做优化,连续点击按钮或者进行搜索,接口会重复请求。 以axios为例,我们一般以以下几种方法为主: 1…

二进制数转字符串

题目链接 二进制数转字符串 题目描述 注意点 32位包括输出中的 “0.” 这两位题目保证输入用例的小数位数最多只有 6 位 解答思路 将小数转为二进制的思路是将小数乘2,如果整数部分为1,则说明第i位是1(第i位则乘了2的几次方)…

STM32(七)———TIM定时器(基本and通用)

文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器:2.三种STM32定时器的区别:3.STM32 的通用定时器功能:4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…

无线备网,保障连锁零售数字化运营

为了提升运营效率、改进客户体验,零售商们不断引入新的数字化工具和平台,包括数字化收银、客流统计、客户关系管理系统等。现代化智慧零售的运营更加依赖于稳定、高效的网络连接,数字化网络不仅是提升运营效率和客户体验的关键,还…

iOS 18 Siri 升级之后都有哪些改变?

新界面 首先最显著的改变就是 Siri 的界面不同了,之前的界面是在打开 Siri 之后会出现一个圆形图案,而在 Siri 升级之后变成了屏幕边缘发出亮光。 来源:Apple 可在任意位置使用 苹果的生成式人工智能 Apple Intelligence 将为 Siri 提供支…

el-table 固定前n行 配合 max-height 生效

:row-class-name"TableRowClassName" 加上类名 <el-table:data"computedTableList"borderstyle"width: 100%":row-class-name"TableRowClassName"max-height"800"><el-table-column fixed prop"name"…

如何实现ElementUI动态表头?

可能看到这个标题,有些小伙伴会有些疑惑,动态表头是个什么东西,怎么没听说过? 其实动态表头在企业的项目中用途还是非常广泛的,比如erp系统什么的 那么动态表头是什么呢?说简单点就是让ElementUI的Table表格可以实现自定义表头展示+表头拖拽排序的一个功能 这个东西我…

嵌入式linux系统中SPI子系统driver与device分析02

大家好,本篇文件继续分析,linux系统重SPI数据结构体,它的实际运行原理与方法。 第一:SPI层次 第二:SPI子系统结构体关系图 spi_master ( spi_controller):对Soc的SPI控制器的抽象 spi_bus_type : spi的bus_type,代表了硬件上的SPI Bus spi_device : spi从设备 spi_d…

Java毕业设计 基于SSM助学贷款管理系统

Java毕业设计 基于SSM助学贷款管理系统 SSM 助学贷款管理系统 功能介绍 学生&#xff1a;登录 修改密码 学生信息 贷款项目信息 申请贷款 留言信息 公告 学校负责人&#xff1a;登录 修改密码 学生管理 学校负责人信息 贷款项目 贷款申请审批 留言信息 公告 银行负责人&…

如何在 Windows 中安装 Spire.PDF for Python

Spire.PDF for Python 是一款完全独立的 PDF 开发组件&#xff0c;用于在任何 Python 应用程序中读取、创建、编辑和转换 PDF 文件。本文将介绍如何在 Windows 中安装 Spire.PDF for Python。 最新python安装激活教程在下方&#xff1a; 步骤1 下载最新版的 Python 并将其安装…

opencv中文路径问题

目的 在windows系统上&#xff0c;就是直接用QT的utf8编码作为图片路径用在opencv读取或者写入函数&#xff0c;在路径当中含有中文时&#xff0c;会提示编码错误。 就是解决opencv中的中文路径的问题。 情况 代码如下&#xff1a; #pragma execution_character_set("…

【记录45】【案例】echarts 柱状图3D效果

环境 echarts4.1.0 <template> <!-- 商场各楼层统计 --><div id"threethree"></div> </template><script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {…

老A营销训练营(更24年5月),轻理论,重实战,轻概念,重本质(97节课)

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89388249 更多资源下载&#xff1a;关注我。 课程介绍&#xff1a; 课程来自课程来自老A的营销陪跑训练营。只适合中小企业和初创企业的老板或营销、市场、品牌等部门负责人及从业人员。不推荐没有营销…

深入JVM:线上服务性能问题诊断思路

文章目录 深入JVM&#xff1a;线上服务性能问题诊断思路一、序言二、常见线上性能问题三、诊断CPU使用率过高1、检查CPU高使用率进程2、导出线程堆栈信息3、深入识别高使用率线程4、高使用率线程信息定位 四、诊断服务响应时间过长1、诊断GC及内存问题2、诊断慢查询2.1 Arthas线…

打开nginx连接的php页面报错502

目录 问题描述&#xff1a; 原因&#xff1a; 1. 使用 Unix 域套接字&#xff08;Unix Socket&#xff09; 区别和优势&#xff1a; 2. 使用 TCP/IP 套接字 区别和优势&#xff1a; 如何选择 扩展&#xff1a;Rocky_Linux9.4安装PHP的步骤&#xff1a; 使用Remi存储库…

小程序餐饮点餐系统,扫码下单点菜,消费端+配送端+收银端+理端

目录 前言&#xff1a; 一、小程序功能有哪些 前端&#xff1a; 管理端&#xff1a; 二、实体店做小程序的好处 方便快捷的点餐和支付体验&#xff1a; 扩大店铺的曝光度和影响力&#xff1a; 优化顾客体验和服务质量&#xff1a; 降低成本和提高效率&#xff1a; 数据…

IDEA debug 调试Evaluate Expression应用

链接&#xff1a; https://blog.csdn.net/xfx_1994/article/details/104136849?utm_mediumdistribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_v2~rank_aggregation-2-104136849.pc_agg_rank_aggregation&utm_termidea%E4%B8%ADevaluate&s…