【问题标题】:Sorting data structure: random in, lowest out排序数据结构:随机入,最低出
【发布时间】:2013-07-25 20:57:53
【问题描述】:

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

要求:

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

【问题讨论】:

  • 到目前为止我还没有尝试过任何解决方案,但我对此有一些想法:
  • @user1062874 嗯……你有什么想法?
  • 将其实现为小数组的循环缓冲区,然后简单地遍历循环缓冲区并对数组进行排序以按顺序获取元素。 +非常快的插入-最后一个元素的检索可能很慢-键的最大值有限
  • 使用自平衡二叉搜索树也可以解决问题,但插入时间为 O(log n)
  • 购物问题不在主题范围内。 :) :)

标签: algorithm sorting data-structures


【解决方案1】:

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

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

【讨论】:

  • +1 用于提及跳过列表。我完全忘记了那些,他们当然值得为这个项目研究
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多