来自: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);
}
}
}
答案 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