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

raj*_*han 20 string algorithm complexity-theory

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 26

忽略打印​​,满足的重现关系是

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


MAK*_*MAK 8

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

编辑:

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

  • @ MAK- O(n!)!= O((n + 1)!).确实,任何O(n!)也是O((n + 1)!),但相反的情况并不成立.快速证明 - (n + 1)!平凡地= O((n + 1)!).现在假设(n + 1)!= O(n!); 那么必须有一些c,n0,这样任何n> n0,(n + 1)!<cn!这意味着对于任何n> n0,n <c,这对于任何常数c都是不可能的. (6认同)