为什么这个函数的空间复杂度是m * n?

时间:2018-03-17 19:10:18

标签: c recursion time-complexity complexity-theory space-complexity

为什么此函数的空间复杂度 n * m 而不是 m * log(n)? 因为在每个函数递归中,(m*2^i)/2^i = mi0转到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);
}

1 个答案:

答案 0 :(得分:4)

递归中存在(近似)不变性:

n * m = (n/2) * (m*2)

因此,当您的递归更深入时,m会变得越来越大,直到n = 1,其中mm*n处开始。{/ p>

你的内存分配只是

p = (double*)malloc(m * sizeof(double));

在进行下一次递归之前,它是free。因此最大的m是最大空间复杂度,即O(mn)