【问题标题】:Why isnt Dijkstra's algorithm's (for shortest path) time complexity the same as DFS?为什么 Dijkstra 的算法(最短路径)时间复杂度与 DFS 不同?
【发布时间】:2020-02-16 09:25:54
【问题描述】:

Dijkstra 算法不能使用 DFS 来实现,该 DFS 跟踪当前行进路径的长度,并且每次到达未访问节点时,它都会更新到该节点的最短路径的长度,以及节点是否到达at已经被访问过,如果当前长度小于节点中的长度,是否更新长度?

这只是 DFS,这意味着运行时间应该是线性的( O(|V| + |E|) )。

【问题讨论】:

  • 嗯,不,因为那样就不再是 Dijkstra 的算法了。
  • 它实现的不是一样的吗?
  • 你怎么知道,它是“最短的”(当你没有(重新)对节点进行排序时...... dijksra 用额外的O(log(|V|)) 时间复杂度来做)......?跨度>
  • 并非如此,如果您“如果当前长度小于节点中的长度则更新长度”,当从更新的节点到达它们时,可能还有其他节点需要更新。
  • 如果我把DFS换成BFS,估计也有问题,你知道吗?

标签: algorithm depth-first-search dijkstra


【解决方案1】:

我们以这个图为例,搜索应该从a开始,目标节点是c

DFS

假设节点的子节点按其词法顺序遍历,DFS 将按 a、b、c、d、e 的顺序访问节点

它会找到这些距离:

 a: 0
 b: 5
 c: 13
 d: 8

然后从d会再次看到c,更新到12

接下来是:

 e: 1

e 它将再次看到 b,并将其更新为 3。但是 DFS 还没有看到此更改对节点的影响 cd.

迪杰斯特拉的

另一方面,Dijkstra 算法将按以下顺序访问节点:

 a: 0
 e: 1
 b: 3

然后它将占据权重为 5 的边,但看到 b 已经被访问过,忽略它。那么:

 d: 6
 c: 10

...并且找到了正确距离的目标。

BFS

只是在下面回答您的评论:BFS 也不会找到正确的路径,因为 BFS 没有考虑(总)权重;它只是最小化路径上的边数。

BFS 会像这样访问节点:

a: 0

b: 5
e: 1

c: 13

...它会停在那里。如果您不停止,而是继续(可能会被覆盖),那么该过程将继续:

d: 8

然后它从e中看到b,并更新:

b: 3

但是,由于 b 已经被访问过,BFS 不会看到此更改对 cd 的影响。

它还从d中看到c并将c更新为12。那么BFS就没什么可做的了,结果一目了然错了。

【讨论】:

  • 如果我用 BFS 替换 DFS,我猜它仍然会有一些问题,你知道吗?
  • BFS 不会考虑权重,因此您可以将搜索扩展到距起点 2 步、3 步、4 步等,而 Dijkstra 将基于路径扩展在总权重上,因此某些路径可能比其他并发路径具有更多边。显然,BFS 有可能通过一条边较少但权重较大的路径到达目标。事实上,我在回答中给出的例子也证明了这一点。 BFS 会分两步找到 c 并停止。
  • 我在答案中添加了关于 BFS 的部分。
【解决方案2】:

当你到达一个被访问的节点 A 时,假设当前路径的长度比 A 中的长度短,所以你将长度更新为 A。但是那些与 A 连接的节点呢?你也需要更新它们,但你不能,因为 A 已经被访问过。

简而言之,运行时间是线性的,但算法不正确。

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2014-02-04
    • 2020-09-22
    相关资源
    最近更新 更多