【发布时间】:2021-02-08 12:03:11
【问题描述】:
考虑我有一个顶部有最小值的min priority queue,我希望减少顶部的值,以便仍然保持队列的属性并且时间复杂度为O(1)。该怎么做?
我在这里看到了问题how to change the value of std::priority_queue top()?
哪里取值,修改再推回去,基本上是O(logN)的复杂度,不知道能不能利用减值的属性,这样就不需要再次推回价值?
【问题讨论】:
-
这在什么方面不是那个的复制品?
-
如果有
O(1)方法可以做到这一点,那么应该在您链接的问题上发布这样的答案。我不会以骗子的身份结束,因为这个问题中可能还有一个方面尚未解释。为什么您链接的问答没有回答您的问题? -
从复杂性角度讲,由于优先级队列不是一个简单的数据结构,即使可以更改优先级值,也需要
O(logN)重新平衡它。所以无法摆脱O(logN)的复杂性,只是使用 pop&push 你需要重新平衡队列两次(这不会改变渐近复杂性) -
你是在说
std::priority_queue怎么办?如果优先级队列是自己做的,没问题。 -
您可以尝试使用最小堆,并直接修改底层向量的第一个元素。不确定它是否完全安全。
标签: c++