如何计算函数的空间复杂度?

时间:2015-05-13 16:19:16

标签: algorithm space-complexity

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

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会在这里出现什么?需要更高记忆的那个? 即如果N比M和L更高的momery(从更高的意义上假设大于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)?还是最大的?

2 个答案:

答案 0 :(得分:9)

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

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

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

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

  

所以回答你的问题:寻找你的方法记忆   分配,包括用于递归/局部变量等的堆栈空间,以及   确定空间复杂性。

答案 1 :(得分:8)

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

相关问题