【问题标题】:Understanding this explanation on why Dijkstra's algorithm fails on graphs with negative edges?理解为什么 Dijkstra 的算法在带有负边的图上失败的解释?
【发布时间】:2015-12-22 06:25:29
【问题描述】:

我正在阅读 Sanjoy DasGupta 的名为“算法”的书(第 122 页)中存在负边时的最短路径

http://beust.com/algorithms.pdf

Dijkstra 算法之所以有效,部分原因是从 任何节点 v 的起点 s 必须排他地通过节点 比 v 更接近。当边长可以是 消极的。在图 4.12 中,从 S 到 A 的最短路径经过 B,更远的节点。

    (S,A) = 3, (S,B)=4, (B,A)= =2



S-----3--------A
   |           ^
   |           |
   4          -2
   |           |
   |           |
   B----------->

为了适应这种新的变化,需要进行哪些更改 并发症?为了回答这个问题,让我们从一个特定的高级视图 Dijkstra 算法。一个关键的不变量是 dist 值 它认为总是高估或完全正确。他们 从无穷大开始,他们改变的唯一方法是 沿边更新

procedure update((u; v) belongsto E)
dist(v) = min{dist(v), dist(u) + l(u,v)}

这个更新操作只是一个事实的表达,即 到 v 的距离不可能大于到 u 的距离,加上 l(u, v)。它具有以下属性。 1. 在 u 是到 v 的最短路径中的倒数第二个节点且 dist(u) 的特定情况下,它给出了到 v 的正确距离 正确设置。 2.它永远不会使dist(v)太小,从这个意义上说它是安全的。例如,大量无关的更新不会造成伤害。

这个操作非常有用:它是无害的,如果使用 仔细,将正确设置距离。实际上,Dijkstra 算法 可以简单地认为是一系列更新。我们知道这一点 特定序列不适用于负边缘,但是否存在 其他一些序列呢?为了了解这个属性 序列必须具备,我们挑一个节点t,看看最短的 从 s 到它的路径。

我对上述文字的问题是

  1. 作者所说的第二个属性是什么意思? “它永远不会使 dist(v) 变得太小,从这个意义上说它是安全的。例如,大量无关的更新不会造成伤害。”我无法理解这个
  2. 作者所说的“我们知道这个特定的序列不适用于负边,但是还有其他序列可以吗?”是什么意思?我不是以英语为母语的人,很难理解这句话吗?

【问题讨论】:

    标签: algorithm graph-algorithm dijkstra


    【解决方案1】:

    对于您的第一个问题 - “它永远不会使 dist(v) 太小”这句话是什么意思? - 我认为作者指的是 Dijkstra 算法的一个特定属性:如果您查看 Dijkstra 算法存储到图中每个节点的距离,存储到特定节点的距离永远不会小于实际距离。事实上,如果您有非负边权重并在运行 Dijkstra 算法时查看距离,则距离将不断减小和减小,直到它们最终收敛于真实距离。从这个意义上说,Dijkstra 的算法不断地获得越来越好的真实距离近似值,但从来没有一个节点的距离太短。

    对于您的第二个问题,我认为作者要求您考虑如果您要在任何输入图上运行 Dijkstra 算法会发生什么。随着算法的运行,它不断更新对图中起始节点和其他节点之间距离的猜测。作者说,如果你运行 Dijkstra 的算法并观察它是如何工作的,你会看到一系列对某个子程序 update 的调用会改变这些距离。即使算法给出了错误的最终答案,它仍然可以通过反复调用update 来工作。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多