6

グラフ内の最長パスを決定するコード セグメントを作成しました。以下はコードです。しかし、途中で再帰的な方法があるため、計算の複雑さを取得する方法がわかりません。最長パスを見つけることは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);
}
4

1 に答える 1

8

再帰関係は ですT(n, m) = mT(n, m-1) + O(n)。ここでn、ノードの数を示し、未訪問のmノードの数を示します (時間を呼び出しlongestPath m、訪問したテスト時間を実行するループがあるため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!)
于 2010-12-14T10:40:54.870 に答える