algorithm - 排序数据结构 : random in, 最低出

标签 algorithm sorting data-structures

我需要一个数据结构,支持键值对的插入,以及具有最低键的对的提取。插入和提取可以随时发生,因此数据结构必须保持连续排序,提取包括从列表中删除对。此外,插入的新对的键值不能低于最近提取的对的键值。插入的键对的值也会随着时间的推移而增加。

要求:

  • key :64 位无符号整数
  • 一次列出的最大条目数:~10^6
  • 每秒插入(和提取)的条目:~10^5
  • 提取时有效删除条目
  • 插入的键对:当前最低键 > 键 > 当前最低键 + 10^7
  • 内存要求无关紧要,计算复杂度也无关
  • 一些对可以有相同的 key

最佳答案

正如其他人所建议的那样,二叉堆是一个很好的选择。我发现它们在大多数情况下都表现得很好。 d-ary heap (d 为 3 或 4),可以让您获得 10% 的性能提升,而增加的实现复杂性却很少。在我对您所说大小的堆进行的实验中,3 元堆明显快于二进制(2 元)堆。

另一个选项是 skip list ,这会给你 O(log n) 插入和 O(1) 删除最低。实现跳跃列表比二叉堆稍微复杂一些,它需要更多的内存,并且常数因子更高。插入可能会比在堆中稍慢,但移除会快得多。它是否足够快以弥补额外的内存成本和增加的实现复杂性是您必须自己回答的问题。

关于algorithm - 排序数据结构 : random in, 最低出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17866954/

相关文章:

javascript - 在选择菜单中建议选项以获得更好的用户界面

algorithm - 该算法在数组上循环的空间复杂度

sql-server - 如何按字母顺序对字符串进行排序

data-structures - 使用 Fenwick 树增加范围

c - 删除单向链表中的节点

python - 如何从先序树遍历生成的数组重建二叉树

algorithm - "false 3D"棱镜墙的渲染顺序

python - 在排序期间尝试引用列表时出现 IndexError

python - 使用 Python 进行合并排序

java - 需要在 java 中使用迭代器的帮助