Time complexity 特定函数big-O的时间复杂度
如果之前已经回答过,我会提前道歉 我知道以下代码的时间复杂度是O(n!):Time complexity 特定函数big-O的时间复杂度,time-complexity,big-o,Time Complexity,Big O,如果之前已经回答过,我会提前道歉 我知道以下代码的时间复杂度是O(n!): void permutations(int n){ if(n!=0){ for(int i=0; i<n; i++){ permutations(n-1); }//for }//if }//permutations void permutations(int n){ if(n!=0){ permutations(n-1); permutations(n-1)
void permutations(int n){
if(n!=0){
for(int i=0; i<n; i++){
permutations(n-1);
}//for
}//if
}//permutations
void permutations(int n){
if(n!=0){
permutations(n-1);
permutations(n-1);
}//if
}//permutations
但是,我很难确定以下代码的复杂性,我怀疑它是O((n^2)*(n!)),但我不确定这是否正确。如果有人能解释我是否正确,以及为什么,我将不胜感激
void permutations(int n){
if(n!=0){
for(int i=0; i<n; i++){
permutations(n-1);
permutations(n-1);
}//for
}//if
}//permutations
void置换(int n){
如果(n!=0){
对于(inti=0;i我相信您的输入有误,意思是O((2^n)*(n!)),这就是答案
外行的方法:
不做证明(我自己有点生疏),考虑n=4:
- 在n=4时,我们循环4次,每次迭代调用置换(3)
两次,总共4 x 2=8次调用
置换(0)
两次,但在n=2时,我们进行了192次这样的调用置换(4)
的单个调用增长到384个调用
- 384==1 x 2 x 192
- 1 x 2(2 x 2 x 48)
- 1 x 2 x(2 x 2 x(3 x 2 x(4 x 2)))
- 2x2x2x2x2x4x3x2x1
- 2^4 x 4
解决递归关系: 现在,我已经修改了使用杜克大学的解决递归关系,调整了解决此问题的方法:
- 设T(n)为执行置换(n)的时间,T(0)=1
- 我们知道T(n)=nx2xt(n-1)
- 这是因为循环n次,执行置换(n-1)两次
- T(n)=nx2x((n-1)x2xt(n-2))
- T(n)=nx2x((n-1)x2x((n-2)x2xt(n-3)))
- 因此,我们可以将k展开式推广为T(n)=2^k*k!
- 我们可以观察因子n,n-1,n-2,…,1(在基本情况下),这是阶乘分量(k!)
- 在每次展开时,我们有额外的因子2,因此是2^k
- 因为基本情况是n=0,我们有k=n
因此,O((2^n)*(n!))你做了什么来解决这个问题?看看递归树:在
O(n!)
版本中,每个循环迭代分支一次,现在改为分支两次……f(n)=2n*f(n-1)的置换(0)
调用次数=2^n*n!。如果n^2是指2^n,那么是的,您是正确的。