【发布时间】:2014-10-23 09:46:21
【问题描述】:
我想降低优先级队列中元素的优先级?如何在对数时间内实现?
我知道优先级队列是作为最大堆实现的。但是,如果我修改队列中的任何元素,然后对其调用 make_heap,则元素数量将花费线性时间。
【问题讨论】:
-
嗯,你刚刚回答了你自己的问题,不是吗?除非我遗漏了什么,否则您只是证明了这是不可能的。
标签: c++ c++11 priority-queue
我想降低优先级队列中元素的优先级?如何在对数时间内实现?
我知道优先级队列是作为最大堆实现的。但是,如果我修改队列中的任何元素,然后对其调用 make_heap,则元素数量将花费线性时间。
【问题讨论】:
标签: c++ c++11 priority-queue
以对数复杂度执行更新的唯一方法是自己实现优先级队列,因此您可以使用well-known algorithms。
std::priority_queue 的实现没有被标准指定(例如它很可能是d-ary heap),所以你不能在不重建队列的情况下便携地更新优先级。出于同样的原因,您不能使用std::make_heap 和相关功能。
【讨论】:
您无法使用std::priority_queue 来执行此操作。但是,如果您可以访问堆的内部结构,这是可能的。如果你有一个指向元素的指针,你可以降低一个元素的优先级,然后对这个元素使用siftDown过程来修复堆。
【讨论】: