修改对内部数据的引用时更新STL优先级队列

Mat*_*gan 5 c++ dijkstra priority-queue

假设我正在编写Dijkstra的算法,并且我有一个优先级队列,它将最短距离节点保持在顶部.然而,当我遍历图表时,我将更新到该顶点的距离.我已经引用了数据结构中包含的优先级队列中的所有顶点.现在,当我更新数据结构中的顶点时,我希望优先级队列中的数据能够适应这些变化,因此最近的节点始终位于顶部.但是,在使用调试器单步执行我的应用程序后,我注意到优先级队列不会自行更新.如何在不重新插入所有顶点的情况下执行此操作?

小智 4

STLpriority_queue假设您只使用push()和pop()方法来修改数据结构。它不跟踪数据结构的更改。

修改priority_queue底层容器的内部后,您需要在容器上调用make_heap()来恢复堆属性。STL Priority_queue 不提供底层容器上的迭代器。相反,您需要手动管理双端队列或向量作为优先级队列,并根据需要调用 make_heap()、push_heap() 和 pop_heap()。

  • 尽管调用 make_heap() 确实恢复了堆属性,但它的运行时间为 O(n) 。堆更新的正确实现应该在 O(lg n) 时间内运行——这是 Cormen 等算法教科书中的 reheapify 函数。显然,如果 n 很大和/或您经常更新优先级,那么运行时间的差异将是显而易见的。我找到了一个在对数时间内重新堆化的实现:http://blog.smellthedata.com/2009/08/mutable-heaps-in-c-for-updates-to.html (4认同)