最近,我读到了有关最短路径更快算法的内容。我想知道如何构建一个测试用例,其中SPFA的标准实现非常非常慢。你知道吗?
通过标准实现,我的意思是来自维基百科的这个:
procedure Shortest-Path-Faster-Algorithm(G, s)
1 for each vertex v ≠ s in V(G)
2 d(v) := ∞
3 d(s) := 0
4 offer s into Q
5 while Q is not empty
6 u := poll Q
7 for each edge (u, v) in E(G)
8 if d(u) + w(u, v) < d(v) then
9 d(v) := d(u) + w(u, v)
10 if v is not in Q then
11 offer v into Q
答案 0 :(得分:2)
例如。有N个顶点。第一个顶点是起点,第N个顶点是结尾。对于第i个顶点,有2个边:(i,i + 1,1)和(1,i,2 * N)其中(a,b,c)表示从a到b的边有权重c。 / p>
很容易看出该图中的最短路径是1-> 2-> 3-> 4-> ...... - > N. 假设对于spfa算法的第7行:对于E(G)中的每个边(u,v),具有较大id的顶点在具有较小id的顶点之前被访问。然后第i个顶点将被推入队列max(1,i-1)次。所以总执行时间是O(N ^ 2)。
此外,如果对于第7行,具有较大id的顶点比具有较小id的顶点稍后访问,则执行时间为O(N)。
对于spfa,总会存在第7行的遍历顺序,这导致最差的时间复杂度,并且始终存在第7行的遍历顺序,这导致最佳的时间复杂度。关键是信息如何通过最短路径传播。
答案 1 :(得分:0)
根据 Ke Yang 的回答,具有 5 个顶点的图的最坏情况是:
在每次迭代中,队列将具有以下元素(队列的头部是最左边的元素):
[1]
[5, 4, 3, 2]
[4, 3, 2]
[3, 2]
[2]
[5, 4, 3]
[4, 3]
[3]
[5, 4]
[4]
[5]
这显示了一个模式:4 + 3 + 2 + 1,这表明它的 O(N^2)。
然而仔细观察,每次轮询(出队)一个顶点时,它的所有出站边都会被考虑,第 7 行。因此,第 8 行中的 if 被执行:
顶点 | 出队时间 | 出站边 | if 的总执行 |
---|---|---|---|
1 | 1 | 4 | 4 |
2 | 1 | 3 | 3 |
3 | 2 | 2 | 4 |
4 | 3 | 1 | 3 |
5 | 4 | 0 | 4 |
我们总共有: if被执行的次数:
其中是 O(V^3),其中 V 是顶点数。因为这个示例图会很密集,有 O(V^2) 条边。最终的复杂度可以写成 O(V*E),其中 E 是边的数量。与SPFA最坏情况的复杂性相同。 https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm#Worst-case_performance