在大多数伪代码中,我通常会发现以下内容:
DeleteMin(返回具有最小键的元素并将其从集合中删除。)
DecreaseKey(适应特定元素键值的减少)
答案 0 :(得分:6)
为什么使用DeleteMin来检索最小的元素 - 为什么不呢 一个随机的?
我们从Q
集合中检索并删除最小元素
打开顶点,因为它确保了最小化(后来在证明中使用)。
没有它 - 无法保证最小化功能,并且解决方案将不是最佳的(不会是最短路径)。请记住,一旦我们找到v
的路径,我们就会将其从Q
中移除,并且永远不会重新打开它,因此我们取出的边缘必须具有可用路径最小的边缘。
注意,对于这个(最小的)顶点,让它为v
:对于u
Q
中的每个d(u) + x <= d(v)
- 因为dijkstra的算法在没有时使用负边缘,x> = 0。
对于任何其他顶点 - 这不是最小的 - 我们不能保证没有更短的路径可供发现。
DecreaseKey的目的是什么?在伪代码中,它总是被调用 在元素的值改变之后。它在做什么?
使用减少因为我们可能找到了一条新的,更好的路径连接到我们找到的最后一个顶点的顶点。 这一步是dijkstra算法正在制定的放松步骤。请记住,dijkstra算法始终保持到目前为止每个顶点找到的最短路径,因为最后一步可能找到了到达某个顶点的新的最短路径 - 这一步是更新到目前为止找到的最短路径。