[英]Implementing Dijkstra's algorithm using STL make_heap
至少有几个答案建议使用 STL 堆函数来实现 Dijkstra 算法中的优先级队列:
鉴于 STL 不包括用于更新密钥的堆 function ,对堆中的顶点重新排序(第 19 行)的最佳方法是什么?
您需要让顶点在堆中“冒泡”(根据需要将其与其父级交换),直到它到达堆中的新 position。
在改编自《算法导论》第二版的伪 C++ 中。 pg。 140:
heap[pos] = new_weight;
while (pos > 0 && heap[parent(pos)] > heap[pos]) {
swap(heap[parent(pos)], heap[pos]);
pos = parent(pos);
}
其中int parent(int pos) { return (pos-1)/2; }
int parent(int pos) { return (pos-1)/2; }
我想有几种方法可以做到这一点。
您可以手动进行筛选操作,基本上将值带到堆的顶部,弹出它,然后用它的新值将它推回堆上。
您可以更新该值并在堆上再次执行 make_heap,假设 make_heap 设计为在堆已经“几乎是堆”时高效。
您可以用一些标志标记堆中的节点以指示它不再有效,然后将具有新值的新元素推送到堆上。 然后,每次从堆中弹出一个元素时,都会检查标志的有效性并忽略任何无效元素。
否则,您可以使用另一个具有更新功能的堆实现。 例如,Boost.Graph 库在其详细信息(boost/graph/detail 文件夹)中包含一个 d_ary_heap.hpp header,它实现了一个 D-Ary 堆间接实现,它确实有一个更新 function,即 logN。 这在 Dijkstra 和 A* 的 BGL 实现中使用,您也可以直接使用它而不是自己实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.