0

有人可以在 for 迭代中给我这个过程的时间复杂度吗?这段代码就是 FloydWarshall 算法的“重构路径”部分。prev[n][n] 是最短路径中源节点和目标节点之间的节点矩阵。printAllSP 在迭代中运行 n^2 次,我无法真正弄清楚它每次执行的递归调用次数,只知道取决于 i 值(max n)、j 值(max n)和插入 i 和 j 之间最短路径的 k (???) 节点数,根据我的评估,包括这部分在 On^4 中运行的 for 循环,但总算法复杂度为 On^3。请启发我!

 void PrintAllSP(int i, int j, int prev[n][n]){
if (i == j)
    print i
else  {
    PrintAllSP(i, prev[i][j], prev);
    print j
}
}

//PSEUDOPART OF MAIN
for i = 1 TO n
    for j = 1 TO n
        PrintAllSP(i, j, prev);
    }
}
4

1 回答 1

2

总共有n节点,这意味着O(n^2)打印最短路径。每条最短路径中最多只能有n节点。因此,只能O(n^3)打印节点。由于每个基本递归步骤都会导致打印一个节点,这意味着O(n^3)总共只有基本递归步骤。

于 2014-07-23T20:40:34.630 回答