最差的SPFA测试用例

时间:2016-05-03 08:20:19

标签: algorithm graph-theory

最近,我读到了有关最短路径更快算法的内容。我想知道如何构建一个测试用例,其中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

2 个答案:

答案 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 个顶点的图的最坏情况是:Graph with 5 vertices

在每次迭代中,队列将具有以下元素(队列的头部是最左边的元素):

[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被执行的次数:

enter image description here

其中是 O(V^3),其中 V 是顶点数。因为这个示例图会很密集,有 O(V^2) 条边。最终的复杂度可以写成 O(V*E),其中 E 是边的数量。与SPFA最坏情况的复杂性相同。 https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm#Worst-case_performance