【问题标题】:Which data-structure to use for "dynamic" priority queueing?哪种数据结构用于“动态”优先级队列?
【发布时间】:2012-12-28 09:01:06
【问题描述】:

我正在寻找一种数据结构来支持一种高级优先级队列。思路如下。我需要按顺序处理许多项目,并且在任何给定的时间点我都知道接下来要做的“最佳”项目(基于某些指标)。问题是,处理一个项目会改变一些 other 项目的指标,因此静态队列无法解决问题。

在我的问题中,我知道哪些项目需要更新其优先级,所以我正在寻找的数据结构应该有方法

  • 入队(项目,优先级)
  • 出队()
  • requeue(item, new_priority)

理想情况下,我想在 O(log n) 时间内重新排队。有什么想法吗?

【问题讨论】:

  • 优先级的变化可以双向(上下)还是单向?
  • @Thilo 他们可以双向改变。
  • 堆是一个不错的选择。
  • 您不能选择更好的指标吗?你怎么知道哪些项目需要重新排队?我的意思是你如何跟踪他们。
  • @hwlau : 项目在一个图中连接,当我处理一个项目时,我有效地在图中进行了局部更改,这改变了项目邻居的度量。

标签: data-structures priority-queue


【解决方案1】:

有一种算法的时间复杂度与您所需的相似,但它仅在平均时间上运行O(log n),如果它是您需要的。在此算法中,您可以使用现有的优先级队列,而无需 requeue() 函数。

假设您在图表中的节点和优先级队列中的元素之间建立了连接。让优先级队列的元素也存储一个名为ignore 的额外位。修改后的dequeue 的算法运行如下:

  1. 致电dequeue()
  2. 如果元素中的ignore位为真,则返回1,否则返回item id。

修改后的enqueue的算法运行如下:

  1. 调用入队(项目、优先级)
  2. 逐一访问图中item的邻居节点v
    • ignore位更改为true,以便队列中当前链接的元素对应于v
    • 入队(v, new_priority(v))
    • 将节点v 的连接更改为新的入队元素。
    • num_ignore++
  3. 如果忽略元素(num_ignore)的数量大于非忽略元素的数量,重建优先队列
    • dequeue 所有元素,存储,然后enqueue 再次仅非忽略元素

在此算法中,ignore 位的设置需要恒定时间,因此您基本上会延迟 O(log n) "requeue",直到您累积 O(n) 忽略元素。然后将它们全部清除一次,这需要O(n log n)。因此,平均而言,每个“requeue”占用O(log n)

【讨论】:

    【解决方案2】:

    Priority queue 正是为此而生。例如,您可以使用max-heap 来实现它。

    【讨论】:

    • 如何在这样的堆中高效地实现重新排队操作?
    • 堆是二叉搜索树。平均删除为O(logn),最坏情况下删除为O(n)。插入到堆是O(logn)
    • @icepack 堆不是二叉搜索树。它特别不适合搜索存储的项目(与它们的优先级相反),这是重新排队操作所需要的。
    【解决方案3】:

    您无法达到您所要求的复杂性,因为在更新元素时​​,复杂性还应取决于更新元素的数量。

    但是,如果我们假设给定步骤中更新元素的数量是p,那么大多数堆的典型实现将在O(1) 复杂度下获得最大元素的值,O(log(n)) 用于双端队列,和O(p * log(n)) 用于更新操作。我个人会选择二进制堆,因为它很容易实现并且可以满足您的要求。

    【讨论】:

      【解决方案4】:

      http://www.eecs.wsu.edu/~ananth/CptS223/Lectures/heaps.pdf 描述了 increaseKey()、reduceKey() 和 remove() 操作。这会让你做你想做的事。我还没有弄清楚 C++ stdlib 实现是否支持它。

      此外,版本:http://theboostcpplibraries.com/boost.heap 似乎支持某些子类的 update(),但我还没有找到完整的参考。

      【讨论】:

        猜你喜欢
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多