这只是用于计算空间复杂度的测试函数,如果我们考虑
我的教授告诉我们,空间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
}
答案 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)
用于一维数组