1、教学目的和内容: 了解分析和评价算法的一些基本准则 掌握算法时间复杂性分析方法,第2章 算法及其性能分析,2.1 算法及其性能评价准则,2.2 算法时间复杂性分析方法,2.1 算法及其性能评价准则,算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令(规则)的有限序列,其中每一条指令表示一个或多个操作。,算法的特征:有穷性、确定性、 能行性、输入、 输出,算法描述:自然语言;程序设计语言;类语言*;,一、算法、算法的特征和算法描述,常用的算法设计方法:递归法(Recursion)、分治法(Divide-and Conquer)、 贪心法(Greedy)、动态规划(Dynamic
2、 Programming)、搜索与遍历、回溯(Backtracking)、解空间局部搜索近似算法(Approximation)、在线算法(On-Line)等,1.正确性(Correctness) 正确性的含义:是指对于一切合法的输入数据经有限时间或有限步后均可得到正确(满足规格说明要求)的结果; 算法包括两方面的内容: 解决问题的方法; 实现这一方法的一系列指令(语句、步骤) 算法的正确性证明:需要一组相关的引理和定理,确认一个算法所使用的方法和公式的正确性; 在证明一系列的语句确实做了符合规定的动作。 算法的正确性的严格的形式化证明还未取得突破,还是一项令人生畏的工作。只有那些比较简单的算法
3、,其正确性才能被形式化证明。,2.1 算法及其性能评价准则,二、“好”的算法的标准,2.时间复杂性(Time Complexity)如何计算和比较算法的执行时间: 实验测量法(实际执行时间、执行指令的条数)优点:精确缺点: 必须先运行根据算法编制的的程序;所得的时间统计量依赖于计算机的硬件、软件等环境因素,容易掩盖算法本身的优劣。,2.1 算法及其性能评价准则,二、“好”的算法的标准,2.1 算法及其性能评价准则,二、“好”的算法的标准,事前分析(估计)法 高级语言编写的程序在计算机上运行时间取决于下列因素:依据的算法本身选择何种策略问题的规模(输入的规模,输入的大小)。如求素数问题程序设计语
4、言:算法的实现语言级别越高,执行效率越低编译程序产生的机器代码的质量及其执行指令的速度 表明用绝对的时间单位衡量一个算法的效率是不适合的 算法的时间复杂性 认为一个特定的算法执行时间(“运行工作量”的大小),只依赖于问题的规模,即算法执行时间是问题规模的函数-T(n),2.1 算法及其性能评价准则,二、“好”的算法的标准,由于算法的执行时间是组成算法的控制结构(顺序、分支和循环)和基本操作的综合效果,因此从算法中选择对于研究问题来说是基本的操作(基本运算),把算法的基本操作的重复执行的次数作为算法的时间度量 通常,我们并不关心T(n)的具体值,而是关心它的增长率,即T(n)随问题规模 n(是一
5、个整数)的增大的变化趋势(界限) 算法的复杂性定义算法中基本操作重复执行的次数是问题规模n的某个函数 f(n),算法的时间度量记作T(n)= O( f(n)。它表示随问题规模n的增大,算法执行时间的增长率不会超过f(n),称为算法的渐近时间复杂性,简称时间复杂性。,2.1 算法及其性能评价准则,二、“好”的算法的标准,3.空间复杂性(Space Complexity) 算法的空间复杂性是指算法在执行过程中的存储量需求 一个算法的存储量需求除了存放算法本身所有的指令、常数、变量和输入数据外,还包括对数据进行操作的工作单元和存储实现计算所需信息的辅助空间 算法的存储量需求与输入的规模、表示方式、算
6、法采用的数据结构、算法的设计以及输入数据的性质有关 算法的执行的不同时刻,其空间需求可能是不同的 算法的空间复杂性是指算法在执行过程中的最大存储量需求 空间复杂性的渐近表示-空间复杂度T(n)= O( f(n) 其中,n为问题的输入规模,2.1 算法及其性能评价准则,二、“好”的算法的标准,4.可读性(Readability) 可读性好的算法有助于设计者和和他人阅读、理解、修改和重用 晦涩难懂的算法容易隐藏错误,而且还增加了阅读算法的难度 可读性好的算法,常常也具有简单性5.健壮性(Robustness) 当输入数据非法时,能作出适当的反应(如对输入数据进行语法检查,提出修改输入建议并提供重新
7、输入的机会),避免异常出错 6.一个好的算法还应该具有灵活性(Flexibility)、可重用性(Reuseabale)和自适应性(Adaptability)等,2.2 算法时间复杂性分析方法,一、算法的时间复杂性,定义2.1 设一个领域问题的输入的规模为n,D n是该领域问题的所有输入集合,对于任意一个输入I D n,P(I)是I 出现的概率, I D n P(I)=1,T(I)是(解决该领域问题的)算法在输入I 下所执行的基本运算的次数。称E(n)= I D n P(I)* T(I) 为该算法的期望复杂性(平均时间复杂性)称W(n)=max I D n T(I) 为该算法的最坏时间复杂性举
8、例,2.2 算法时间复杂性分析方法,一、算法的时间复杂性,例2.1 A是一个有n个不同元素的实数数组,给出求其最大和最小元素的算法和时间复杂性 void SM(double A, int n, double max, double min ) max=min=A0;for ( k=1; kmax ) max=Ak;if ( Akmin ) min=Ak; /* 输入规模是:n-数组元素个数;基本操作是:元素比较*/ 容易看出,算法SM对大小为n 的数组需要2(n-1)比较,若算法SM的基本运算是元素比较,则复杂性为2(n-1),2.2 算法时间复杂性分析方法,一、算法的时间复杂性,例2.2 A
9、是一个有n个不同元素的实数数组,给出确定给定实数K是否在A中的算法及其时间复杂性 int SK(double A, int n, double K ) int j=1;while ( j=n)if ( Aj=K ) break;else j+;return j ;/若j n,则K在A中,否则(j=n+1) K不在A中 ,2.2 算法时间复杂性分析方法,一、算法的时间复杂性,算法SK的基本运算是元素与K 的比较;输入规模是数组大小 假定q 表示K 在A 中的概率,又假设K 等于A 的每个元素有相同的概率。令D n= I1, I2, In , In+1 ,其中I j ( 1 j n ) 表示K=A
10、 j 的任意输入,In +1表示K 不是A 中元素的任意一各输入 由上述说明有:当 0 j n 时,P(Ij)=q / n,T (Ij)=j, P(In+1)=1-q ,T (In+1)=n 算法SK的期望复杂性和最坏复杂性为E(n)= j D n P(Ij)* T(Ij)= j=1,n (q /n)*j + (1-q)*n=1/2( n+1)q + (1-q)n=1/2(n+1) (K在A中,q=1)W(n)=max T(Ij)| 1 j n = n,2.2 算法时间复杂性分析方法,二、函数阶的比较,定义2.2 设f(n)、T(n)是整数集到实数集上的函数,称函数f(n )是T(n)增长率的
11、上界,当且仅当存在一个正常数C和整数n0 ,使得对任意的n n0 时,有T ( n ) C f( n ) 记作:T(n)= O( f(n) 此时也称 T(n)的阶至多为 f(n) *一个算法的时间复杂性为O( f(n),表明它的基本操作次数至多是f(n)的某个常数倍例2.1 设函数T(n)=3n5+4n2+1,证明:T(n)=(n5)证明: f(n)= n5. 取n0=1, C=8, 则当n n0 时有T(n)= 3n5+4n2+18n5 = C f(n) 证毕,2.2 算法时间复杂性分析方法,二、函数阶的比较,定义2.3 设f(n)、T(n)是整数集到实数集上的函数,称函数f(n )是T(n
12、)增长率的下界,当且仅当存在一个正常数C和整数n0 ,使得对任意的n n0 时,有T ( n ) C f( n ) 记作:T(n)= ( f(n) 此时也称 T(n)的阶至少为 f(n) *一个算法的时间复杂性为 ( f(n),表明它的基本操作次数至少是f(n)的某个常数倍例2.3 设函数T(n)=3n5+4n2+1,证明:T(n)= (n5)证明: f(n)= n5. 取n0=0, C=1, 则当n n0 时有T(n)= 3n5+4n2+1 1n5 = C f(n) 证毕,定理2.1 若A(n)=amnm+a1n+a0是关于n的m次多项式,则A(n)=(nm)*此定理说明,时间复杂性仅取决于
13、多项式的最高次幂,而与最高次幂的系数和其他低次项无关 (1)表示实践复杂性为常数 (1)+ (1)= (1) 常见的时间复杂性及其比较(1) (n) (n) (n) (nn) (n2) (n3) (2n),2.2 算法时间复杂性分析方法,2.2 算法时间复杂性分析方法,2.2 算法时间复杂性分析方法,三、时间复杂性的运算法则,设T1(n)=O( f(n) ),T2(n)=O( g(n) ),则 加法规则:T1(n)+T2(n) = O( max f(n), g(n) ) 乘法规则:T1(n)+T2(n) = O( f(n) g(n) ),例2.4:s = 0 ; f(n) = 1; T2(n)
14、 = O(f(n) = O(1) 常量阶for ( i=1 ; i = n ; +i ) +x; s += x; f(n) = 3n+1; T1(n) = O(f(n) = O(n) 线性阶for ( i=1; i=n ; +i )for( j=1 ; j =n ; +j ) +x ; s += x; f(n) = 3n2+2n+1; T3(n) = O(f(n) = O(n2) 平方阶for ( i=1; i=n ; +i )for ( j=1 ; j =n ; +j ) cij = 0;for ( k=1 ; k = n; +k ) cij += aik * bkj ; f(n) = 2n3+3n2+2n+1; T4(n) = O(f(n) = O(n3) 立方阶,2.2 算法时间复杂性分析方法,例2.5: Long fact ( int n) if ( n=0 | n =1 ) return( 1 );elsereturn( n * fact( n 1 ) );,取 f( n ) = n T( n ) = O( f( n ) )= O( n ),2.2 算法时间复杂性分析方法,2.2 算法时间复杂性分析方法,作业:,1.p28 例2.1.52. A是一个有n个不同元素的实数数组,给出求其最大和最小元素的递归算法和时间复杂性,