计算机算法设计与分析总复习.ppt
《计算机算法设计与分析总复习.ppt》由会员分享,可在线阅读,更多相关《计算机算法设计与分析总复习.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机算法设计与分析1.1 算法的定义和特征算法的定义和特征1)什么是算法?什么是算法?算法是求解某一特定问题特定问题的一组的一组有有穷规则穷规则的集合,它是由若干条指令组成是由若干条指令组成的有穷符号串的有穷符号串。2 2)算法的五个重要特性算法的五个重要特性确定性确定性、可实现性可实现性、输入输入、输出输出、有穷性有穷性3 3)算法设计的质量指标算法设计的质量指标正确性,可读性,健壮性,效率与存储量正确性,可读性,健壮性,效率与存储量算法和程序的区别算法和程序的区别n程序:一个计算机程序是对一个算法使用某种程序设计语言的具体实现n任何一种程序设计语言都可以实现任何一个算法n算法的有穷性意味
2、着不是所有的计算机程序都是算法问题求解问题求解(Problem Solving)证明正确性分析算法设计程序理解问题精确解或近似解选择数据结构算法设计策略设计算法 一般只考虑三种情况下的时间性一般只考虑三种情况下的时间性:最坏情况、最坏情况、最好情况和平均情况下的复杂性,分别记为最好情况和平均情况下的复杂性,分别记为Tmax(n)、Tmin(n)和和Tavg(n)算法复杂性算法复杂性 =算法所需要的计算机资源算法所需要的计算机资源 =时间复杂性时间复杂性+空间复杂性空间复杂性算法渐近复杂性算法渐近复杂性1)上界函数)上界函数定义定义1如果存在两个正常数c和n0,对于所有的nn0,有|f(n)|c
3、|g(n)|则记作f(n)=(g(n)含义:含义:n如果算法用n值不变的同一类数据在某台机器上运行时,所用的时间总是小于|g(n)|的一个常数倍。所以g(n)是计算时间f(n)的一个上界函数。f(n)的数量级就是g(n)。nf(n)的增长最多像g(n)的增长那样快n试图求出最小的g(n),使得f(n)=(g(n)。算法分类(计算时间)算法分类(计算时间)多项式时间算法多项式时间算法:可用多项式(函数)对其计算时间限界的算法。常见的多项式限界函数常见的多项式限界函数有:(1)(logn)(n)(nlogn)(n2)(n3)指数时间算法指数时间算法:计算时间用指数函数限界的算法。常见的指数时间限界
4、函数常见的指数时间限界函数:(2n)(n!)(nn)说明说明:当n取值较大时,指数时间算法和多项式时间算法在计算时间上非常悬殊。典型的计算时间函数曲线典型的计算时间函数曲线定义定义1.2如果存在两个正常数c和n0,对于所有的nn0,有|f(n)|c|g(n)|则记作f(n)=(g(n)含义:含义:n如果算法用n值不变的同一类数据在某台机器上运行时,所用的时间总是不小于|g(n)|的一个常数倍。所以g(n)是计算时间f(n)的一个下界函数。nf(n)的增长至少像g(n)的增长那样快n试图求出“最大”的g(n),使得f(n)=(g(n)。2)下界函数下界函数定义定义1.3如果存在正常数c1,c2和
5、n0,对于所有的nn0,有 c1|g(n)|f(n)|c2|g(n)|则记作含义含义:n算法在最好和最坏情况下的计算时间就一个常数因子范围内而言是相同的。可看作:既有f(n)=(g(n),又有f(n)=(g(n)n 记号表明算法的运行时间有一个较准确的界3)“平均情况平均情况”限界函数限界函数最优算法最优算法n问题的计算时间下界为(f(n),则计算时间复杂性为O(f(n)的算法是最优算法。n例如,排序问题的计算时间下界为(nlogn),计算时间复杂性为O(nlogn)的排序算法是最优算法。第2章 递归与分治策略2.1 递归的概念直接或间接地调用自身的算法称为递归算法递归算法。函数自身给出定义的
6、函数称为递归函数递归函数。n基于归纳法归纳法的递归n基于分治法分治法的递归2.1 递归的概念例例 FibonacciFibonacci数列数列无穷数列1,1,2,3,5,8,13,21,34,55,称为Fibonacci数列。它可以递归地定义为:边界条件边界条件递归方程递归方程第n个Fibonacci数可递归地计算如下:intfibonacci(intn)if(n=1)return1;returnfibonacci(n-1)+fibonacci(n-2);分治算法总体思想分治法分治法的的设计思想设计思想是,是,将一个难以直接解决的大将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便
7、各问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。个击破,分而治之。分治法的适用条件分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:n该问题的规模缩小到一定的程度就可以该问题的规模缩小到一定的程度就可以容易地解决容易地解决;n该问题可以分解为若干个规模较小的相同问题,即该问题该问题可以分解为若干个规模较小的相同问题,即该问题具有具有最优子结构性质最优子结构性质n利用该问题分解出的子问题的解利用该问题分解出的子问题的解可以合并可以合并为该问题的为该问题的解;解;n该
8、问题所分解出的各个子问题是该问题所分解出的各个子问题是相互独立相互独立的,即子问的,即子问题之间不包含公共的子问题。题之间不包含公共的子问题。分治法的基本步骤分治法的基本步骤 (1)分解分解分解分解:将原问题分解为若干个规模较小,:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;相互独立,与原问题形式相同的子问题;(2)解决解决解决解决:若子问题规模较小而容易被解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;则直接解,否则递归地解各个子问题;(3)合并合并合并合并:将各个子问题的解合并为原问题:将各个子问题的解合并为原问题的解。的解。分治法的复杂性分析一个
9、分治法将规模为n的问题分成k个规模为nk的子问题去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:通过迭代法求得方程的解:二分搜索技术给定已按升序排好序的给定已按升序排好序的n个元素个元素a0:n-1,现要在这,现要在这n个元素中找个元素中找出一特定元素出一特定元素x。据此容易设计出二分搜索算法二分搜索算法:templateintBinarySearch(Typea,constType&x,intl,int
10、r)while(r=l)intm=(l+r)/2;if(x=am)returnm;if(xam)r=m-1;elsel=m+1;return-1;算法复杂度分析:算法复杂度分析:每执行一次算法的while循环,待搜索数组的大小减少一半。因此,在最坏情况下,while循环被执行了O(logn)次。循环体内运算需要O(1)时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn)。合并排序基本思想:基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。publicstaticvoidmergeSort(Comparabl
11、ea,intleft,intright)if(leftright)/至少有2个元素inti=(left+right)/2;/取中点mergeSort(a,left,i);mergeSort(a,i+1,right);merge(a,b,left,i,right);/合并到数组bcopy(a,b,left,right);/复制回数组a复杂度分析复杂度分析T(n)=O(nlogn)渐进意义下的最优算法算法算法消去递归的合并排序算法消去递归的合并排序算法输入:输入:具有个元素的数组A输出:输出:按递增顺序排序的数组A1.template2.voidmerge_sort(TypeA,intn)3.4.
12、inti,s,t=1;5.while(tn)6.s=t;t=2*s;i=0;7.while(i+tn)8.merge(A,i,i+s-1,i+t-1,t);9.i=i+t;10.11.if(i+sn)12.merge(A,i,i+s-1,n-1,n-i);13.14.合并排序算法mergeSort的递归过程可以消去。初始序列49 38 65 97 76 13 2738 49 65 97 13 76 27第一步第二步38 49 65 97 13 27 76第三步13 27 38 49 65 76 97快速排序privatestaticvoidqSort(intp,intr)if(pr)intq=
13、partition(p,r);/以ap为基准元素将ap:r划分成3段ap:q-1,aq和aq+1:r,使得ap:q-1中任何元素小于等于aq,aq+1:r中任何元素大于等于aq。下标q在划分过程中确定。qSort(p,q-1);/对左半段排序qSort(q+1,r);/对右半段排序templateint Partition(Type a,int p,int r)int i=p,j=r+1;Type x=ap;while(true)while(a+i x&ir);/将将x);/将将 x的元素交换到右边区的元素交换到右边区域域 if(i=j)break;Swap(ai,aj);ap=aj;aj=x
14、;return j;快速排序线性时间选择问题线性时间选择问题n问题描述问题描述:给定线性集中n个元素和一个整数k,要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性序排列时,排在第k个位置的元素即为我们要找的元素。n当k=1时,即找最小元素;当k=n时,即找最大元素;当k=(n+1)/2时,称为找中位数。线性时间选择templateTypeRandomizedSelect(Typea,intp,intr,intk)if(p=r)returnap;inti=RandomizedPartition(a,p,r),j=i-p+1;if(k=j)returnRandomizedSelect(
15、a,p,i,k);elsereturnRandomizedSelect(a,i+1,r,k-j);线性时间选择问题算法线性时间选择问题算法n上述Partition算法可用来求选择问题的有效解。如果划分元素v测定在A(j)的位置上,则有j-1个元素小于或等于A(j),且有n-j个元素大于或等于A(j)。因此,若kj,则第k小元素在A(j+1:n)中,再对之进一步划分。在最坏情况下,算法randomizedSelect需要O(n2)计算时间但可以证明,算法randomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。l将n个输入元素划分成n/5个组,每组5个元素,只可能有
16、一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共n/5个。l递归调用select来找出这n/5个元素的中位数。如果n/5是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准。线性时间选择TypeSelect(Typea,intp,intr,intk)if(r-p75)用某个简单排序算法对数组ap:r排序;returnap+k-1;for(inti=0;i=(r-p-4)/5;i+)将ap+5*i至ap+5*i+4的第3小元素与ap+i交换位置;/找中位数的中位数,r-p-4即上面所说的n-5Typex=Select(a,p,p+(r-p-4)/5,
17、(r-p-4)/10);inti=Partition(a,p,r,x),j=i-p+1;if(k=j)returnSelect(a,p,i,k);elsereturnSelect(a,i+1,r,k-j);复杂度分析复杂度分析T(n)=O(n)32n n基本思想基本思想:n 把求解的问题把求解的问题分成许多阶段或多个子问题分成许多阶段或多个子问题,然后然后按顺序求解各个子问题按顺序求解各个子问题。前一个子问题的。前一个子问题的解为后一个子问题的求解提供了有用的信息。解为后一个子问题的求解提供了有用的信息。在求解任何一子问题时,列出各种可能的局部在求解任何一子问题时,列出各种可能的局部解,解,通
18、过决策保留那些有可能达到最优的局部通过决策保留那些有可能达到最优的局部解,丢弃其他局部解解,丢弃其他局部解,依次解决各子问题,最,依次解决各子问题,最后一个子问题就是问题的解。后一个子问题就是问题的解。动态规划算法动态规划算法的两个基本要素动态规划算法的两个基本要素对于一个多阶段过程问题,最优决策是否存在,不仅依赖于该问题是否有最优子结构性质,而能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。最优子结构性质最优子结构性质:原问题的最优解包含了其子问题的最优解。子问题重叠性质子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。34动态规划基本步骤n找出最优解的
19、性质,并刻划其结构特征。找出最优解的性质,并刻划其结构特征。n递归递归地定义最优值。地定义最优值。n以以自底向上自底向上的方式计算出最优值。的方式计算出最优值。n根据计算最优值时得到的信息,构造最根据计算最优值时得到的信息,构造最优解。优解。35矩阵连乘问题u穷举法穷举法u动态规划动态规划将矩阵连乘积 简记为Ai:j,这里ij 考察计算Ai:j的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,ikj,则其相应完全加括号方式为计算量:Ai:k的计算量加上Ak+1:j的计算量,再加上Ai:k和Ak+1:j相乘的计算量建立递归关系建立递归关系 令令mij,1i,jn,为计算为计算A
20、i,j 的最少数的最少数乘次数,则原问题为乘次数,则原问题为m1n。n当i=j时,Ai,j为单一矩阵,mij=0;n当ij时,利用最优子结构性质有:mij=minmik+mk+1j+pi1pkpjikj其中矩阵Ai,1in,的维数为pi1pi。n根据此递归式就可以直接用递归程序来实现。消除重复的矩阵连乘算法消除重复的矩阵连乘算法nVoid MatrixChain(int p,int n,int*m,int*s)n for(int i=1;i=n;i+)mii=0;n /将对角线元素赋值为零,即单个矩阵计算量为0n for(int r=2;r=n;r+)n for(int i=1;i=n r+1
21、;i+)n int j=i+r 1;n(5)mij=mi+1j+pi1*pi*pj;n /计算Ai,j=Ai:i Ai+1:jn sij=i;/记下断点in(7)for(int k=i+1;k j;k+)n int t=mik+mk+1j+pi1*pk*pj;n /对ikj,逐个计算Ai,j=Ai:k Ak+1:jn if(t mij)mij=t;sij=k;n /记下较小的mij及相应的断点k n 算法时间复杂性的上界为O(n3)39子问题的递归结构由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用cij记录序列和的最长公共子序列的长度。其中,和 当i=0或j=0时,空序列是
22、A和B的最长公共子序列。故此时Cij=0。其它情况下,由最优子结构性质可建立递归关系如下:40计算最优值由于在所考虑的子问题空间中,总共有(mn)个不同的子问题,因此,用动态规划算法自底向上自底向上自底向上自底向上地计算最优值能提高算法的效率。voidLCSLength(intm,intn,char*x,char*y,int*c,int*b)inti,j;for(i=1;i=m;i+)ci0=0;for(i=1;i=n;i+)c0i=0;for(i=1;i=m;i+)for(j=1;j=cij-1)cij=ci-1j;bij=2;elsecij=cij-1;bij=3;构造最长公共子序列构造最
23、长公共子序列voidLCS(inti,intj,char*x,int*b)if(i=0|j=0)return;if(bij=1)LCS(i-1,j-1,x,b);coutxi;elseif(bij=2)LCS(i-1,j,x,b);elseLCS(i,j-1,x,b);410-1背包问题给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?0-1背包问题是一个特殊的整数规划问题。420-1背包问题设所给0-1背包问题的子问题的最优值为的最优值为m(i,j),即,即m(i,j)是背包容量为是背包容量为j,可选择物品为,
24、可选择物品为i,i+1,n时时0-1背包问题的最优值。由背包问题的最优值。由0-1背包问题的最优子背包问题的最优子结构性质,可以建立计算结构性质,可以建立计算m(i,j)的递归式如下。的递归式如下。43templatevoidKnapsack(Typev,intw,intc,intn,Type*m)intjMax=min(wn-1,c);for(intj=0;j=jMax;j+)mnj=0;for(intj=wn;j=c;j+)nnj=vn;for(inti=n-1;i1;i-)jMax=min(wi-1,c);for(intj=0;j=jMax;j+)mij=mi+1j;for(intj=w
25、i;j=w1)m1c=max(m1c,m2c-w1+v1);贪心算法贪心算法n贪心算法总是作出在贪心算法总是作出在当前看来最好的选当前看来最好的选择择,即所作的选择只是,即所作的选择只是局部最优选择局部最优选择。n希望从希望从局部的最优选择局部的最优选择得到得到整体最优解整体最优解。n采用逐步构造最优解的方法。在每个阶采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不一定的标准下)。决策一旦作出,就不可再更改。可再更改。贪心方法描述量度标准A(1)A(2)A(n)A(1)A(2)A(n)S(1)S(2)这种量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 算法 设计 分析 复习
限制150内