2010-12-14 84 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