我正在尝试使用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()
调用造成的。
有没有更有效的方法来改变堆条目的优先级?
itertools.count()
简单地生成连续的数字。将计数器添加到类似[priority, count, task]
的条目中可以确保具有相同优先级的条目按照它们添加的顺序进行处理。我想,对于 Dijkstra 算法,您可以跳过这一步。 - Eugene Yarmash_siftup()
/_siftdown()
函数在不向堆中插入新项的情况下以O(log n)
的时间复杂度完成操作,但这需要你维护堆中每个项的位置。 - Eugene Yarmash