首先,该篇文章不会长篇大段的去解释书本上关于空间复杂度的定义和描述字眼。而是,给你一段程序,本身去体悟空间复杂度的核心含义与思想。ios
问题:求1+2+3+…+n的和!web
c语言代码片断1:ide
#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。svg
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,因此递归求和会因求和的个数过多而求和失败。spa
参考文献:空间复杂度
至此,完毕。code