这个程序的空间复杂性是多少?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个程序的空间复杂性是多少?相关的知识,希望对你有一定的参考价值。

这只是一个用于计算空间复杂度的测试函数,如果我们考虑堆栈帧的数量而不是它将是o(n)但是那些在for循环和2-d内的数组a和b又会在每次递归中占用一些内存打电话,我的教授告诉我们,空间复杂度是堆栈帧的大小,但它也消耗了一些空间,因为for循环也应该考虑堆栈帧和两个数组和二维数组或者给它们中的任何一个优先级和为什么?

我只关注空间复杂性,所以忘记结果或垃圾收集

testfun(n){
  if(n==0)
  return;
  int c[10][10];
  int *a=malloc(sizeof(int)*n);
  int *b=malloc(sizeof(int)*n);
  for(int i=0;i<n;i++)
  {  a[i]=n+2*i;
     b[i]=n+3*i;
  }
  for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
     {
        c[i][j]=1;
     }
  testfun(n-1);
  free(a);
  free(b); 
  }
答案

你可能会想到free功能。但是,递归发生在theese free功能之前。因此,在函数的每次调用中,取决于输入的值(i),分配的空间的大小是2i。由于停止时间是在n == 0,总的空间复杂性是sum_{i = 1}^{n} 2*i = 2*n(n+1)/2 = \Theta(n^2)

另一答案

如果在调用函数之前释放了内存位置,则问题的空间复杂度为O(n),因为每次调用函数都需要记住堆栈变量。

free(a);
free(b);
test(n - 1);

另外,在每个函数调用中,函数也分配O(n)空间,并且在后续的递归调用中也是如此。因此空间复杂度为O(n ^ 2)。

使用替换方法:

S(0) = 0
S(n) = S(n - 1) + 2n                 -------- (1)
S(n - 1) = S(n - 2) + 2 (n - 1)      -------- (2)
S(n - 2) = S(n - 3) + 2 (n - 2)      -------- (3)

使用(1),(2),(3)

S(n) = S(n - 1) + 2n
S(n) = S(n - 2) + 2 (n - 1) + 2n
S(n) = S(n - 3) + 2(n - 2) + 2(n - 1) + 2n
 .
 .
 .
 .
S(n) = S(n - k) + 2(n - (k - 1)) + ... + 2n

Let k = n

S(n) = S(n - n) + 2(1) + 2(2) + ... 2(n)
S(n) = S(0) + 2(n * (n + 1)) / 2
S(n) = 0 + n^2 + n

因此空间复杂度为O(n ^ 2)。

另一答案

上述程序的空间复杂性是O(n^2).原因是a and b的大小为n,因此它们都具有O(2n)的空间复杂度,这只是O(n)。现在递归只是来自n to 1,每次递归调用都会消耗O(n)空间。因此空间复杂性将是O(n^2).

另一答案

上述程序的空间复杂度是用于二维矩阵的O(n^2)+O(n) O(n^2)和用于一维阵列的O(n)

以上是关于这个程序的空间复杂性是多少?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码的时间和空间复杂度是多少?

这个特定代码的时间复杂度是多少?

算法的时间复杂度和空间复杂度

时间复杂度与空间复杂度

时间复杂度和空间复杂度

如果一个帮助栈在问题解决后几乎完全删除,空间复杂度是多少?