自述
首先,该篇文章不会长篇大段的去解释书本上关于空间复杂度的定义和描述字眼。而是,给你一段程序,自己去体悟空间复杂度的核心含义与思想。
空间复杂度
问题:求1+2+3+…+n的和!
c语言代码片段1:
#include<iostream>
using namespace std;
main()
{
int n, i;
long long sum = 0;
cin>>n;
for(i =1; i <= n; i++){
sum += i;
}
cout<<sum;
return 0;
}
解析:从上方程序不难看出,这个是通过最平常的for循环来进行累加求和。从空间上来讲,该段程序在进行累加求和时,只需要在存储空间中开辟两块数据存储区,一个用来存放sum,一个用来存放i。我们可以把这段程序的空间复杂度暂时理解为2。
c语言代码片段2:
#include<iostream>
using namespace std;
long long sum(int n)
{
if(n == 1){
/* 递归结束条件 */
return 1;
}
else{
/* 调用自身进行递归 */
return n + sum(n - 1);
}
}
int main()
{
int n;
cin>>n;
cout<<sum(n);
return 0;
}
解析:如果你运行此段代码,并且输入100000,会发现程序运行不出结果,而且显示一句看不懂的数字。这是因为程序的运行空间溢出了,或者说该段程序的空间复杂度太高。原因是:当我们运行一段代码时,会在代码开始运行时开辟一块空间,并在运行过程中根据需要不断的去申请开辟新空间来维持程序运行。那么,可想而知,递归的话,该段程序会不停的占据空间不释放,且不停的递归开辟新空间,直到满足地递归结束条件,再一层层的往前释放空间。我们假设递归函数所占内存空间的大小是k,那如果求和的数值为n,那么该段程序运行时的空间复杂度即为:k*n,所以递归求和会因求和的个数过多而求和失败。
参考文献:空间复杂度
至此,完毕。