这个算法的空间复杂度是多少(n或log(n))?

时间:2016-10-23 20:59:34

标签: algorithm complexity-theory pseudocode space-complexity

我有一个关于这个特定伪代码的空间(内存)复杂性的问题:

int b(int n, int x) {
   int sol = x;
   if (n>1) {
      for (int i = 1; i <= n; i++) {
         sol = sol+i;
      }
      for (int k=0; k<3; k++) {
         sol = sol + b(n/3,sol/9);
      }
   }
   return sol;
}

代码被调用:b(n,0)

我的观点是,空间复杂度线性地进展,即n,因为随着输入n的增长,变量声明的数量也会增加(sol)。

而我的一位朋友坚持认为它必须是log(n)。我没有得到他的解释。但他说了第二个for循环,并且三个递归调用按顺序发生。

那么,n还是log(n)是否正确?

2 个答案:

答案 0 :(得分:1)

我认为复杂性是

  

O(log 3 base(n))

答案 1 :(得分:1)

调用函数b的总次数为O(n),但空间复杂度为O(log(n))

程序中的递归调用会导致执行堆栈增长。每次递归调用发生时,所有局部变量都被推送到堆栈(堆栈大小增加)。当函数从递归返回时,局部变量从堆栈中跳出(堆栈大小减小)。

所以你想在这里计算的是执行堆栈的最大大小,这是递归的最大深度,显然是O(log(n))