Time complexity 特定函数big-O的时间复杂度

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)

如果之前已经回答过,我会提前道歉

我知道以下代码的时间复杂度是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);
  }//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次调用

  • 在n=3时,我们循环3次,每次迭代调用置换(2)两次,但在n=4时,我们进行了8次这样的调用,总共3 x 2 x 8=48次调用

  • 在n=2时,我们循环2次,每次迭代调用置换(1)两次,但在n=3时,我们进行了48次这样的调用。因此总共2 x 2 x 48=192次调用

  • 在n=1时,我们循环1次,每次迭代调用
    置换(0)
    两次,但在n=2时,我们进行了192次这样的调用

  • 我们不关心n=0,因为这是基本情况

  • 检查递归的增长,我们有一个
    置换(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

    看起来我们可以推断它是O((2^n)*(n!))


    解决递归关系:

    现在,我已经修改了使用杜克大学的解决递归关系,调整了解决此问题的方法:

    • 设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,那么是的,您是正确的。