高效的数据结构,用于快速随机访问、搜索、插入和删除

2024-02-05

我正在寻找一种数据结构(或多个结构),它可以让我保留一个有序的整数列表,没有重复项,并且索引和值在同一范围内。

我需要四个主要操作才能高效,按重要性的粗略顺序排列:

  1. 从给定索引中获取值
  2. 查找给定值的索引
  3. 在给定索引处插入值
  4. 删除给定索引处的值

使用数组,我的 1 的复杂度为 O(1),但 2 的复杂度为 O(N),并且插入和删除的成本很高(我相信也是 O(N))。

链表的插入和删除时间复杂度为 O(1)(一旦有了节点),但 1 和 2 的时间复杂度为 O(N),因此抵消了收益。

我尝试保留两个数组 a[index]=value 和 b[value]=index,这将 1 和 2 变成 O(1),但将 3 和 4 变成成本更高的操作。

有没有更适合这个的数据结构?


我会用一个红黑树 http://en.wikipedia.org/wiki/Red-black_tree将键映射到值。这为 1、3、4 提供了 O(log(n))。它还按排序顺序维护键。

对于 2,我将使用哈希表将值映射到键,这将为您提供 O(1) 性能。它还增加了 O(1) 开销,用于在红黑树中添加和删除键时保持哈希表更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效的数据结构,用于快速随机访问、搜索、插入和删除 的相关文章

  • 读取文本文件并将列存储在数组中

    我的文件看起来像这样 01 01 5 00 1 50 7 50 02 01 4 00 3 00 12 00 02 02 3 00 4 00 12 00 03 01 4 50 3 00 13 50 03 01 7 50 2 50 18 75
  • 如何将我的 json 字符串 avro 二进制编码为字节数组?

    我有一个实际的 JSON 字符串 我需要将其 avro 二进制编码为字节数组 在经历了Apache Avro 规范 http avro apache org docs 1 7 7 spec html 我想出了下面的代码 我不确定这是否是正确
  • 大多数列表共有的项目

    给定一个列表列表 假设有 5 个列表 以便有一个可以使用的实数 我可以相对轻松地找到所有 5 个列表所共有的项目 请参阅使用 IEnumerable Intersect 求多个列表的交集 https stackoverflow com qu
  • 如何将一个变量的字符串分配给另一变量?

    这是我在这个网站上的第一个问题 如何将一个变量的字符串分配给另一变量 我在这里做错了什么 include
  • 为什么 Nil 会增加一个枚举大小而不增加另一个枚举大小? Rust 枚举的内存是如何分配的?

    如果我定义以下枚举 Nil 不会增加枚举的大小 use std mem size of enum Foo Cons char enum Bar Cons char Nil println size of
  • PYTHON 从嵌套列表中删除元素

    我有一个像这样的数组 dataSet 387230 296163 323434 311472 323412 166282 410119 我想删除元素 311472 但不知道如何删除 我努力了 for set in dataSet for i
  • 需要从数组中删除字符串[重复]

    这个问题在这里已经有答案了 我在 for 循环中有一个数组 如下所示 var arr abc 5 city 2 area 2 max choice 我只需要这样的数字 var arr 5 2 2 有人可以在这里帮忙吗 另一种方法是使用转换后
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • 使用静态指针的动态内存分配

    有人可以向我解释一下为什么下面的代码会这样工作吗 这里我已经初始化了outd作为文件中的静态指针code2 c 然后我动态地为其分配内存malloc 从单独文件中的主函数中一次又一次地调用它code1 c 它看起来整个数组以静态方式运行 因
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 在 Javascript 中减少/分组数组

    基于this https stackoverflow com a 40774906 3254598例如 我想以稍微不同的方式按对象进行分组 结果应该如下 key audi items make audi model r8 year 2012
  • 查找 C# 列表中重复项的数量

    我在 C 中使用列表 代码如下 测试用例 cs public class TestCase private string scenarioID private string error public string ScenarioID ge
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • 如何将两个long转换为字节数组=如何将UUID转换为字节数组?

    我正在使用 JavaScriptUUID并且需要将 UUID 转换为字节数组 奇怪的是 UUID 类不提供 toBytes method 我已经了解了这两种方法 UUID getMostSignificantBits and UUID ge
  • 在用户窗体终止/关闭 VBA 时调用数组

    我有一个问题 我想在用户窗体关闭时将用户窗体的内容存储在数组中 我认为我的语法正确 但似乎不会在用户窗体初始化时重新填充 我尝试将数组放入其自己的模块中 但这也不起作用 有人愿意启发我吗 示例代码 Public Sub DPArrayStu
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素

