以下算法的时间复杂度是多少?

时间:2017-04-25 18:51:00

标签: c# c time-complexity

问题

我无法找到以下算法的时间复杂度:

void f2(int n) {
    int i;
    if (n == 1) {
        return;
    }
    for (i = 0; i < n; i++) {
        f2(n - 1);
    }
}

我的问题

我找到的解决方案是O(2 ^ n),但正确的答案是O(n!),我不明白这是怎么可能的,如果有人能向我解释,我将非常感激。< / p>

2 个答案:

答案 0 :(得分:2)

for (i = 0; i < n; i++) {
        f2(n - 1);
    }

所以外循环运行n次,并递归调用(n次)一个运行n-1次的内循环,直到达到1。

所以它可以n!次运行。

答案 1 :(得分:0)

考虑以下功能

void fact(int n) {
   int i;
   if (n == 1) {
      return;
   }
  for(int i=0; i<n; i++) {
    fact(n-1);
  }
}

假设n=2;

功能变为

void fact(int n) {

    fact(1);
    fact(1);

}

似乎时间复杂度是指数级的。

现在假设n=4

void fact(int n) {

    fact(3); 
    // -- this leads to fact(2) fact(2) fact(2) 
    // -- which leads to fact(1) fact(1) fact(1) fact(1) fact(1) fact1)

    fact(3);
    fact(3);
    fact(3);
}

最终以O(n!)

结束