[英]Priority queue structure used?
在C ++标准库文档中搜索某些函数时,我读到优先级队列的推送和弹出需要恒定的时间。
http://www.cplusplus.com/reference/stl/priority_queue/push/
常量(在priority_queue中)。 虽然注意到push_heap在对数时间内运行。
我的问题是使用什么样的数据结构来维护优先级队列,其中包含推送和弹出的O(1)?
我假设你指的是cplusplus.com的页面 。
它在页面的前面说:
该成员函数有效地调用底层容器对象的成员函数push_back,然后调用push_heap算法以保持priority_queues的堆属性。
因此,在O(1)
推送之后,数据结构已丢失其堆属性不变量,然后将始终遵循O(log N)
调用以恢复该属性。 换句话说, O(1)
操作只是整个操作的一部分; 完整操作是O(1) + O(log N)
,它与O(log N)
。
我猜他们提到的原因是优先级队列是一个适配器,他们试图强调底层容器与适配器之间的区别。
priority_queue的底层存储可以是vector或deque或任何类似的支持随机访问迭代器的存储。 存储作为堆维护,对于推送不是O(N),所以我怀疑你已经读错了
我对O(1)声明持怀疑态度......你在哪里看到它?
无论如何,这里有一些关于gcc优先级队列实现的注释 。
没有这种堆。 他们写过它调用push_heap是对数的,所以它是logn。
该标准根据push_heap
和pop_heap
定义了这些成员,这意味着compilexity。
如果该引用所说的是真的(它表示top
也是常量),为什么没有人使用std::priority_queue
实现通用O(N)排序?
第二,虽然这是参考文献可能试图说的一种非常误导的方式:复杂性是push_back
O(1)+ push_heap
(O(log N))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.