【问题标题】:Best algorithm/data structure for a continually updated priority queue持续更新优先级队列的最佳算法/数据结构
【发布时间】:2014-03-28 19:38:06
【问题描述】:

我需要经常在不断更新的集合中找到最小值对象。我需要有一个优先队列类型的功能。执行此操作的最佳算法或数据结构是什么?我正在考虑拥有一个排序的树/堆,并且每次更新对象的值时,我都可以删除该对象,然后将其重新插入树/堆中。有没有更好的方法来做到这一点?

【问题讨论】:

  • 值是什么类型?
  • 有多少项?值的范围是多少?
  • @user3473949 您是否尝试过使用存储桶代替优先级队列?我的意思是只为每个值存储一个具有该值的项目的链接列表。然后修改键只是从一个列表中删除项目并将其添加到另一个列表中的问题。如果你保留一个指向最小非空桶的指针,你可以在 O(1) 中找到它。当它指向的存储桶变空时维护该指针可能会稍微昂贵一些,但这只是对最多 100 个很容易放入 L1 的指针的线性扫描,所以这也很便宜(也许 min 也不会改变通常在您的场景中)
  • @NiklasB.:Delete-min 可以通过使用布尔值的(位压缩的)向量来加速,该向量说明哪些桶是非空的,并快速找到其中的最低有效位.
  • 您说“不断更新”,但更新的种类非常重要。插入?删除分钟?随意删除?合并?减少键?增加键?其他人?

标签: algorithm sorting data-structures set priority-queue


【解决方案1】:

为了简单起见,二叉堆很难被击败,但它的缺点是 decrease-key 需要 O(n) 时间。我知道,标准参考资料说它是 O(log n),但首先你必须找到该项目。这是标准二叉堆的 O(n)。

顺便说一句,如果您决定使用二叉堆,则更改项目的优先级不需要删除和重新插入。您可以就地更改项目的优先级,然后根据需要将其冒泡或筛选。

如果 decrease-key 的性能很重要,一个不错的替代方案是 pairing heap,它在理论上比 Fibonacci 堆慢,但更容易实现,在实践中比由于较低的常数因子,斐波那契堆。在实践中,配对堆与二叉堆相比具有优势,并且如果您执行大量 decrease-key 操作,则其性能优于二叉堆。

您还可以将二进制堆和字典或哈希映射结合起来,并根据堆中项目的位置来更新字典。这可以让您更快地减少键,但会消耗更多内存并增加其他操作的常数因子。

【讨论】:

    【解决方案2】:

    引用Wikipedia:

    为了提高性能,优先级队列通常使用堆作为其 主干,为插入和删除提供 O(log n) 性能,以及 O(n) 最初构建。或者,当一个自平衡二进制 使用搜索树,插入和删除也需要 O(log n) 时间, 虽然从现有的元素序列构建树需要 O(n log n) 时间;这是一个典型的可能已经可以访问的地方 这些数据结构,例如第三方或标准库。

    如果您正在寻找更好的方法,那么您的优先级队列中的对象一定有一些特别之处。例如,如果键是从 1 到 10 的数字,则基于计数排序的方法可能会优于通常的方法。

    【讨论】:

    • 实际上有 O(1) 减少键的堆(不确定增加),但我猜那些有恒定的因素使它们不切实际
    • @NiklasB.:是的,例如有Fibonacci heaps,但据我所知,由于常数因子很大,它们是不切实际的。
    【解决方案3】:

    如果您的应用程序看起来像是在离散事件模拟中重复选择下一个预定事件,您可以考虑在例如http://en.wikipedia.org/wiki/Discrete_event_simulationhttp://www.acm-sigsim-mskr.org/Courseware/Fujimoto/Slides/FujimotoSlides-03-FutureEventList.pdf。后者总结了该领域中不同实现的结果,包括在其他 cmets 和答案中考虑的许多选项 - 并且搜索将找到该领域的许多论文。优先级队列开销确实会对您可以运行模拟的实时次数产生一些影响 - 如果您希望模拟需要数周实时的东西,这可能很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多