为什么Dijkstra的算法需要使用deleteMin()和decreaseKey()?

时间:2012-06-21 11:46:19

标签: algorithm language-agnostic computer-science dijkstra

在大多数伪代码中,我通常会发现以下内容:

  
      
  • DeleteMin(返回具有最小键的元素并将其从集合中删除。)

  •   
  • DecreaseKey(适应特定元素键值的减少)

  •   
  • 为什么使用DeleteMin来检索最小元素 - 为什么不是随机元素?
  • DecreaseKey的目的是什么?在伪代码中,它总是在元素的值改变之后调用。它在做什么?

1 个答案:

答案 0 :(得分:6)

  

为什么使用DeleteMin来检索最小的元素 - 为什么不呢   一个随机的?

我们从Q集合中检索并删除最小元素    打开顶点,因为它确保了最小化(后来在证明中使用)。    没有它 - 无法保证最小化功能,并且解决方案将不是最佳的(不会是最短路径)。请记住,一旦我们找到v的路径,我们就会将其从Q中移除,并且永远不会重新打开它,因此我们取出的边缘必须具有可用路径最小的边缘。

注意,对于这个(最小的)顶点,让它为v:对于u Q中的每个d(u) + x <= d(v) - 因为dijkstra的算法在没有时使用负边缘,x> = 0。
对于任何其他顶点 - 这不是最小的 - 我们不能保证没有更短的路径可供发现。

  

DecreaseKey的目的是什么?在伪代码中,它总是被调用   在元素的值改变之后。它在做什么?

使用减少因为我们可能找到了一条新的,更好的路径连接到我们找到的最后一个顶点的顶点。 这一步是dijkstra算法正在制定的放松步骤。请记住,dijkstra算法始终保持到目前为止每个顶点找到的最短路径,因为最后一步可能找到了到达某个顶点的新的最短路径 - 这一步是更新到目前为止找到的最短路径。