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