C 这个项目的空间复杂度是多少? 这只是一个用于计算空间复杂度的测试函数,如果我们考虑 堆栈帧的数量比o(n)要多,但是for循环中的数组a和b以及在每次递归调用中也会占用一些内存的二维数组呢?我的教授告诉我们,空间复杂度是堆栈帧的大小,但它也会在for循环中消耗一些空间 我应该同时考虑这是栈帧和两个数组和2-D数组还是给它们中的任何一个优先级?为什么?
我只关注空间的复杂性,所以忘记结果或垃圾收集C 这个项目的空间复杂度是多少? 这只是一个用于计算空间复杂度的测试函数,如果我们考虑 堆栈帧的数量比o(n)要多,但是for循环中的数组a和b以及在每次递归调用中也会占用一些内存的二维数组呢?我的教授告诉我们,空间复杂度是堆栈帧的大小,但它也会在for循环中消耗一些空间 我应该同时考虑这是栈帧和两个数组和2-D数组还是给它们中的任何一个优先级?为什么?,c,algorithm,C,Algorithm,我只关注空间的复杂性,所以忘记结果或垃圾收集 testfun(n){ 如果(n==0) 返回; INTC[10][10]; int*a=malloc(sizeof(int)*n); int*b=malloc(sizeof(int)*n); 对于(int i=0;i上述程序的空间复杂度为O(n^2)。 这是因为a和b的大小为n,因此它们的空间复杂度均为O(2n),即O(n)。 现在递归简单地从n到1,每个递归调用消耗O(n)空间。因此空间复杂度将是O(n^2)。问题的空间复杂度是O(n)如果在调用
testfun(n){
如果(n==0)
返回;
INTC[10][10];
int*a=malloc(sizeof(int)*n);
int*b=malloc(sizeof(int)*n);
对于(int i=0;i上述程序的空间复杂度为O(n^2)。
这是因为a和b
的大小为n,因此它们的空间复杂度均为O(2n)
,即O(n)
。
现在递归简单地从n到1
,每个递归调用消耗O(n)
空间。因此空间复杂度将是O(n^2)。
问题的空间复杂度是O(n)如果在调用函数之前释放了内存位置,因为每次调用函数都需要记住堆栈变量
free(a);
free(b);
test(n - 1);
在每个函数调用中,函数分配O(n)空间,在后续递归调用中也是如此。因此,空间复杂度为O(n^2)。
使用替代法:
使用(1)、(2)、(3)
因此,空间复杂度为O(n^2)。您可能会想到free
函数。但是,递归发生在seefree
函数之前。因此,在函数的每次调用中,取决于输入值(i
),分配的空间大小为2i
。当停止时间为n==0
时,总空间复杂度为sum{i=1}{n}2*i=2*n(n+1)/2=\Theta(n^2)
上述程序的空间复杂度为O(n^2)+O(n)
O(n^2)
对于二维矩阵和O(n)
对于一维数组现在我修改了空间复杂度是多少的问题?@Alishachaudhary空间复杂度不会改变,因为c
只包含10×10个元素,这只是一个常数O(1).您是否想这样说来总结一下,递归算法的空间复杂度与生成的递归树的最大深度成正比。如果递归算法的每个函数调用占用O(m)空间,并且如果递归树的最大深度为“n”,则递归算法的空间复杂度将为O(nm)。
free(a);
free(b);
test(n - 1);
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)
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