我尝试使用Python的heapq实现Dijkstra的算法。如果发现导致它的较短路径,该算法需要更改单元格的值。
我用这张支票做了这件事:
if curr_cell[0] + val < prev_cell[0]: # value of new path is less than old value
new_cell = (curr_cell[0] + val, prev_cell[1], curr_cell[1])
heap[index] = new_cell
heapify(heap)
然而,当在较大的迷宫上运行我的程序时,这需要很长时间,可能是因为heapify()
调用。
更改堆条目优先级的更有效方法是什么?
答案 0 :(得分:3)
heapq库不支持有效地更新优先级,因为没有有效的方法来搜索堆。如果在O(n)时间内搜索堆并手动替换该元素,则可以使用_siftup()和_siftdown()来恢复堆不变量。
或者,这是我编写的兼容实现,它使用dict允许O(1)查找堆索引。
答案 1 :(得分:2)
可能的解决方案是将条目标记为已删除,并添加具有修订优先级的新条目。 documentation提供了一个示例实现:
Look at form_values.["222"].choice_values["0"];
答案 2 :(得分:0)
实际上,几年前我为此写过一篇文章,您可能会觉得有用!
答案 3 :(得分:0)
@elplatt关于使用字典然后使用_siftdown/_siftup
的答案是一个很好的答案。这是另一种实现:https://github.com/ActiveState/code/blob/master/recipes/Python/577892_Dijkstrshortest_path/recipe-577892.py
答案 4 :(得分:-1)
heapify()例程需要线性时间。
因此,每次更改优先级时,不应使用成本为O(n)的heapify(),而应使用数据结构,您可以在其中更改该记录的优先级,并在O(logn)中进行堆积。
您可以使用Queue提供的PriorityQueue。