1.3算法分析初步_第1页
1.3算法分析初步_第2页
1.3算法分析初步_第3页
1.3算法分析初步_第4页
1.3算法分析初步_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3. 算法分析初步 第一章1程序性能(program performance)是指运行一个程序所需的内存大小和时间多少。所以,程序的性能一般指程序的空间复杂性和时间复杂性。算法分析: -求解算法在一台抽象计算机上运行所 需要的时间和空间。2性能评估主要包含两方面:1.性能分析(performance analysis)2.性能测量(performance measurement)- 前者采用分析的方法,后者采用实验的方法。 31.考虑空间复杂性的理由 在多用户系统中运行时,需指明分配给该程 序的内存大小; 想预先知道计算机系统是否有足够的内存来 运行该程序; 一个问题可能有若干个不同的内存需求

2、解决 方案,可从中择取; 用空间复杂性来估计一个程序可能解决的问 题的最大规模。42.考虑时间复杂性的理由某些计算机用户需要提供程序运行时 间的上限(用户可接受的);所开发的程序需要提供一个满意的实 时反应。 53.选取方案的规则 如果对于解决一个问题有多种可选的方案,那么方案的选取要基于这些方案之间的性能差异。对于各种方案的时间及空间的复杂性,最好采取加权的方式进行评价。但是随着计算机技术的迅速发展,对空间的要求往往不如对时间的要求那样强烈。 因此我们的分析主要强调时间复杂性。 6(空间复杂性)3.1 Space Complexity 7空间复杂性:- 一个算法所需的存储量,表示为n的函数,

3、称为该算法的空间复杂性。程序所需要的空间:- 指令空间、数据空间、环境栈空间。 81.指令空间 -用来存储经过编译之后的程序指令。程序所需的指令空间的大小取决于如下因素:把程序编译成机器代码的编译器;编译时实际采用的编译器选项;目标计算机。 所使用的编译器不同,则产生的机器代码的长度就会有差异。 一般情况下,指令空间对于所解决的特定问题不够敏感。 92.数据空间-用来存储所有常量和变量的值。分成两部分: 存储常量和简单变量; 存储复合变量。前者所需的空间取决于所使用的计算机和编 译器,以及变量与常量的数目(由于我们往往 是计算所需内存的字节数,而每个字节所占的数位 依赖于具体的机器环境)。后者

4、包括数据结构所需的空间及动态分配的 空间。 103.环境栈空间-保存函数调用返回时恢复运行所需要的信息。 当一个函数被调用时,下面数据将被保存在环境栈中:返回地址;所有局部变量的值、递归函数的传值、形式参数的值;所有引用参数以及常量引用参数的定义。 11在分析空间复杂性中, 实例特征的概念非常重要!所谓实例特征是指决定问题规模的那些因素。例如, 输入和输出的数量或相关数的大小。如对n个元素进行排序,nn矩阵的加法等,都可以n作为实例特征。而两个mn矩阵的加法应该以n和m两个数作为实例特征。 12指令空间的大小对于所解决的待定问题不够敏感。常量及简单变量所需要的数据空间也独立于所解决的问题,除非

5、相关数的大小对于所选定的数据类型来说实在太大。这时,要么改变数据类型要么使用多精度算法重写该程序,然后再对新程序进行分析。复合变量及动态分配所需要的空间同样独立于问题的规模。而环境栈通常独立于实例的特征,除非正在使用递归函数。在使用递归函数时,实例特征通常会影响环境栈所需要的空间数量。递归函数所需要的栈空间主要依赖于局部变量及形式参数所需要的空间。除此外,该空间还依赖于递归的深度(即嵌套递归调用的最大层次)。13综合以上分析,一个程序所需要的空间可分为两部分:固定部分:它独立于实例的特征。主要包括指令空间,简单变量以及定长复合变量所占用的空间,常量所占用的空间。可变部分:主要包括复合变量所需的

