我理解基本的,如果我有这样的功能:
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个单位,i
和n
需要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)
?还是最大的?
答案 0 :(得分:9)
当我们谈论空间复杂性时,我们不考虑输入使用的空间。
这使我们可以讨论恒定空间,O(log n)空间等算法。如果我们开始计算输入,那么所有算法至少都是线性空间!
标准的多磁带图灵机定义空间复杂度也不计算输出。
输入是只读的,输出是只写的,不计入空间复杂度。
所以回答你的问题:寻找你的方法记忆 分配,包括用于递归/局部变量等的堆栈空间,以及 确定空间复杂性。
答案 1 :(得分:8)
算法或数据结构的空间复杂度是任何时候使用的最大空间量,忽略算法输入使用的空间。 因此,您问题中所有三个示例的空间复杂度为O(1)