我正在寻找支持一种高级优先级排队的数据结构。这个想法如下。我需要按顺序处理许多项目,并且在任何给定的时间点我都知道下一个要做的“最佳”项目(基于某个度量标准)。问题是,处理项目会更改一些其他项目的指标,因此静态队列不会起作用。
在我的问题中,我知道哪些项目需要更新其优先级,所以我要查找的数据结构应该有方法
理想情况下,我想在O(log n)时间内重新排队。有什么想法吗?
答案 0 :(得分:2)
有一种时间复杂度类似于您所需要的算法,但只有平均时间才能运行O(log n)
,如果它是您需要的话。在此算法中,您可以使用不具有requeue()
函数的现有优先级队列。
假设图表中的节点与优先级队列中的元素之间存在连接。让优先级队列的元素也存储一个名为ignore
的额外位。修改后的dequeue
的算法运行如下:
dequeue()
ignore
位为true,请返回1,否则返回项ID。修改后的enqueue
的算法运行如下:
v
ignore
位更改为true,以使队列中当前链接的元素对应v
v
的连接更改为新的已排队元素。num_ignore
++ num_ignore
)的数量大于非忽略元素的数量,则重建优先级队列
dequeue
所有元素,存储,然后再enqueue
只有非忽略元素在此算法中,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(),但我还没有找到完整的引用。