哪种数据结构用于“动态”优先级排队?

时间:2012-12-28 09:01:06

标签: data-structures priority-queue

我正在寻找支持一种高级优先级排队的数据结构。这个想法如下。我需要按顺序处理许多项目,并且在任何给定的时间点我都知道下一个要做的“最佳”项目(基于某个度量标准)。问题是,处理项目会更改一些其他项目的指标,因此静态队列不会起作用。

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

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

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

4 个答案:

答案 0 :(得分:2)

有一种时间复杂度类似于您所需要的算法,但只有平均时间才能运行O(log n),如果它是您需要的话。在此算法中,您可以使用不具有requeue()函数的现有优先级队列。

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

  1. 致电dequeue()
  2. 如果元素中的ignore位为true,请返回1,否则返回项ID。
  3. 修改后的enqueue的算法运行如下:

    1. 调用队列(项目,优先级)
    2. 逐个访问图表中项目的邻居节点v
      • ignore位更改为true,以使队列中当前链接的元素对应v
      • enqueue(v,new_priority(v))
      • 将节点v的连接更改为新的已排队元素。
      • num_ignore ++
    3. 如果忽略元素(num_ignore)的数量大于非忽略元素的数量,则重建优先级队列
      • dequeue所有元素,存储,然后再enqueue只有非忽略元素
    4. 在此算法中,ignore位的设置需要恒定时间,因此您基本上会延迟O(log n)“重新排队”,直到累积O(n)个忽略元素为止。然后清除所有这些,需要O(n log n)。因此,平均而言,每个“重新排队”都需要O(log n)

答案 1 :(得分:1)

Priority queue正好适用于此。您可以使用max-heap来实现它。

答案 2 :(得分:1)

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

但是,如果我们假设给定步骤中更新元素的数量为p,则堆的大多数典型实现将以O(1)复杂度来获取max-element的值,{{ 1}}表示deque,O(log(n))表示更新操作。我个人会去二进制堆,因为它很容易实现,并且可以满足您的要求。

答案 3 :(得分:0)

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

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