该程序的空间复杂度是多少?

时间:2018-10-20 10:01:22

标签: c algorithm

这只是用于计算空间复杂度的测试函数,如果我们考虑 我的教授告诉我们,空间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); } 内的数组a和b以及二维数组在每个递归调用中都会占用一些内存,那该怎么办呢?堆栈框架的大小,但在for循环中也要占用一些空间 我应该同时考虑堆栈框架,两个数组和二维数组还是优先考虑其中一个?为什么?

  

我只是关注空间的复杂性,所以请忽略结果或垃圾回收

  struct JuzgadosList : Codable {
    var CP : Int
    var TEL : String
    var LOCAL : String
    var ORGANO : String
    var DIR : String
}

4 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

以上程序的空间复杂度为O(n^2). 原因是a and b的大小为n,因此它们两个的空间复杂度均为O(2n),而O(n)就是这样。 现在,递归仅来自n to 1,每个递归调用都占用O(n)空间。因此,空间复杂度将为O(n^2).

答案 3 :(得分:0)

上述程序的空间复杂度对于二维矩阵为LocalDatabase O(n^2)+O(n),对于O(n^2) 用于一维数组