为什么此函数的空间复杂度 n * m 而不是 m * log(n)?
因为在每个函数递归中,(m*2^i)/2^i = m
和i
从0
转到log(n)
所以它必须是 m * logn ,是什么我在这里失踪了?
void f3(int n, int m) {
double *p;
int i;
if (n <= 1)
return;
p = (double *)malloc(m * sizeof(double));
if (p == NULL)
return;
for (i = 0; i < n; i++)
if (i < m)
p[i] = i;
printf("%f ", p[0]);
free(p);
f3(n / 2, m * 2);
f3(n / 2, m * 2);
}
答案 0 :(得分:4)
递归中存在(近似)不变性:
n * m = (n/2) * (m*2)
因此,当您的递归更深入时,m
会变得越来越大,直到n = 1
,其中m
在m*n
处开始。{/ p>
你的内存分配只是
p = (double*)malloc(m * sizeof(double));
在进行下一次递归之前,它是free
。因此最大的m
是最大空间复杂度,即O(mn)
。