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

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(使用前将#替换为@)

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

  • C++ 通过引用传递动态分配的二维数组

    这个问题是基于之前提出的问题而提出的 通过已知大小的引用多维数组传递 https stackoverflow com questions 529109 c pass by reference multidimensional array w
  • 查找嵌套列表中元素的索引?

    我有一个类似的列表 mylist lt list a 1 b list A 1 B 2 c list C 1 D 3 是否有一种 无循环 方法来识别元素的位置 例如如果我想用 5 替换 C 的值 并且在哪里找到元素 C 并不重要 我可以这样
  • R从列表中提取数据框,列名中没有前缀

    我在列表中放置了一个数据框 然后 当尝试将其提取回来时 我得到了该数据帧的所有以列表键为前缀的列名称 有没有办法完全按照最初传递的方式提取数据帧 cols lt c column1 Column2 Column3 df1 lt data f
  • 在汇编中初始化字符串数组

    我想创建一个数据数组 在初始化数据部分保存 5 个字符串 每个字符串正好有 4 个字符 每个字符串都有一些初始数据 例如第一个字符串的 abcd 第二个字符串的 efgh 等等 无效的 0任何字符串都不需要字符 如何用汇编语言初始化字符串数
  • Java 泛型从类创建数组

    我有一个层次结构 其中正方形 三角形和圆形都从形状延伸 我有一个工作方法 public void someMethod File file new File File with squares ThirdPartyClass foo new
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 如何打印数组中每个单词之间的空格

    我记得在 w3school 上看到过一个函数 你可以打印出数组的所有单词并在它们之间添加一个空格 但无论我如何谷歌我都找不到它 其外观示例 function printWords var array Car Bus Motorcykle p
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 多维数组内的移动

    我有一个用表格显示的数组 如何使用用户输入进行移动 目前 0 被分配给每个数组 但我计划为该数组分配其他值 我的问题是 如何使用用户输入在数组内向上 向下 向右 向左移动和对角移动 Array 0 gt Array 0 gt 0 1 gt
  • R:将 readRDS 应用于 .Rds 文件名的列表对象

    我有几个包含数据帧对象的 Rds 文件 我想对每个文件应用一个函数并将数据帧绑定到单个数据帧中 但是 当我尝试从文件名列表中读取多个 Rds 文件时 我收到错误 FUN X i 中的错误 从连接读取时出错 readRDS 不适用于列表吗 R
  • array_merge 更改键

    我得到以下数组 arr array 6 gt Somedata 7 gt Somedata1 8 gt Somedata2 问题是 当我使用array merge array Select the data arr 它确实将数组键更改为 A
  • 为什么java中LinkedList没有initialCapacity?

    我想知道为什么LinkedList没有initialCapacity 我知道什么时候使用ArrayList什么时候LinkedList 定义集合最终大小的好习惯是 List
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 在 C 中将字符追加到字符数组

    我想将一个字符附加到代表字符串的字符数组中 我正在使用结构来表示字符串 struct String char c int length int maxLength String realloc弄乱了我的数组 当我打印字符串时 它会从内存中打
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • R - 通过覆盖和递归合并列表

    假设我有两个带有名字的列表 a list a 1 b 2 c list d 1 e 2 d list a 1 b 2 b list a 2 c list e 1 f 2 d 3 e 2 我想递归地合并这些列表 如果第二个参数包含冲突的值 则
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过

随机推荐

  • 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
  • 高效的数据结构,用于快速随机访问、搜索、插入和删除

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