具有O(1)Dequeue和O(无论)入队的优先级队列

Fra*_*ffa 5 c++ algorithm priority-queue

我正在用C++编写一个应用程序,其中对优先级队列进行O(1)Dequeue操作至关重要,而Enqueue的复杂性并不是那么重要(当然,除非它变成n ^ 2或2 ^ n).

起初我使用了一个链表.这对Dequeue(O(1))来说非常好,并且它具有良好的入队复杂性.唯一的问题是,整理它.使用Insertion Sort,O(n)复杂度并不符合我的需求.但排序链表很麻烦.这是懒散的.

矢量并不好.Dequeue将是O(n)将所有元素移回一个地方.入队仍然是O(n)但速度要快得多.

你能建议更高效的方法吗?谢谢.

Fre*_*Foo 14

反向排序vector具有O(1)pop_back和O(n)插入.

  • @ AlfaOmega08:我没有时间来证明这一点,但我怀疑矢量的周期性重新分配可能比列表完成的所有小分配更快. (2认同)

NPE*_*NPE 10

您可以将队列存储为已排序的链接列表.移除前部元素是O(1)在正确的位置插入元素O(n).

但排序链表很麻烦.这是懒散的.

每次插入后,您不必执行完整排序.您所要做的就是遍历(已经排序的)列表以找到新元素的正确位置,并将其插入其中.遍历是O(n)和插入O(1).