数据结构学习笔记(二)--空间复杂度
数据结构学习笔记(二)--空间复杂度
过于简单,不做赘述。
点击进入上一篇:数据结构学习笔记(一)--时间复杂度
空间复杂度的定义
空间开销(内存开销)与问题规模n之间的关系。
空间复杂度O(1)的算法
无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,算法空间复杂度为:
S(n) = O(1) (注:S表示“Space”)
算法原地工作 ---算法所需内存空间为常量。
用c语言举例:
//算法1—— 逐步递增型爱你
void loveYou(int n){ //n为问题规模
int i = 1; //爱你的程度
while(i<=n){
i++;
printf("I Love You %d\n",i);
}
//语句5
printf("I Love You More Than %d\n",n);
}
该代码中,所需内存空间为程序代码所需内存,与局部变量(i和n)所分配内存,与n的大小,问题规模无关,故算法空间复杂度为S(n) = O(1)
空间复杂度O(n)的算法
用c语言举例:
void test(int n){
int flag[n]; //声明一个长度为n的数组
int i;
//....此处省略无关代码
}
S(n) = 4 + 4n + 4 = 4n + 8 = O(n)
重点: 空间复杂度只需关注空间大小与问题规模相关的变量
空间复杂度为O(n²)的算法
用c语言举例:
void test(int n){
int flag[n][n]; //声明一个长度为n的数组
int i;
//....此处省略无关代码
}
此时S(n) = O(n²)
空间复杂度的运算规则
加法规则
与时间复杂度的加法规则相同
乘法规则
与时间复杂度的乘法规则相同
空间复杂度从小到大排列
与时间复杂度相同,常对幂指阶
函数递归调用带来的内存开销
用c语言举例:
//算法5—— 递归型爱你
void loveYou(int n){ //n为问题规模
int a,b,c; //声明一系列局部变量
//...省略无关代码
if(n > 1){
loveYou(n-1);
}
printf("I Love You %d\n",n);
}
此时,每一次递归调用,都分配一遍存储函数的参数和局部变量内存,设每次所需分配内存为n,则n遍递归所需内存为kn,故S(n) = O(n)。空间复杂度 = 递归调用的深度。
点击进入下一篇:数据结构学习笔记(三)--线性表的定义和基本操作