排序哈希表(映射、字典)数据结构设计

2023-11-26

下面是数据结构的描述:

它的操作就像一张普通的地图get, put, and remove方法,但有一个sort可以调用对地图进行排序的方法。然而,地图记得它的排序结构,因此后续调用 sort 可以更快(如果结构在调用之间没有改变太多)sort).

例如:

  • 我打电话给put方法 1,000,000 次。
  • 我打电话给sort method.
  • 我打电话给put方法再重复100次。
  • 我打电话给sort method.

我第二次打电话给sort方法应该是一个更快的操作,因为地图的结构没有太大变化。请注意,映射不必在调用之间保持排序顺序sort.

我知道这可能不可能,但我希望 O(1)get, put, and remove运营。就像是TreeMap为这些操作提供保证的 O(log(n)) 时间成本,但始终保持排序顺序(无sort方法)。

那么这个数据结构的设计是怎样的呢?

编辑 1 - 返回前 K 个条目

尽管我很高兴听到上述一般情况的答案,但我的用例变得更加具体:我不需要对整个事情进行排序;只是前 K 个元素。

用于高效返回的数据结构top-K哈希表(映射、字典)的条目

Thanks!


对于“O(1) 获取、放置和删除操作”,您本质上需要 O(1) 查找,这意味着哈希函数(如您所知),但良好哈希函数的要求通常会打破轻松排序的要求。 (如果您有一个哈希表,其中相邻值映射到同一个存储桶,那么对于大量公共数据,它会退化为 O(N),这是您通常希望哈希函数避免的更糟糕的情况。)

我能想到如何让你完成 90% 的任务。在已排序的并行索引旁边设置一个哈希表。索引有干净部分(有序)和脏部分(无序)。索引会将键映射到值(或对存储在哈希表中的值的引用 - 无论在性能或内存使用方面适合您)。当您添加到哈希表时,新条目将被推到脏列表的后面。当您从哈希表中删除时,该条目将从索引的干净部分和脏部分中清空/删除。您可以对索引进行排序,它仅对脏条目进行排序,然后将它们合并到索引中已排序的“干净”部分。显然你可以迭代索引。

据我所知,除了删除操作之外,这在任何地方都为您提供了 O(1),并且使用标准容器(至少 C++、Java 或 Python 提供的)实现起来仍然相当简单。它还为您提供了“第二种排序更便宜”的条件,只需对脏索引条目进行排序,然后让您进行 O(N) 合并。所有这一切的代价显然是索引的额外内存和使用索引时的额外间接性。

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

排序哈希表(映射、字典)数据结构设计 的相关文章

