第2章_算法分析基础_第1页
第2章_算法分析基础_第2页
第2章_算法分析基础_第3页
第2章_算法分析基础_第4页
第2章_算法分析基础_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、海南大学信息科学技术学院College of Information Science and Technology, Hainan University2022-6-27Algorithm Introduction2n算法分析(算法分析(Algorithm Analysis)n算法复杂性算法复杂性(Algorithm Complexity )算法复杂性的高低体现在运行该算法所需计算机资源的多少算法复杂性的高低体现在运行该算法所需计算机资源的多少.计算机中最重要的两种资源是计算机中最重要的两种资源是时间时间和和空间资源。更确切地说,空间资源。更确切地说,算法的复杂性是算法运行所需要的计算机资源的

2、算法的复杂性是算法运行所需要的计算机资源的量量,需要的,需要的时间资源的量称为时间复杂性;需要的空间资源的量称为空时间资源的量称为时间复杂性;需要的空间资源的量称为空间复杂性,如下:间复杂性,如下:n 时间复杂性(时间复杂性(Time Complexity)n 空间复杂性(空间复杂性(Space Complexity)2.1 算法的时间复杂性分析算法的时间复杂性分析2022-6-27Algorithm Introduction3n算法时间复杂性分析算法时间复杂性分析这是一种这是一种事前事前分析估算的方法,对算法所消耗资源的一种渐分析估算的方法,对算法所消耗资源的一种渐进分析方法。进分析方法。渐

3、进分析:忽略具体机器、编程语言和编译器的影响,只关渐进分析:忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的注在输入规模增大时算法运行时间的增长趋势增长趋势。这大大降低。这大大降低了算法分析的难度,从了算法分析的难度,从数量级数量级的角度评价算法的效率。的角度评价算法的效率。 C=F(N,I,A) TT(N)N为问题规模,为问题规模,I为算法输入,为算法输入,A为算法本身为算法本身2.1 算法的时间复杂性分析算法的时间复杂性分析2022-6-27Algorithm Introduction4n输入规模与基础语句输入规模与基础语句精确地表示算法的运行时间函数精确地表示算

4、法的运行时间函数T(N)常常是很困难的,)常常是很困难的,考虑到算法分析的主要目的在于比较求解同一个问题的不同考虑到算法分析的主要目的在于比较求解同一个问题的不同算法效率,为精简客观地反映一个算法的运行时间,用算法算法效率,为精简客观地反映一个算法的运行时间,用算法中中基本语句的执行次数基本语句的执行次数来度量算法的工作量。来度量算法的工作量。基本语句:执行次数与整个算法的执行次数基本语句:执行次数与整个算法的执行次数正比正比的语句,对的语句,对 算法运行时间算法运行时间贡献最大贡献最大,是算法中,是算法中最重要最重要的操作。的操作。2.1 算法的时间复杂性分析算法的时间复杂性分析例2.1 对

5、如下顺序查找算法,请找出输入规模和基本语句 int SeqSearch(int A, int n, int k)for(int i=0; in; i+)if(Ai=k) break;if(i=n) return 0;else return (i+1);2022-6-27Algorithm Introduction52.1 算法的时间复杂性分析算法的时间复杂性分析例2.2 对如下起泡排序算法,请找出输入规模和基本语句 void SubbleSort(int r, int n)int bound,exchange=n-1;while(exchange!=0)/当上一趟排序有记录交换时当上一趟排序有

6、记录交换时bound=exchange;exchange=0;for(int j=0; jrj+1) int temp=rj; rj=rj+1; rj+1=temp; exchange=j/记载每一次记录交换的位置记载每一次记录交换的位置2022-6-27Algorithm Introduction62.1 算法的时间复杂性分析算法的时间复杂性分析例2.3 下列算法实现将两个升序序列合并成一个升序序列,请找出输入规模和基本语句 void Union(int A, int n, int B, int m, int C)int i=0,j=0,k=0;while(in & jm)if(Ai

7、=Bj) Ck+=Ai+; /Ai和和Bj较小者存入较小者存入Ckelse Ck+=Bj+;while( in) Ck+=Ai+;while( jm) Ck+=Bj+;2022-6-27Algorithm Introduction72.1 算法的时间复杂性分析算法的时间复杂性分析 定义定义2.1 若存在两个正常数若存在两个正常数c和和n 0 ,对于任意,对于任意nn 0,都有,都有T(n)cf(n),就称函数,就称函数T(n)O(f(n) 。 2022-6-27Algorithm Introduction82.1.2 算法的渐进分析算法的渐进分析算法的渐进分析并不是度量算法的时间量,而是度量算

8、法运行算法的渐进分析并不是度量算法的时间量,而是度量算法运行时间的时间的增长趋势增长趋势。只考察当输入规模充分大时,算法中基本语。只考察当输入规模充分大时,算法中基本语句的执行次数的渐近意义下的阶,常用大(读欧)句的执行次数的渐近意义下的阶,常用大(读欧)O表示。表示。上界(增长率的上限),用上界(增长率的上限),用O表示表示大大O符号描述增长率的上限,表示符号描述增长率的上限,表示T(n)的增长最多像的增长最多像f(n)增增长的那样快。长的那样快。cf(n)T(n)nono之前的情况不重要执行次数问题规模例例2.4. 分析例分析例2.3中合并算法的时间复杂性中合并算法的时间复杂性解:解:1、

9、假设退出第、假设退出第1个循环后个循环后in, j=m,说明序列,说明序列A处理完毕,处理完毕,第第2个循环将不执行,第个循环将不执行,第3个循环执行。算法的时间复杂性为:个循环执行。算法的时间复杂性为:O(n+m+m-m)=O(n+m)2、 假设退出第假设退出第1个循环后个循环后in, j=m,说明序列,说明序列B处理完毕,处理完毕,第第2个循环将执行,第个循环将执行,第3个循环不执行。算法的时间复杂性为:个循环不执行。算法的时间复杂性为:O(n+m+n-n)=O(n+m)综上,算法的时间复杂性为综上,算法的时间复杂性为O(n+m)2022-6-27Algorithm Introductio

10、n92.1.2 算法的渐进分析算法的渐进分析有些算法的时间代价只依赖于问题的输入规模,而与输入的具体数据无关。如上例合并算法。但有些算法,即使输入规模相同,如果输入数据不同,其时间代价也不相同。2022-6-27Algorithm Introduction102.1.3 2.1.3 最好、最坏和平均情况最好、最坏和平均情况 2022-6-27Algorithm Introduction11例例2.52.5: 在一维整型数组在一维整型数组A n 中中顺序查找顺序查找与给定值与给定值k相等的元素(假设该数组中有且仅有一个元素值为相等的元素(假设该数组中有且仅有一个元素值为k) int Find (

11、int A , int n) for (i=0; irj+1最好情况:记录已经是升序排列,算法只执行一次,比较n-1次,时间复杂性为O(n)最坏情况:记录是降序排列,每趟只是无序序列中最大的记录交换到最终位置,所以算法执行n-1趟,第i趟比较n-i次比较,则记录的比较次数为 ,时间复杂性O(n2)平均情况:O(n2),过程略11(1)()2nin nni2.1.5 递归算法的时间复杂性分析递归算法的时间复杂性分析 1. 猜测技术猜测技术:对对递推关系式递推关系式估计估计一个一个上限上限,然后(用数学归纳法)证明它正确。如然后(用数学归纳法)证明它正确。如果成功,试着果成功,试着收缩上限收缩上限

12、。如果失败,放。如果失败,放松限制再试着证明。直到上限符合要求。松限制再试着证明。直到上限符合要求。v 递归算法是分而治之的方法。递归算法是分而治之的方法。v 递归算法时间复杂性分析的关键:根据递递归算法时间复杂性分析的关键:根据递归过程建立递推关系式,然后求解这个递归过程建立递推关系式,然后求解这个递推关系式。推关系式。2. 猜测技术猜测技术 + + 2)2(221)(nnnTnnT补例补例1 使用猜测技术分析二路使用猜测技术分析二路归并排序算法的时间复杂性。归并排序算法的时间复杂性。二路归并排序运行时间递推式:二路归并排序运行时间递推式:假定假定T(n)n2,需证明这个猜测是正确的。为方便

13、假定,需证明这个猜测是正确的。为方便假定n=2kT(2)=122成立,对所有成立,对所有in,假设,假设T(i)i2,则:,则:T(2n)2T(n)+2n2n2+2n 4n2=(2n)2故得,故得,T(n)=O(n2)成立成立2. 猜测技术猜测技术 O(n2)是最小上限?如果猜测更小一些,如是最小上限?如果猜测更小一些,如T(n)cn,证明失败。,证明失败。即说明上限即说明上限 应在应在n和和n2之间。之间。再试试再试试T(n)nlognT(2)=1 2log2成立,对所有成立,对所有in,假设,假设T(i) ilogi ,则:,则:T(2n)2T(n)+2n2nlogn +2n=2n(log

14、n+1) =2nlog(2n)故得,故得,T(n)=O(nlogn)成立成立2. 扩展递归技术扩展递归技术 + + 15)2(217)(2nnnTnnT)(10310)212(57257)(22212102nOnnnnnnnnTkkii + + + + 222112222225)2(52)2(52) 1 (25)2(5)4(5)8(2(2(25)2(5)4(2(25)2(2)(nnnTnnnnTnnnTnnTnTkkk+ + + + + + + + + + + + + + LL例2.7 使用扩展递归技术分析下面递推式的时间复杂性为方便假定n=2k。将递推式进行扩展3. 通用分治递推式通用分治递

15、推式大小为大小为n的原问题分成若干个大小为的原问题分成若干个大小为n/b的子问题,的子问题,其中其中a个子问题需要求解,而个子问题需要求解,而cnk是合并各个子问题是合并各个子问题的解需要的工作量。的解需要的工作量。 + + 1)(1)(ncnbnaTncnTk kkkbkkabanObannObanOnTb)()log()()(log定理定理2.1 设设T(n)是一个非递减函数,且满足通用分治递推式,是一个非递减函数,且满足通用分治递推式,则有如下结果成立。则有如下结果成立。 3. 通用分治递推式通用分治递推式证明:用扩展递归技术对通用分治递推式进行推导,假定a=bm211000( )( )

16、()( ) )(1)().( )()()ikkkmmkkkmkmmmm ikm i ikmm iiiinnnT naTcna aTccnbbbnna Tacaccnbbnbcaca bcaab+ +求和是个几何级数,比率r=bk/a,且,有以下三种情况:loglogbbnamaan3. 通用分治递推式通用分治递推式loglog0logk0101(1)1:,a,( )()1(2)1:1 log n 1,an ,( )(log n)1(3)1:(r )T(n) O(a)()( )1bbbmaaimimaimkbbimmimmmkmkirrnT nOnrrrmnT nOnrrrOrObOnr+由于所

17、以由于所以,所以,2.2 算法的空间复杂性分析算法的空间复杂性分析算法在运行过程中所需的存储空间包括:算法在运行过程中所需的存储空间包括:(1)输入输出数据占用的空间。取决于问题,与算法无关)输入输出数据占用的空间。取决于问题,与算法无关(2)算法本身占用的空间。大小固定)算法本身占用的空间。大小固定(3)执行算法需要的辅助空间。正是空间复杂性所指)执行算法需要的辅助空间。正是空间复杂性所指S(n)=O(f(n)算法输入输出数据辅助空间2.2 算法的空间复杂性分析算法的空间复杂性分析例例2.8 分析例分析例2.2中起泡排序算法的空间复杂性。中起泡排序算法的空间复杂性。解:输入输出都在解:输入输

18、出都在rn中,声明了中,声明了3个简单变量:个简单变量:exchange、bound和和temp。所以空间复杂性为。所以空间复杂性为O(1)如果算法所需的辅助空间相对于问题的输入规模来说是一个常如果算法所需的辅助空间相对于问题的输入规模来说是一个常数,我们称此算法为原地(或就地)工作。起泡排序算法属于数,我们称此算法为原地(或就地)工作。起泡排序算法属于就地性质。就地性质。例例2.9 分析例分析例2.3中合并算法的空间复杂性。中合并算法的空间复杂性。解:合并不能就地进行,需要将合并结果存入另外一个数组中。解:合并不能就地进行,需要将合并结果存入另外一个数组中。设序列设序列A的长度为的长度为n,

19、序列,序列B的长度为的长度为m,则合并后的有序序列,则合并后的有序序列的长度为的长度为n+m,因此算法的空间复杂性为,因此算法的空间复杂性为O(n+m)2.3 最优算法最优算法同一个问题可能会存在多种算法,是否有求同一个问题可能会存在多种算法,是否有求解该问题的最优算法?解该问题的最优算法?如果能够知道一个问题的计算复杂性如果能够知道一个问题的计算复杂性下界下界,也就是求解该问题的任何算法(包括尚未发现的也就是求解该问题的任何算法(包括尚未发现的算法)所需的时间下界,就可以较准确地评价各算法)所需的时间下界,就可以较准确地评价各种算法的效率,确定算法还有多少改进余地。种算法的效率,确定算法还有

20、多少改进余地。2.3.1 问题的计算复杂性下界问题的计算复杂性下界下界下界是指求解问题所需的是指求解问题所需的最少最少工作量。通常工作量。通常采用大采用大(读欧米伽)表示。例如,已经证明基于(读欧米伽)表示。例如,已经证明基于比较的排序算法的时间下界是比较的排序算法的时间下界是(nlog2n),意味着,意味着不存在时间复杂性小于不存在时间复杂性小于O(nlog2n)的基于比较的排的基于比较的排序算法。序算法。 定义定义2.2 若存在两个正常数若存在两个正常数c和和n 0 ,对于任意,对于任意nn 0,都有,都有T(n)cg(n),就称,就称T(n) (g(n) 。 2022-6-27Algor

21、ithm Introduction27大大符号描述增长率的下限,表示符号描述增长率的下限,表示T(n)的增长至少像的增长至少像g(n)增增长的那样快。长的那样快。如果能找到一个尽可能大的函数如果能找到一个尽可能大的函数g(n)使得求解该问题的所有使得求解该问题的所有算法都可以在算法都可以在(g(n)时间内完成,则称时间内完成,则称g(n)为该问题的计算为该问题的计算复杂性下界。复杂性下界。cg(n)T(n)nono之前的情况不重要执行次数问题规模2.3.1 问题的计算复杂性下界问题的计算复杂性下界 定义定义2.3 若存在三个正常数若存在三个正常数c1、c2和和n 0 ,对于任意,对于任意nn

22、0,都有都有c1 f(n) T(n) c2 f(n),就称,就称T(n) (f(n) 。 2022-6-27Algorithm Introduction28符号意味着符号意味着T(n)与与f(n)同阶,用来表示算法的精确阶。同阶,用来表示算法的精确阶。问题的计算复杂性上下界(准确界)问题的计算复杂性上下界(准确界)n0问题规模问题规模n执执行行次次数数n0之前之前的情况的情况无关紧无关紧要要T( (n) )c2f( (n) )c1f( (n) )2.3.1 问题的计算复杂性下界问题的计算复杂性下界例:例:T(n)=3n-1,上界?下界?上下界?,上界?下界?上下界?解:解:当当n1时,时,3n

23、-13n=(n)当当n1时,时,3n-1 3n-n=2n=(n)当当n1时,时, 3n 3n-1 2n,则,则3n-1=(n)2.3.1 问题的计算复杂性下界问题的计算复杂性下界大大常与大常与大O配合以证明某问题的一个特定算配合以证明某问题的一个特定算法是该问题的最优算法,或是该问题中的某算法法是该问题的最优算法,或是该问题中的某算法类中的最优算法。一般情况下,如果能证明某问类中的最优算法。一般情况下,如果能证明某问题的时间下界是题的时间下界是(g(n),那么,对以时间,那么,对以时间O(g(n)来求解该问题的任何算法(其实就是确定算法的来求解该问题的任何算法(其实就是确定算法的精确阶是精确阶

24、是 (g(n)),都认为是求解该问题的最),都认为是求解该问题的最优算法。优算法。2.3.1 问题的计算复杂性下界问题的计算复杂性下界例例2.10 如下算法实现在一个数组中求最小值元素,如下算法实现在一个数组中求最小值元素,证明该算法是最优算法。证明该算法是最优算法。int ArrayMin(int a, int n)int min=a0;for(int i=1;in;i+) if(aimin) min=ai;return min;2.3.1 问题的计算复杂性下界问题的计算复杂性下界证明:算法需要进行n-1次比较,时间复杂性是O(n)。下面要证明问题的下界是(n),即对于任何n个整数,求最小值

25、元素至少需要进行n-1次比较。将n个整数分为三个动态的集合:A(待比较数集合),B(非最小数集合),C(最小数集合)。任何一个通过比较求最小值元素的算法都要从(n,0,0)状态开始,最终到达(0,n-1,1)。这个过程实际上是将元素从A向B和C移动,但每次比较,至多能把一个较大元素从集合A移向集合B,因此,任何求最小值算法至少要进行n-1次比较,其时间下界是(n)。所以算法是最优算法。初始状态(n,0,0)完成状态(0,n-1,1)算法运行确定和证明某个问题的计算复杂性下界是很困难的,因为不可能枚举该问题的所有算法。事实中,存在大量问题,它们的下界是不清楚的。2.3.2 平凡下界平凡下界平凡下

26、界:使用平凡下界:使用计数计数方法得出的算法复杂性下界。即方法得出的算法复杂性下界。即对问题的输入中必须要处理的元素进行计数,同时对必须对问题的输入中必须要处理的元素进行计数,同时对必须要输出的元素进行计数,得到一个平凡下界。要输出的元素进行计数,得到一个平凡下界。例如,任何生成例如,任何生成n个不同元素的所有排列对象的算法个不同元素的所有排列对象的算法必定属于必定属于(n!),因为输出的规模就是,因为输出的规模就是n!平凡下界很容易得出,但往往过小而失去意义。例如,平凡下界很容易得出,但往往过小而失去意义。例如,TSP问题的平凡下界是问题的平凡下界是(n2)(输入是(输入是n(n-1)/2个

27、城市间的个城市间的距离),但没有意义,至今没有找到一个多项式时间算法。距离),但没有意义,至今没有找到一个多项式时间算法。2.3.3 判定树模型判定树模型许多算法的工作方式都是对输入元素进行许多算法的工作方式都是对输入元素进行比较比较,例如排序,例如排序和查找算法,故可以用和查找算法,故可以用判定树判定树来研究这些算法的时间性能。来研究这些算法的时间性能。判定树:满足如下条件的二叉树:判定树:满足如下条件的二叉树:(1)每个内部结点对应形如)每个内部结点对应形如xy的比较,根据关系成立与的比较,根据关系成立与否,控制转移到左右子树;否,控制转移到左右子树;(2)每个叶子结点表示问题的一个结果。

28、从根到叶子结点)每个叶子结点表示问题的一个结果。从根到叶子结点所走过的路径代表算法执行的过程,路径的长度即代表算所走过的路径代表算法执行的过程,路径的长度即代表算法执行的时间法执行的时间2.3.3 判定树模型判定树模型例例2.11 用判定树模型求解排序问题的时间下界。用判定树模型求解排序问题的时间下界。解:根据排序算法中的比较,建立起判定树来描述算法,解:根据排序算法中的比较,建立起判定树来描述算法,则则判定树的高度就是算法的下界判定树的高度就是算法的下界。补充材料:补充材料:算法的实验分析算法的实验分析 渐进分析能够在数量级上对算法进行精确度量,但数渐进分析能够在数量级上对算法进行精确度量,

29、但数学不是万能的,许多貌似简单的算法很难用数学的精学不是万能的,许多貌似简单的算法很难用数学的精确性和严格性来分析,尤其在做确性和严格性来分析,尤其在做平均效率平均效率分析时。分析时。 算法的算法的实验分析实验分析是一种事后计算的方法,通常需要将是一种事后计算的方法,通常需要将算法转换为对应的程序并上机运行。例如可在程序中算法转换为对应的程序并上机运行。例如可在程序中设置计数器变量来记录基本语句的执行次数设置计数器变量来记录基本语句的执行次数。void SubbleSort(int r, int n)int count1,count2=0;int bound,exchange=n-1;whil

30、e(exchange!=0)/当上一趟排序有记录交换时当上一趟排序有记录交换时bound=exchange;exchange=0;for(int j=0; jrj+1) int temp=rj; rj=rj+1; rj+1=temp; count2+=3; exchange=j;/记载每一次记录交换的位置记载每一次记录交换的位置cout“比较次数是比较次数是”count1endl;cout“移动次数是移动次数是”count2endl;2022-6-27Algorithm Introduction37补充材料补充材料 算法的实验分析算法的实验分析 一般步骤:一般步骤:1. 明确实验目的明确实验目的 (验

温馨提示

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

最新文档

评论

0/150

提交评论