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

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

红黑树的空间利用率

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

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

延迟序列的使用场景

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

延迟序列的数据结构

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

延迟序列的增删改查

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

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

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

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

增加

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

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

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

删除

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

查询

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

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

修改

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

计算

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

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集团门户网站的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,集团文化管理,基础数据管理,公告通知管理 前台账户功能包括:系统首页,个人中心,论坛&#xff0…

python小白兔做操 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python小白兔做操 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 小白兔们每天早上都到草坪上做早操。做操前,首先要按照身高由矮到高排个队,下列代码实现了排队的功能。首先读取小白兔的只数,然后读取每只小白兔的身…

鸿蒙实现金刚区效果

前言: DevEco Studio版本:4.0.0.600 所谓“金刚区"是位于APP功能入口的导航区域,通常以“图标文字”的宫格导航的形式出现。之所以叫“金刚区”,是因为该区域会随着业务目标的改变,展示不同的功能图标&#xff…

Android OTA 升级基础知识详解+源码分析

前言: 本文仅仅对OTA升级的几种方式的概念和运用进行总结,仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解: https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…

ubuntu的home内存不足的解决办法(win和ubuntu双系统)

这种解决办法前提是windows和ubuntu双系统 首先在windows系统上创建一个空的硬盘分区 然后在ubuntu系统上把这个空的硬盘放在主目录里 然后可以把东西存在这个文件夹中 如下图,但实际主目录的内存没有变,以后存东西就在这个文件夹里面就好了 具体操作…

【Gradio】Chatbots 如何用 Gradio 创建聊天机器人

Creating A Chatbot Fast 简介 聊天机器人是大型语言模型的一个流行应用。使用 gradio ,您可以轻松构建您的聊天机器人模型的演示,并与您的用户分享,或者使用直观的聊天机器人用户界面自己尝试。 本教程使用 gr.ChatInterface() ,…

「51媒体」总台,地方卫视媒体邀约新闻报道采访怎么做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 总台对选题要求非常严格,在想做总台新闻报道之前,让我们先来了解下总台对新闻选题有哪些要求: 一、新闻价值 社会意义:新闻报道的首要任务…

【电源开发】输出电压纹波

输出电压纹波是什么 电压纹波指的是直流输出电压中一个交流部分 减小输出电压纹波的方法 调整输出端的电容值 提高开关电源的工作频率

R语言做图

目录 1. 图形参数 2. 低级图形 3. 部分高级图形 参考 1. 图形参数 图形参数用于设置图形中各种属性。 有些参数直接用在绘图函数内,如plot函数可以用 pch(点样式)、col(颜色)、cex(文字符号大小倍数&…

Android SurfaceFlinger——概述(一)

一、基础介绍 SurfaceFlinger 是 Android 系统中的一个关键组件,负责管理屏幕显示的合成和渲染。 服务角色:SurfaceFlinger 作为一个系统服务独立运行,它不依赖于任何应用程序进程,而是由系统启动并持续运行。窗口管理&#xff1a…

用Flask定制指令上传Excel数据到数据库

用Flask定制指令上传Excel数据到数据库 假设现在有一张员工信息data.xlsx文件 使用SQLAlchemy创表 # ExcelModel.py from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import DeclarativeBaseclass Base(DeclarativeBase):passclass Emp(…

《Windows API每日一练》4.6 矩形、区域和裁剪

在前面的4.3节中我们讲述了绘制矩形的API函数Rectangle和RoundRect。本节我们将介绍另外一组使用RECT矩形结构和区域的绘图函数。 本节必须掌握的知识点: 矩形 第28练:绘制随机矩形 矩形与区域的裁剪 第29练:区域裁剪 4.6.1 矩形 ■FillRe…

2025年计算机毕业设计题目参考-简单容易

2025年最新计算机毕业设计题目参考-第二批 以下可以参考 企业员工薪酬关系系统的设计 基于SpringBoot在线远程考试系统 SpringBootVue的乡政府管理系统 springboot青年公寓服务平台 springboot大学生就业需求分析系统 基于Spring Boot的疗养院管理系统 基于SpringBoot的房屋交…

堆优化版Dijkstra求最短路-java

主要通过堆优化Dijkstra算法解决最短路,可以跟朴素版的Dijkstra算法进行对比。 文章目录 前言 一、Dijkstra求最短路 二、算法思路 1.邻接表存储图 2.用小根堆优化Dijkstra 三、代码如下 1.代码如下(示例): 2.读入数据 3.代码运行…

高压线防外破警示灯在电力安全发挥的作用_鼎跃安全

高压输电线路往往跨越城市、乡村和野外,覆盖范围广泛。随着城乡建设和交通运输的快速发展,高压线路周围的活动频繁,外部破坏风险增加。车辆撞击电线杆、施工机械误碰线路以及人为破坏等事件时有发生,严重影响电力供应的稳定性和安…

人工智能--自然语言处理NLP概述

欢迎来到 Papicatch的博客 目录 🍉引言 🍈基本概念 🍈核心技术 🍈常用模型和方法 🍈应用领域 🍈挑战和未来发展 🍉案例分析 🍈机器翻译中的BERT模型 🍈情感分析在…

深入了解Java的ConcurrentHashMap类

深入了解Java的ConcurrentHashMap类 在多线程编程中,线程安全的数据结构至关重要。ConcurrentHashMap是Java提供的一种线程安全的哈希表实现,它在不使用显式同步的情况下允许并发的读取和写入操作。 ConcurrentHashMap属于java.util.concurrent包。它是…

19.Docker跨宿主机容器之间的通信macvlan

Docker跨宿主机容器之间的通信macvlan,类似桥接网络模式 macvlan通信类型,设置IP地址只能手动指定(–ip)一台一台设置IP地址 默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址(让人感觉是…

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)

一、概念 1.集成学习,顾名思义,不是一个玩意,而是一堆玩意混合到一块。 (1)基本思想是先 生成一定数量基学习器,再采用集成策略 将这堆基学习器的预测结果组合起来,从而形成最终结论。 &#x…

C# 利用XejeN框架源码,编写一个在 Winform 界面上的语法高亮的编辑器,使用 Monaco 编辑器

析锦基于Monaco技术实现的Winform语法高亮编辑器 winform中,我们有时需要高亮显示基于某种语言的语法编辑器。 目前比较强大且UI现代化的,无疑是宇宙最强IDE的兄弟:VS Code。 类似 VS Code 的体验,可以考虑使用 Monaco Editor&a…