空间复杂度
算法的存储量包括:
- 程序本身所占空间;
- 输入数据所占空间;
- 辅助变量所占空间。
输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。
空间复杂度是对一个算法在运行过程中临时所占的存储空间大小的度量,一般也作为问题规模n的函数,以数量级形式给出,记作:S(n)=O(g(n))
空间复杂度计算
- 空间复杂度分析1:
int fun(int n){
int i,j,k,s;
s=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k1;k<=n;k++)
s++;
return(s)
}
算法中临时变量的个数与问题规模n无关,所以空间复杂度均为S(n)=O(1)。
2. 空间复杂度分析1:
void fun(int a[], int n,int k)
//数组a中有n个元素
{
int i;
if(k==n-1)
for (int i=0;i<=n;i++)
print("%d\n", a[i]);//执行n次
else
{
for(int i=k;i<=n;i++)
a[i]=a[i]+i*i
fun(a,n,k+1)
}
}
这个属于递归算法,每次调用本身都要分配空间, fun(a,n,1)的空间复杂度为O(n)。
使用递归:思路简单,代码简单,很方便。但是占用空间多,效率低下。
注意:
- 空间复杂度相比时间复杂度分析要少
- 对于递归算法来说,代码一般都比较简短,算法本身所占用的存储空间较少,但运行时需要占用较多的临时工作单元;
若写成非递归算法,代码一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。