递归字符串置换函数的复杂性

时间:2011-03-19 17:28:53

标签: algorithm string complexity-theory

来自:Are there any better methods to do permutation of string?

这个函数的复杂性是什么?

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);
        }
    }
}

3 个答案:

答案 0 :(得分:24)

忽略打印,满足递归关系

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!)

答案 1 :(得分:8)

如果不深入研究你的代码,我想我可以合理地确信它的复杂性是O(n!)。这是因为枚举n个不同元素的所有排列的任何有效过程都必须迭代每个排列。有n!排列,因此算法必须至少为O(n!)。

编辑:

这实际上是O(n * n!)。感谢@templatetypedef指出这一点。

答案 2 :(得分:2)

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

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

这将计算算法的复杂性。

Actualy O(N)是N!!! = 1 * 3 * 6 * ... * 3N