随机推荐

  • Stacktrace Java Eclipse 中的未知来源

    我有一个非常烦人的问题 当在 Eclipse 中从源代码中导出 jar 文件时 我不会在堆栈跟踪中获得有关发生错误的源代码和行号的信息 我已经检查了 ecplise 中项目的编译器设置 并且设置了类文件生成部分中的所有选项 我正在为 Min
  • 如何使用 VB 6.0 生成格式良好的 XML 文件?

    我正在开发 Visual Basic 6 0 项目 需要生成一个格式良好的 XML 文件 其如下所示
  • RESTEasy - 使用重复的缓存控制进行响应 - Wildfly10

    我有一个带有图像的 GET 响应 GET Path id thumbnail public Response readThumbnailById PathParam id String id QueryParam serviceContex
  • 如何删除没有标签的Docker镜像?

    我使用 docker 已有 5 个月了 从来没有遇到过这个问题 我有 2 个具有相同 ID 的图像 因此我想删除我知道它已被弃用的图像 问题是它没有 ID 当我尝试这样做时 dk rmi f gitlab lab 5005 xs mgmt
  • Scala:如何使用默认值初始化对象

    我认为用一个例子可以更好地解释这一点 我有以下案例类 case class Person name String no name surname String no surname 我想创建一个通用函数来填充它 例如 一条 json 消息
  • 具有配置的类库中的 Entity Framework 7 迁移脚手架

    尝试将迁移添加到 ASP NET 5 类库中的 EF7 模型 跑步时dnx ef migration add mymigration失败并产生不同的结果 具体取决于我运行它的项目 如果我在主项目的文件夹中运行它 它无法找到DbContext
  • 返回多个值并访问它们?

    我将如何构造它以返回多个值 消息和名称 并能够在js html file code gs function createArtistTable name var message test return message and name js
  • 如何使用 Fetch API 发布身体数据?

    下面是在邮递员中导入并运行后成功返回响应的curl命令 curl request POST data grant type password data username test data password xyz1234 data sco
  • SQL命令添加数据库图表

    sql server 2008 上是否有一个 sql 命令可以运行以启用数据库图表而不是出现此对话框 该数据库没有使用数据库图表所需的一个或多个支持对象 你想创造它们吗 该脚本有点太长 无法在此处添加 但您可以执行以下操作 1 创建一个新的
  • 如何从 bode() 到达第一个和第二个图

    我知道如何使用 bode 函数创建波特图 如果我想重叠两个或多个系统频率响应 我使用 bode sys1 sys2 or hold on 例如 当我想要到达该图以便用 text 放置图例时 很容易到达第二个图 像图形指针这样的东西总是返回到
  • 错误:“不推荐使用 Window 类型中的 show() 方法”

    这是一个简单的程序 只需打开 AWT 我正在使用 eclipse 并且我收到上面显示的frame show 的错误 Eclipse 正在用一条线跨越 显示 我想要这个程序做的只是显示一个 300px x 300px 的框架窗口 完整代码如下
  • Apache 无法在 OSX 中的 MAMP 中启动(但 MySQL 可以工作)

    我已经使用 MAMP 工作了几个月 最近安装了 PostgreSQL 它还建议安装 Apache 我这样做是为了确保 PostgreSQL 正常工作 然后我卸载了 PostgreSQL 和 apache 构建并尝试重新启动 MAMP 它启动
  • 如何为 Android 制作局域网唤醒?

    你能告诉我 如何为Android制作Wake On Lan应用程序吗 我在谷歌上搜索了两周 尝试了一切 从另一个唤醒局域网应用程序下载了源代码 并尝试找到用于制作和发送魔术包的代码 看起来其他所有代码都可以工作 但是当我在我的应用程序中使用
  • 初级 Java:变量作用域问题

    我正在练习我的java书中的一些工作 并且在获取使用变量进行计算的方法时遇到问题 请注意 这是一项正在进行的工作 我目前只是试图让它使用 CircleArea 方法来计算圆的面积 这是必要的代码 public class Geometry
  • Laravel“目标 [Illuminate\Contracts\Bus\Dispatcher] 不可实例化。”

    正如标题本身所说 我遇到了以下问题 Target Illuminate Contracts Bus Dispatcher is not instantiable 我正在尝试使用自定义脚本并包含默认的 Laravel 类 require on
  • POST 请求 Fetch API 防止重定向

    所以我想制作一个纯html和javascript表单并将其提交到服务器 这是我的 html 表单代码
  • wxPython:当我关闭框架时,单选按钮如何记住我的选择

    您好 我有一个主框架和一个按钮 按下该按钮时会打开第二个框架 第二个框架有 6 个单选按钮 我的问题是 当我选择与已选择的单选按钮不同的单选按钮并关闭框架时 当我再次打开它 不关闭整个程序 时 为什么选择第一个单选按钮以及如何保留我的新选择
  • 不要将文字作为本地化参数传递

    在我的项目 Windows Phone 8 1 应用程序 上运行代码分析时 出现以下警告 CA1303 不要将文字作为本地化参数传递 方法 Common TranslateError String 将文字字符串作为调用 XDocument
  • 使用 STL 在 C++ 中实现图和 BFS

    以下是我编写的代码 include
  • 高效的数据结构,用于快速随机访问、搜索、插入和删除

    我正在寻找一种数据结构 或多个结构 它可以让我保留一个有序的整数列表 没有重复项 并且索引和值在同一范围内 我需要四个主要操作才能高效 按重要性的粗略顺序排列 从给定索引中获取值 查找给定值的索引 在给定索引处插入值 删除给定索引处的值 使