2010-12-14 47 views
5

我写了一个代码段来确定图中最长的路径。以下是代码。但由于中间递归方法,我不知道如何获得计算复杂度。由于找到最长的路径是一个NP完整的问题,我认为它是像O(n!)O(2^n),但我怎么能真正确定它?用递归方法计算最长路径算法的复杂度

public static int longestPath(int A) { 
    int k; 
    int dist2=0; 
    int max=0; 

    visited[A] = true; 

    for (k = 1; k <= V; ++k) { 
     if(!visited[k]){ 
      dist2= length[A][k]+longestPath(k); 
      if(dist2>max){ 
       max=dist2; 
      } 
     } 
    } 
    visited[A]=false; 
    return(max); 
} 

回答

8

你的递推关系是T(n, m) = mT(n, m-1) + O(n),其中n表示节点的数量和m表示未访问节点的数量(因为你叫longestPathm倍,且有执行该访问测试n次的循环)。基本案例是T(n, 0) = O(n)(只是访问测试)。

解决这个问题,我相信你会得到T(n,n)是O(n * n!)。

编辑

工作:

T(n, n) = nT(n, n-1) + O(n) 
     = n((n-1)T(n, n-2) + O(n)) + O(n) = ... 
     = n(n-1)...1T(n, 0) + O(n)(1 + n + n(n-1) + ... + n(n-1)...2) 
     = O(n)(1 + n + n(n-1) + ... + n!) 
     = O(n)O(n!) (see http://oeis.org/A000522) 
     = O(n*n!) 
+0

我得到的想法。但是,请你解释一下你的胃口!里面大O. – nirandi 2010-12-14 14:22:15

+0

非常感谢。这更有意义。最初的O(n)是由于我们在主代码中的foor循环吗? – nirandi 2010-12-14 15:44:30

+1

而且我认为,因为对于每个节点,要访问的节点的最大数量是n-1,我认为我们应该采取T(n,n-1)。 – nirandi 2010-12-14 16:17:52