在C ++标准库文档中搜索某些函数时,我读到优先级队列的推送和弹出需要恒定的时间。
http://www.cplusplus.com/reference/stl/priority_queue/push/
常量(在priority_queue中)。虽然注意到push_heap在对数时间内运行。
我的问题是用什么类型的数据结构来维护优先级队列,其中包含推送和弹出的O(1)?
答案 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_heap
和pop_heap
定义了这些成员,这意味着编译性。
如果that reference说的是真的(它说top
也是常数),为什么没有人使用std::priority_queue
实现通用O(N)排序?
第二,虽然这是引用可能试图以一种非常误导的方式说的:复杂性是push_back
O(1)+ push_heap
(O(log N) )