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

问题描述 投票:2回答:4

这只是一个用于计算空间复杂度的测试函数,如果我们考虑堆栈帧的数量而不是它将是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); 
  }
c algorithm
4个回答
1
投票

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


1
投票

如果在调用函数之前释放了内存位置,则问题的空间复杂度为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)。


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.