Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm SPFA的最坏测试用例_Algorithm_Graph Theory - Fatal编程技术网

Algorithm SPFA的最坏测试用例

Algorithm SPFA的最坏测试用例,algorithm,graph-theory,Algorithm,Graph Theory,最近,我读到了关于最短路径更快算法的文章。我想知道如何构造一个SPFA wolud的标准实现非常非常慢的测试用例。你知道吗 说到标准实现,我指的是来自维基百科的: 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

最近,我读到了关于最短路径更快算法的文章。我想知道如何构造一个SPFA wolud的标准实现非常非常慢的测试用例。你知道吗

说到标准实现,我指的是来自维基百科的:

 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
过程最短路径快速算法(G,s)
每个顶点v为1≠ V(G)中的s
2d(v):=∞
3d(s):=0
4分为Q
5,而Q不是空的
6U:=投票Q
E(G)中每边(u,v)7个
8如果d(u)+w(u,v)
例如。有N个顶点。第一个顶点是起点,第n个顶点是终点。对于第i个顶点,有两条边:(i,i+1,1)和(1,i,2*N),其中(a,b,c)表示从a到b有一条边,权重为c

很容易看出,这个图中的最短路径是1->2->3->4->…->N。 假设对于spfa算法的第7行:对于E(G)中的每条边(u,v),id较大的顶点在id较小的顶点之前被访问。然后第i个顶点将被推入队列最多(1,i-1)次。所以总的执行时间是O(N^2)

此外,如果对于第7行,id较大的顶点比id较小的顶点访问得晚,则执行时间为O(N)


对于spfa,始终存在导致最差时间复杂度的第7行的遍历顺序,并且始终存在导致最佳时间复杂度的第7行的遍历顺序。关键是信息如何通过最短路径传播。

根据柯扬的回答,对于具有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.
维基百科上提出的测试用例有什么问题吗?我想我不明白。我已经生成了一个包含10^5个顶点和5*10^5条边的图。有10^5条带小权重(随机权重介于1和80之间)的形式边(i,i+1)。有4*10^5条随机边,权重从6000到10000。但是对于这个测试用例,我的程序运行得非常快。
[1]
[5, 4, 3, 2]
[4, 3, 2]
[3, 2]
[2]
[5, 4, 3]
[4, 3]
[3]
[5, 4]
[4]
[5]