6、空间(其大小依赖于所解决的具体问题),动态分配的空间(依赖于实例的特征),递归栈所需的空间(依赖于实例特征)。14令S(P)表示程序P需要的空间,则有 S(P) = c + SP(实例特征)其中, c 表示固定部分所需要的空间,是一个常数; SP 表示可变部分所需要的空间。在分析程序的空间复杂性时,一般着重于估算SP。 一个精确的分析还应当包括编译期间所产生的临时变量所需的空间,这种空间与编译器直接相关联,在递归程序中除了依赖于递归函数外,还依赖于实例特征。但是,在考虑空间复杂性时,一般都被忽略。 注:15Space Complexity研究算法的空间效率,只须分析除输入数据和算法本身之外的辅

7、助空间。若所需辅助空间相对于输入数据量来说是常数,则称此算法为原地工作,否则,它应是输入数据规模的某种函数。算法空间复杂度S(n)=O(g(n),表示随着问题规模n的增大,算法运行所需存储量的增长与g(n)的增长率相同。这里的S(n)= SP(实例特征)。164.实例分析例1:程序1-3-1: 利用引用参数 template T Abc (T & a, T & b, T & c) return a+b+c+b*c+(a+b+c)/(a+b)+4; 在程序1-3-1中,采用T作为实例特征。由于a,b,c都是引用参数,在函数中不需要为它们的值分配空间,但需保存指向这些参数的指针。 若每个指针需要2

8、个字节,则共需要6字节的指针空间。加上返回值需要2个字节(假设),此时函数所需要的总空间是一个常量8,而SAbc(实例特征)0。 17例2:程序1-3-2: 顺序搜索template int SequentialSearch(T a , const T & x, int n) /在a0:n-1中搜索x,若找到则 /返回所在的位置,否则返回-1 int i; for (i=0; in & ai!=x; i+); if (i=n) return -1; return i; 18 在程序1-3-2中,假定采用被查数组的长度n作为实例特征,并取T为int类型。 数组中每个元素需要2个字节, 实参需要2

9、个字节, 传值形式参数n需要2个字节, 局部变量i需要2个字节, 函数值返回整数常量-1需要2个字节, 所需要的总的数据空间为10个字节,其独立 于n,所以S顺序搜索(n)0。- 这里,我们并未把数组a所需要的空间计算进来,因为该数组所需要的空间已在定义实际参数(对应于a)的函数中分配,不能再加到函数SequentialSearch所需要的空间上去。 19例3: 再比较2个求已知数组中元素和的程序。 程序1-3-3: 累加a0:n-1 template T Sum ( T a , int n ) /计算a0:n-1的和 T tsum=0; for ( int i=0; in; i+ ) tsu

10、m+=ai; return tsum; 在程序1-3-3中采用累加的办法,我们取被累加的元素个数n作为实例特征。 在该函数中,a,n,i和tsum需要分配空间,与上例同样的理由,程序所需的空间与n无关,因此,SSum(n)0。 20 程序1-3-4: 递归求和a0:n-1 template T Rsum ( T a , int n) /计算a0:n-1的和 if (n0) return Rsum ( a, n-1 ) + an-1; return 0; 在程序1-3-4中采用递归的办法,递归栈空间包括参数a,n以及返回地址的空间。 21 对于a需要保留一个指针,对于n则需要保留一个int类型的

11、值。 如果假定指针需占用2个字节,返回地址需占用2个字节,n需占用2个字节,那么每次调用Rsum函数共需6个字节。 该程序递归深度为n+1,最后一次函数值返回0需要2个字节,共需要6n+2字节的递归栈空间。SRsum(n)6n+2=O(n)。 可见, 递归计算比累加计算需要更多的空间。 22(时间复杂性)3.2 Time Complexity 231.时间复杂性的构成 一个程序所占时间: T(P)= 编译时间 + 运行时间编译时间与实例特征无关,而且,一般情况下, 一个编译过的程序可以运行若干次,所以,人 们主要关注的是运行时间,记做tP(实例特征); 24如果了解所用编译器的特征,就可以确定

12、代码P进行加、 减、乘、除、比较、读、写等所需的时间,从而得到计算 tP的公式。 令n代表实例特征(这里主要是问题的规模),则有如下表示式: 其中,ca,cs,cm,cd,cc分别表示一次加、减、乘、除及比较操作所需的时间,函数ADD,SUB,MUL,DIV,CMP分别表示代码P中所使用的加、减、乘、除及比较操作的次数。tP(n) = caADD(n) + csSUB(n) + cmMUL(n) + cdDIV(n) + ccCMP(n) + 25一个算术操作所需的时间取决于操作数的类型(int、float、 double等等),所以有必要对操作按照数据类型进行分类。在构思一个程序时,影响tP

13、的许多因素还是未知的,所以, 在多数情况下仅仅是对tP进行估计。 估算运行时间的方法: . 找一个或多个关键操作,确定这些关键操作所需要的执 行时间(对于前面所列举的四种算术运算及比较操作,一般被看 作是基本操作,并约定所用的时间都是一个单位); . 确定程序总的执行步数。 262.关于操作数 首先选择一种或多种操作(如,加、乘、比较等), 然后计算这些操作分别执行了多少次。-频度计算时间复杂性的要点是: 确定关键操作, 关键操作对时间复杂性影响最大。 27例:for (j=1; j=n; j=j+1) for (k=1; k=n; k=k+1) x=x+1;分析:语句 “j=1”的频度为1;

14、语句 “j=n; j=j+1; k=1”的频度为n;语句“k=n; k=k+1; x=x+1;”的频度为n2;算法运行时间:3*n2+3*n+1T(n)= O(3*n2+3*n+1)= O(n2)28例1:程序1-3-5: 寻找最大元素 template Int Max ( T a , int n) /寻找a0:n-1中的最大元素 int pos=0; for ( int i=1; in; i+) if ( apos ai ) pos=i; return pos; 这里的关键操作是比较。for循环中共进行了n-1次比较,T(n)=O(n)。29Max还执行了其它比较,如for循环每次比较之前都

15、要比较一下i和n。此外,Max还进行了其他的操作,如初始化pos、循环控制变量i的增量。-这些一般都不包含在估算中,若纳入计数,则操作计数将增加一个常量即可。 30例2:程序1-3-6: n次多项式求值 Value=C0 + C1X1 + C2X2 + + CnXn template T PolyEval ( T coeff , int n, const T & x) /计算n次多项式的值,coeff0:n为多项式的系数 T y=1, value=coeff 0; for ( int i=1; i=n; i+) /n循环 /累加下一项 y*=x; /一次乘法 value += y*coeffi

16、; /一次加法和一次乘法 return value; /3n次基本运算31程序1-3-7: 利用Horner法则求多项式的值Horner法则: P(x)=(cn*x+cn-1)*x+cn-2)*x+cn-3)*x+)*x+c0template T Horner ( T coeff , int n, const T & x ) /计算n次多项式的值,coeff0:n为多项式的系数 T value = coeff n; for ( i=n-1; i=0; i - - ) /n循环 T value = value*x + coeff i; /一次加法和一次乘法 return value; /2n次基

17、本运算32这里, 关键操作是加法与乘法运算。 在程序1-3-6中,for循环的每一回都执行两次乘法运算和一次加法运算。所以程序的总的运算次数为3n。 在程序1-3-7中,for循环的每一回都执行乘法与加法运算各一次,程序总的运算次数为2n。 33例3:程序1-3-8: 计算名次 template void Rank ( T a , int n, int r ) /计算a0:n-1中元素的排名 for ( int i=1; in; i+ ) ri=0; /初始化排名都为0 /逐对比较所有的元素 for ( int i=1; in; i+ ) for ( int j=0; ji; j+ ) if ( aj = ai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论