排序数据结构:随机输入,最低输出

时间:2013-07-25 19:21:29

标签: algorithm sorting data-structures

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

要求:

  • 密钥:64位无符号整数
  • 任何时候列出的最大条目数:~10 ^ 6
  • 每秒插入(和提取)的条目:~10 ^ 5
  • 提取时有效删除条目
  • 插入对的键:当前最低键>键>当前最低密钥+ 10 ^ 7
  • 内存要求无关紧要,计算复杂性不是
  • 有些对可以使用相同的密钥

3 个答案:

答案 0 :(得分:4)

正如其他人所建议的那样,二进制堆是一个很好的选择。我发现它们在大多数情况下表现都很好。 d-ary heap d 为3或4)可以为您带来10%的良好性能提升,而且实现复杂度极低。在我正在讨论的大小的实验中,3-ary堆明显快于二进制(2-ary)堆。

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

答案 1 :(得分:3)

您所描述的内容听起来非常像priority queue,其优先级由关键比较确定。

理想的实现方式是binary heap,因为这会导致O(log n)插入删除,这将比O(1)O(n)更好。另一个是{{1}}。如果你希望插入或删除很少,你可以使用一个排序或未排序的序列来实现,但我仍然会犹豫不决。

对于具有大于最后删除元素的键的插入元素的要求,这只需要一个额外的成员变量来指示最后删除的键的值;每次删除时都要更新。这样做不会影响渐近运行时。或者,在调用插入方法之前,您可以在代码中使用一个变量来检查插入候选项。无论哪种方式,您都需要存储最后删除的元素的键,并在调用insert方法之前将其与要插入的元素进行比较。

答案 2 :(得分:2)

一个选项是priority queue,它满足您的要求---随机输入,最低输出,执行O(logn)插入和删除(弹出)。