使用优先级队列结构?

时间:2010-04-10 15:38:47

标签: c++ algorithm data-structures priority-queue

在C ++标准库文档中搜索某些函数时,我读到优先级队列的推送和弹出需要恒定的时间。

http://www.cplusplus.com/reference/stl/priority_queue/push/

  

常量(在priority_queue中)。虽然注意到push_heap在对数时间内运行。

我的问题是用什么类型的数据结构来维护优先级队列,其中包含推送和弹出的O(1)?

6 个答案:

答案 0 :(得分:9)

我假设您指的是cplusplus.com's page

在页面的前面说:

  

该成员函数有效地调用底层容器对象的成员函数push_back,然后调用push_heap算法以保持priority_queues的堆属性。

因此,在O(1)推送之后,数据结构已失去其堆属性不变量,然后始终遵循O(log N)调用来恢复该属性。换句话说,O(1)操作只是整个操作的一部分;完整操作为O(1) + O(log N),与O(log N)相同。

我猜他们提到的原因是优先级队列是一个适配器,他们试图强调底层容器与适配器之间的区别。

答案 1 :(得分:1)

priority_queue的底层存储可以是向量或双端队列或任何类似的支持随机访问迭代器的存储。存储被保存为堆,这对于推送不是O(N),所以我怀疑你已经读错了

答案 2 :(得分:0)

答案 3 :(得分:0)

我对O(1)声明持怀疑态度......你在哪里看到它?

无论如何,这里是some notes on gcc's implementation of a priority queue

答案 4 :(得分:0)

没有这种堆。他们写过它调用push_heap是对数的,所以它是logn。

答案 5 :(得分:0)

该标准根据push_heappop_heap定义了这些成员,这意味着编译性。

如果that reference说的是真的(它说top也是常数),为什么没有人使用std::priority_queue实现通用O(N)排序?

第二,虽然这是引用可能试图以一种非常误导的方式说的:复杂性是push_back O(1)+ push_heap(O(log N) )