Python heapq替换优先级

时间:2017-10-08 22:23:14

标签: python

我尝试使用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()调用。

更改堆条目优先级的更有效方法是什么?

5 个答案:

答案 0 :(得分:3)

heapq库不支持有效地更新优先级,因为没有有效的方法来搜索堆。如果在O(n)时间内搜索堆并手动替换该元素,则可以使用_siftup()和_siftdown()来恢复堆不变量。

或者,这是我编写的兼容实现,它使用dict允许O(1)查找堆索引。

https://github.com/elplatt/python-priorityq

答案 1 :(得分:2)

可能的解决方案是将条目标记为已删除,并添加具有修订优先级的新条目。 documentation提供了一个示例实现:

Look at form_values.["222"].choice_values["0"];

答案 2 :(得分:0)

实际上,几年前我为此写过一篇文章,您可能会觉得有用!

https://pypi.org/project/priorityq/

答案 3 :(得分:0)

@elplatt关于使用字典然后使用_siftdown/_siftup的答案是一个很好的答案。这是另一种实现:https://github.com/ActiveState/code/blob/master/recipes/Python/577892_Dijkstrshortest_path/recipe-577892.py

答案 4 :(得分:-1)

heapq提供的

heapify()例程需要线性时间。

因此,每次更改优先级时,不应使用成本为O(n)的heapify(),而应使用数据结构,您可以在其中更改该记录的优先级,并在O(logn)中进行堆积。

您可以使用Queue提供的PriorityQueue。