空间复杂度:
在许多地方,术语“空间复杂性”被误用于辅助空间。以下是辅助空间和空间复杂性的正确定义。
辅助空间是算法使用的额外空间或临时空间。
算法的空间复杂度是算法相对于输入大小占用的总空间。空间复杂度包括辅助空间和输入所使用的空间。
例如,如果我们要比较基于空间的标准排序算法,那么辅助空间将是比空间复杂度更好的标准。合并排序使用O(n)辅助空间,插入排序和堆排序使用O(1)辅助空间。所有这些排序算法的空间复杂度均为O(n)。
空间复杂度是时间复杂度的并行概念。如果我们需要创建一个大小为n的数组,则将需要O(n)空间。如果我们创建大小为n * n的二维数组,则将需要O(n 2 )空间。
在递归调用中,堆栈空间也很重要。
例子 :
int add (int n){
if (n <= 0){
return 0;
}
return n + add (n-1);
}
Here each call add a level to the stack :
1. add(4)
2. -> add(3)
3. -> add(2)
4. -> add(1)
5. -> add(0)
Each of these calls is added to call stack and takes up actual memory.
So it take O(n) space.
但是,仅仅因为您总共有n次调用,并不意味着它占用O(n)空间。
看下面的函数:
int addSequence (int n){
int sum = 0;
for (int i = 0; i < n; i++){
sum+ = pairSum(i, i+1);
}
return sum;
}
int paiSem(int x, int y){
return x + y;
}
There will be roughly O(n) calls to pairSum. However, those
calls do not exist simultaneously on the call stack,
so you only need O(1) space.
注意:必须指出,空间复杂度取决于多种因素,例如编程语言,编译器,甚至是运行算法的机器。