【问题标题】:How to calculate the space complexity of function?如何计算函数的空间复杂度?
【发布时间】:2015-07-25 01:32:43
【问题描述】:

如果我有这样的功能,我基本了解:

int sum(int x, int y, int z) {
  int r = x + y + z;
  return r;
}

参数需要 3 个单位的空间,局部变量需要 1 个空间,这永远不会改变,所以这是O(1)

但是如果我有这样的功能呢:

void add(int a[], int b[], int c[], int n) {
    for (int i = 0; i < n; ++i) {
        c[i] = a[i] + b[0]
    }
}

a 需要 N 个单位,b 需要 M 个单位,c 需要 L 个单位,in 需要 1 个单位。所以它需要N+M+L+1+1 的存储量。

那么这里的空间复杂度大 O 会是什么?需要更高内存的那个? IE。如果 N 比 M 和 L 花费更多的时间(从更高的意思来看,假设大于 10**6) - 那么可以肯定地说空间复杂度是 O(N) 还是不像我们对时间复杂度所做的那样?

但是如果所有三个,即a,b,c都没有太大的不同

喜欢这个功能

void multiply(int a[], int b[], int c[][], int n) { 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            c[i] = a[i] + b[j];
        }
    }
}

那么空间复杂度是多少? O(N+M+L)?还是最大的?

【问题讨论】:

  • 当我们谈到空间复杂度时,通常我们指的是需要辅助空间——而不是输入本身的空间。
  • 空间复杂度包括辅助空间和输入使用的空间。对吗?
  • @AnkurAnand 从技术上讲,是的。但许多人使用该术语仅表示辅助空间复杂度。具体来说,您想知道诸如“如果我通过 100 个函数传递这个大型数据集,我会占用多少内存,我会创建多少垃圾?”

标签: algorithm space-complexity


【解决方案1】:

算法或数据结构的空间复杂度是在任何时候使用的最大空间量,忽略算法输入使用的空间。 因此,您问题中所有三个示例的空间复杂度均为 O(1)

【讨论】:

    【解决方案2】:

    当我们谈论空间复杂度时,我们不考虑输入使用的空间。

    这让我们可以讨论常量空间、O(log n) 空间等算法。如果我们开始计算输入,那么所有算法都至少是线性空间!

    空间复杂度的标准多带图灵机定义也不计算输出。

    输入是只读的,输出是只写的,不计入空间复杂度。

    所以回答你的问题:寻找你的方法是什么记忆 分配,包括递归/局部变量等的堆栈空间,这将 确定空间复杂度。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2015-09-26
      相关资源
      最近更新 更多