在 C++ 标准库文档中搜索某些函数时,我读到优先级队列的推送和弹出需要恒定的时间。
http://www.cplusplus.com/reference/stl/priority_queue/push/
常量(在 priority_queue 中)。尽管请注意 push_heap 以对数时间运行。
我的问题是使用什么样的数据结构来维护优先级队列,其中 O(1) 用于 push 和 pop ?
在 C++ 标准库文档中搜索某些函数时,我读到优先级队列的推送和弹出需要恒定的时间。
http://www.cplusplus.com/reference/stl/priority_queue/push/
常量(在 priority_queue 中)。尽管请注意 push_heap 以对数时间运行。
我的问题是使用什么样的数据结构来维护优先级队列,其中 O(1) 用于 push 和 pop ?
我假设您指的是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 的底层存储可以是向量或双端队列或任何类似的支持随机访问迭代器的东西。存储作为堆维护,推送不是 O(N),所以我怀疑你读错了
Push 和 Pop 以对数时间运行,根据
我对 O(1) 的说法持怀疑态度……你在哪里看到的?
无论如何,这里有一些关于 gcc 实现优先级队列的注释。
没有这种堆。他们写道,它调用了对数的 push_heap,所以它是 logn。
push_heap
该标准用和定义这些成员pop_heap
,这意味着可编译性。
如果那个引用说的是真的(它说top
的也是常数),为什么没有人使用 来实现通用的 O(N) 排序std::priority_queue
?
不过,在第二个方面,这就是参考可能试图以一种非常误导的方式说的:复杂性是push_back
O(1) + push_heap
(O(log N))