空间复杂度度量


前言

空间复杂度是算法复杂度度量的一部分,其可以分析算法的空间存储效率。


一、空间复杂度定义

空间复杂度(space complexity)是指当前问题规模以某种单位从1增加到S(n)时,解决该问题的算法在执行时所占用的存储空间也以某种单位由1增加到S(n),则称该算法的空间复杂度为S(n)

二、存储空间的分类

1.固定部分

固定部分的空间大小与输入输出的个数多少、数值的大小均无关。其主要包括存放程序指令代码的空间,常数、简单变量、定长成分(如数组元素、结构成分、对象的数据成员等)变量所占的空间等。该部分为静态空间,只需要简单的进行统计就可以估算其空间复杂度。

2.可变部分

该部分的空间主要包括其与问题规模有关的变量所占空间、递归工作栈所用空间,以及在算法运行过程中通过new(C++)和delete(C++)命令动态使用的空间。

三、空间复杂度度量举例

计算表达式的函数1

float abc(float a, float b, float c){
	return a+b+b*c+(a+b-c)/(a+b);
}

在函数1中,该函数的问题规模由a,b,c决定,而a,b,c各占一个存储空间单位,所以该函数在运行过程中所需存储空间为一个常数。

累加前n项的迭代算法2

float sum(float a[], const int n){
	float s = 0.0;
	for(int i=0; i<n; i++)
		s+=a[i];
	return s;
}

在算法2中,该算法的问题规模为n。 其在程序中用到了一个整数n来存储累加项的个数,用到了一个浮点数s作为存放累加值的存储空间,另外对于数组a[ ]来说,只耗费了一个空间单元存放了它第一个元素a[0]的地址。因此,该算法的所需存储空间也为一个常数。

累加前n项的递归算法3

float rsum(float a[], const int n){
	if(n<=0) 
		return 0
	else 
		return rsum(a,n-1)+a[n-1];
}

在算法3中,该算法为递归的算法,问题规模同样也为n。为了实现递归过程用到了一个递归工作栈,每递归一层就要加一个工作记录到递归工作栈中,工作记录为形式参数(a[ ] 的首地址a[0]和n)、函数返回值以及返回地址,保留了4个存储单元。由于算法的递归深度为 n+1 ,故所需的栈空间是4(n+1)。


总结

上述两种存储空间的分类较为好估计,最不好估算的是设计动态存储分配时的存储空间需求。若使用了k次new命令,动态分配了k次空间单位。但如果没有运用delete命令来对这些申请的动态空间进行释放的话,那么占用的存储空间就等于分配的空间数了。如果使用了m次的delete命令,那么就不能简单的用new分配的空间数减去delete释放的空间数,必须具体分析。若用n代表new,d代表delete,一个算法过程中执行new和delete的顺序为nnndnndndddnnnnnn,则分析这个序列就可以计算空间复杂度了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值