我想降低优先级队列中元素的优先级?如何在对数时间内实现这一目标?
我知道优先级队列是作为最大堆实现的。但是如果我修改队列中的任何元素然后在其上调用make_heap,则元素数量将需要线性时间。
答案 0 :(得分:3)
以对数复杂度执行更新的唯一方法是自己实现优先级队列,因此您可以使用well-known algorithms。
标准未指定std::priority_queue
的实现(例如,它可能是d-ary heap),因此您无法在不重建队列的情况下轻松更新优先级。出于同样的原因,您无法使用std::make_heap
及相关功能。
答案 1 :(得分:1)
您无法使用std::priority_queue
执行此操作。但是,如果您可以访问堆的内部结构,则可以进行访问。如果你有一个指向元素的指针,你可以降低元素的优先级,然后只使用siftDown
过程来修复这个元素。