web-dev-qa-db-ja.com

再帰的な文字列置換関数の複雑さ

From: 文字列の順列を行うためのより良い方法はありますか?

この関数の複雑さは何ですか?

void permute(string elems, int mid, int end)
{
    static int count;
    if (mid == end) {
        cout << ++count << " : " << elems << endl;
        return ;
    }
    else {
    for (int i = mid; i <= end; i++) {
            swap(elems, mid, i);
            permute(elems, mid + 1, end);
            swap(elems, mid, i);
        }
    }
}
20
rajya vardhan

印刷を無視すると、満たされる漸化式は

T(n) = n*T(n-1) + O(n)

G(n) = T(n)/n!の場合

G(n) = G(n-1) + O(1/(n-1)!)

これはG(n) = Theta(1)を与えます。

したがって、T(n) = Theta(n!)

印刷が正確に_n!_回行われると仮定すると、時間計算量は次のようになります。

Theta(n * n!)

26
Aryabhatta

コードを深く見なくても、その複雑さはO(n!)であると合理的に自信を持って言えると思います。これは、n個の異なる要素のすべての順列を列挙する効率的な手順では、各順列を反復処理する必要があるためです。 nあります!順列であるため、アルゴリズムは少なくともO(n!)である必要があります。

編集:

これは実際にはO(n * n!)です。これを指摘してくれた@templatetypedefに感謝します。

8
MAK
long long O(int n)
{
    if (n == 0)
        return 1;
    else 
       return 2 + n * O(n-1);
}

int main()
{
    //do something
    O(end - mid);
}

これにより、アルゴリズムの複雑さが計算されます。

実際にはO(N)はN!!! = 1 * 3 * 6 * ... * 3N

2