随机推荐

  • 压缩和未压缩的 .wav 文件

    压缩和未压缩的 wav 文件有什么区别 The WAV格式是 Windows 中音频文件的容器格式 WAV 文件由标题和内容组成 标头包含有关 WAV 文件中包含的音频的大小 持续时间 采样频率 分辨率以及其他信息 通常 标头之后是实际的音
  • 使用 print.xtable 更改表格的字体大小

    我想使用 print xtable 更改表格的字体大小 Using print xT size tiny 有效 但我不知道其他尺寸选项 像 size 7pt 这样的东西会很好 您可以使用以下命令选择特定的字体大小 fontsize
  • 捕获更通用的异常类型是否有好处?

    如果我们要捕捉特定形式的IOException 或任何其他类型的 事实上 我们只尝试捕获几个 并为它们定义明确的输出 说 FileNotFoundException ZipException 我们是否应该始终把它拖下来并用一个覆盖所有基地
  • Windows Phone 开发和单元测试

    我希望启动一个针对 Windows Phone 的项目 但由于缺乏单元测试支持 我有点推迟了 1 我习惯于使用 NUnit XUnit 来满足我的大部分测试需求 并使用 NSubstitute 之类的东西来进行模拟 据我所知 您不能将这些框
  • 不抛出异常时的性能(C++)[重复]

    这个问题在这里已经有答案了 我已经阅读了很多有关 C 异常的内容 并且我所看到的 特别是异常性能是一个很难的话题 我什至试图深入了解 g 的底层 看看异常是如何在汇编中表示的 我是一名 C 程序员 因为我更喜欢低级语言 不久前 我决定使用
  • django-compressor 是否支持模板继承?

    我在用着Django 压缩器压缩我网站的静态 CSS 和 Javascript 文件 由于我通过 Amazon S3 提供网站的静态资产 因此我还使用Django 存储将我的文件上传到 S3 这是我的问题 我正在努力清理base html我
  • 强制 attr=title 弹出 on 元素

    有没有办法 我可以强制元素在元素悬停时显示 标题 弹出窗口 或者如果没有 有没有办法 我可以配置显示标题弹出窗口之前的超时时间 默认情况下 标题在悬停时显示 您无法更改其行为
  • Javascript 或 Flash 导出至 CSV/Excel

    是否有办法将 JSON 数据导出到 CSV Excel 而无需与服务器端进行任何交互 仅使用 JavaScript 还是闪存 我目前正在使用 ZeroClipboard 将值复制到剪贴板 但我想从浏览器 FF Chrome IE 等 直接将
  • net/http.rb:560:in `initialize': getaddrinfo: 名称或服务未知(SocketError)

    timestamp nil def generate oauth url timestamp timestamp url CONNECT URL REQUEST TOKEN PATH oauth callback OAUTH CALLBAC
  • 带有 v-for 的动态 v 模型

    我有一个 v for 循环 它将吐出多行输入 我想将每个单独的行动态保存到数组对象中 v for table class table m 0 tbody tr td fund name td tr tbody table
  • 来自电子邮件地址的域的正则表达式

    任何人都可以帮助我使用正则表达式来返回电子邮件地址的末尾部分 符号之后 吗 我是正则表达式的新手 但想学习如何使用它 而不是编写低效的 Net 字符串函数 例如 对于输入 电子邮件受保护 我需要 example com 的输出 干杯 蒂姆
  • $q.reject 和处理 AngularJS 链式承诺中的错误

    我无法理解使用链接承诺进行错误处理的基本概念 为了学习规则 我写了一个简单的例子 猜测结果会是什么 但不幸的是 它的行为并不像我想象的那样 我已经阅读了多篇有关该主题的文章 但由于我的英语水平不佳 我可能无法获得详细信息 无论如何 这是我的
  • Python 文件变量 - 它是什么?

    我刚刚开始使用 Python 由于我的背景是低级语言 java C 所以我无法真正理解一些东西 因此 在 python 中 我们可以通过打开一个文本文件来创建一个文件变量 然后像这样迭代它的行 f open sys argv 1 for l
  • 正则表达式匹配任何大于 1 的整数

    我最近刚刚开始学习正则表达式 我正在尝试找出如何匹配任何大于 1 的数字的模式 到目前为止我想出了 2 9 0 9 但它仅适用于最左边的数字不为 1 的情况 例如 234有效但是124没有 所以我想要实现的是个位数1不应匹配任何大于应匹配的
  • Postgres 是否支持嵌套或自治事务?

    我遇到的情况是 我必须将一部分代码作为其自己的事务提交 我创建了一个表subtransaction tbl CREATE TABLE subtransaction tbl entryval integer 以及 plpython3u 语言中
  • 如何在 Mac OSX 上安装 PCRE 开发标头

    我刚刚将 MacBook Pro 升级到 Mavericks 当我访问时 我本地的 Ruby on Rails 开发环境并没有立即运行localhost I see It works 并记得我需要启动 Phusion Passenger 所
  • 特征列嵌入查找

    我一直在使用tensorflow中的数据集和feature columns https developers googleblog com 2017 11 introducing tensorflow feature columns htm
  • ModuleNotFoundError:没有名为“pyperclip”的模块

    类似的问题已经发布在 StackOverflow 上 但我没有找到足够的答案来解决这个问题 我在 Windows 7 计算机上运行 Python 3 6 3 在 IDLE 中 我输入以下 import stmt 并收到后续错误 gt gt
  • 如何在VB 2010中通过文件的默认应用程序打开选定的文件?

    我有用 VB 2010 编写的 Windows 应用程序 在这里 用户可以从打开的对话框中选择任何文件 所以 我想在相应的应用程序中打开该文件 例如 假设用户选择 docx 文件 那么我必须使用 msword 打开该文件 假设 如果它是一个
  • 排序哈希表(映射、字典)数据结构设计

    下面是数据结构的描述 它的操作就像一张普通的地图get put and remove方法 但有一个sort可以调用对地图进行排序的方法 然而 地图记得它的排序结构 因此后续调用 sort 可以更快 如果结构在调用之间没有改变太多 sort