为什么 Dijkstra 算法(最短路径)的时间复杂度与 DFS 不同?

Why isnt Dijkstra's algorithm's (for shortest path) time complexity the same as DFS?

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

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

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

总之,运行时间是线性的,但算法不正确

我们以这张图为例,搜索应该从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 将看不到此更改对 c 的影响d.

它也从d中看到c并更新c为12。然后有BFS 无事可做,显然结果是错误的。