- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.3算法分析初步的
§3. ;程序性能(program performance)是指运行一个程序所需的内存大小和时间多少。所以,程序的性能一般指程序的空间复杂性和时间复杂性。;性能评估主要包含两方面:1.性能分析(performance analysis)2.性能测量(performance measurement)---- 前者采用分析的方法,后者采用实验的方法。 ;1.考虑空间复杂性的理由
● 在多用户系统中运行时,需指明分配给该程
序的内存大小;
● 想预先知道计算机系统是否有足够的内存来
运行该程序;
● 一个问题可能有若干个不同的内存需求解决
方案,可从中择取;
● 用空间复杂性来估计一个程序可能解决的问
题的最大规模。;2.考虑时间复杂性的理由
●某些计算机用户需要提供程序运行时
间的上限(用户可接受的);
●所开发的程序需要提供一个满意的实
时反应。 ;3.选取方案的规则
如果对于解决一个问题有多种可选的方案,那么方案的选取要基于这些方案之间的性能差异。对于各种方案的时间及空间的复杂性,最好采取加权的方式进行评价。但是随着计算机技术的迅速发展,对空间的要求往往不如对时间的要求那样强烈。
因此我们的分析主要强调时间复杂性。 ;(空间复杂性);空间复杂性:---- 一个算法所需的存储量,表示为n的函数,称为该算法的空间复杂性。;1.指令空间
----用来存储经过编译之后的程序指令。
程序所需的指令空间的大小取决于如下因素:
●把程序编译成机器代码的编译器;
●编译时实际采用的编译器选项;
●目标计算机。
所使用的编译器不同,则产生的机器代码的长度就会有差异。
一般情况下,指令空间对于所解决的特定问题不够敏感。 ;2.数据空间
----用来存储所有常量和变量的值。
分成两部分:
①存储常量和简单变量;
②存储复合变量。
●前者所需的空间取决于所使用的计算机和编
译器,以及变量与常量的数目(由于我们往往
是计算所需内存的字节数,而每个字节所占的数位
依赖于具体的机器环境)。
●后者包括数据结构所需的空间及动态分配的
空间。 ;3.环境栈空间
----保存函数调用返回时恢复运行所需要的信息。
当一个函数被调用时,下面数据将被保存在环境栈中:
●返回地址;
●所有局部变量的值、递归函数的传值、形式参数的值;
●所有引用参数以及常量引用参数的定义。 ;在分析空间复杂性中,
实例特征的概念非常重要!;指令空间的大小对于所解决的待定问题不够敏感。常量及简单变量所需要的数据空间也独立于所解决的问题,除非相关数的大小对于所选定的数据类型来说实在太大。这时,要么改变数据类型要么使用多精度算法重写该程序,然后再对新程序进行分析。;综合以上分析,
一个程序所需要的空间可分为两部分:
?固定部分:它独立于实例的特征。主要包括指令空间,简单变量以及定长复合变量所占用的空间,常量所占用的空间。
?可变部分:主要包括复合变量所需的空间(其大小依赖于所解决的具体问题),动态分配的空间(依赖于实例的特征),递归栈所需的空间(依赖于实例特征)。;令S(P)表示程序P需要的空间,则有
S(P) = c + SP(实例特征)
其中,
c 表示固定部分所需要的空间,是一个常数;
SP 表示可变部分所需要的空间。
在分析程序的空间复杂性时,一般着重于估算SP。 ;Space Complexity;4.实例分析;例2:; 在程序1-3-2中,假定采用被查数组的长度n作为实例特征,并取T为int类型。
▲数组中每个元素需要2个字节,
▲实参需要2个字节,
▲传值形式参数n需要2个字节,
▲局部变量i需要2个字节,
▲函数值返回整数常量-1需要2个字节,
▲所需要的总的数据空间为10个字节,其独立
于n,所以S顺序搜索(n)=0。;例3: 再比较2个求已知数组中元素和的程序。 ; 程序1-3-4: 递归求和a[0:n-1]
templateclass T
T Rsum ( T a[ ], int n)
{ //计算a[0:n-1]的和
if (n0)
return Rsum ( a, n-1 ) + a[n-1];
return 0;
} ; 对于a需要保留一个指针,对于n则需要保留一个int类型的值。
如果假定指针需占用2个字节,返回地址需占用2个字节,n需占用2个字节,那么每次调用Rsum函数共需6个字节。
该程序递归深度为n+1,最后一次函数值返回0需要2个字节,共需要6n+2字节的递归栈空间。SRs
文档评论(0)