《算法设计与分析》PPT课件.ppt
《《算法设计与分析》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《算法设计与分析》PPT课件.ppt(175页珍藏版)》请在三一办公上搜索。
1、第3章 动态规划,学习要点:理解动态规划算法的概念,动态规划vs递归分治 掌握动态规划算法的基本要素(1)最优子结构性质(2)重叠子问题性质掌握设计动态规划算法的步骤。(1)找出最优解的性质,并刻划其结构特征。(2)递归地定义最优值。(3)以自底向上的方式计算出最优值。(4)根据计算最优值时得到的信息,构造最优解。,通过应用范例学习动态规划算法设计策略。(1)矩阵连乘问题;(2)最长公共子序列;(3)最大子段和(4)凸多边形最优三角剖分;(5)(多边形游戏)(6)图像压缩;(7)背包问题;(8)最优二叉搜索树(9)(流水作业调度)(10)(电路布线),与分治法类似,其基本思想也是将待求解问题分
2、解成若干个子问题;先求子问题解,然后合成原问题解,算法总体思想,大问题自上而下分解为子问题时,可以有多种分解方法。e.g.归并排序,矩阵连乘如果不同分解方法对应的子问题及其解不同,并导致合并后的原问题解不同,则需要考虑各种可能的分解方法。此时,无法直接采用分治法求解:e.g.矩阵连乘1.分解得到的子问题往往不是互相独立的,用分治法求解,需要计算的子问题数目太多,时间复杂性指数级别2.不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。E.g.Fibonacci数列计算,见后,与分治法区别,解决方法:保存已解决的子问题的答案,在需要时再找出已求得的答案,避免大量重
3、复计算,得到多项式时间算法。利用表来记录子问题的答案,表的大小为多项式量级,T(n),示例:分治法 vs 动态规划,算法1基于递归分治 F(n)1.if(n=1 return 1;2.else return F(n-1)+F(n-2);问题:复杂性O(2n)原因:自上而下的递归计算过程中,一些子问题被多次重 复计算,Fibonacci数,F(6),F(4),F(3),F(2),F(1),F(0),F(2),F(1),F(0),F(1),F(5),F(4),F(3),F(2),F(1),F(0),F(1),F(3),F(2),F(2),F(1),F(0),F(1),F(1),F(0),子问题F(
4、3)重复计算3次子问题F(2)重复计算5次,算法2:非递归的分治算法 保存子问题计算结果,只计算1次,以后碰到同样子问题时,直接调用已有结果F1(n)0.初始化数组 vi-1,0 i n 1.if vn 0 then 2.vn F1(n-1)+F1(n-2)3.return vn 数组vn:存储子问题结果的数组,vi:表示子问题Fi的解,vi=-1:表示子问题Fi还没有被计算问题:自上而下的计算过程中,避免了多次计算同一子问题,但又多次函数调用。每次调用需要花费较多时间用于参数传递和动态链接,算法3自下而上的迭代算法:动态规划算法F2(n)1.F(0)1;2.F(1)1;3.for i 2 t
5、o n do 4.Fi F1(i-1)+F1(i-2)/*问题-子问题间的递归公式 5.return Fn 特点:1)时间复杂性 O(n)2)自下而上,迭代计算 3)利用数组,保存中间(子问题)计算结果。每个子问题只计算一次,动态规划基本步骤,1.找出最优解的性质,刻划其结构特征-最优子结构特征2.递归地定义最优值:刻画原问题解与子问题解间的(数值)关系:表达式中存在寻优变量、最优目标值3.以自底向上的方式计算出各个子问题、原问题的最优值,并避免子问题的重复计算(记录已计算的子问题解)4.根据计算最优值时得到的信息,构造最优解,12,(1)矩阵连乘问题;乘法次数最少(2)最长公共子序列;公共子
6、序列的长度最长(3)最大子段和子段中的数字之和最大(4)凸多边形最优三角剖分;三角形上权之和为最小(6)图像压缩;(9)背包问题;(10)最优二叉搜索树。(7)电路布线;(8)流水作业调度;作业运行时间最短(5)多边形游戏;,动态规划适宜解最优化问题,给定n个可连乘的矩阵A1,A2,An,连乘积A1A2,An。根据矩阵乘法结合律,可有多种不同计算次序,每种次序有不同的计算代价)数乘次数(取决于各矩阵的行、列数和计算次序)给定2个矩阵Api,pj,Bpj,pk,AB 为pi,pk矩阵,数乘次数pipjpk多个矩阵的连乘计算次序可用完全加括号来确定见下页,完全加括号的矩阵连乘积,这5种计算次序对应
7、的计算代价分别为:16000,10500,36000,87500,34500,设有四个矩阵A,B,C,D,它们的维数分别是:总共有五种完全加括号的方式,举例,(40*30*5)+10*40*5+50*10*5,CD40,5,B(CD)10,5,A(B(CD)50,5,完全加括号的矩阵连乘积可递归地定义为:,(1)单个矩阵是完全加括号的;(2)矩阵连乘积 是完全加括号的,则 可 表示为2个完全加括号的矩阵连乘积 和 的乘积并加括号,即,加括号:矩阵连乘的计算次序,矩阵连乘问题,给定n个矩阵,其中 与 是可乘的,。考察这n个矩阵的连乘积 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计
8、算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积,给定n个矩阵A1,A2,An,其中Ai与Ai+1是可乘的,i=1,2,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。,方法1:穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。,算法复杂度分析:对于n个矩阵的连乘积,设其不同的计算次序下的组合方式(即完全加括号的组合方式)为P(n)。每种加括号方式都可以分解为两个子矩阵的
9、加括号问题:(A1.Ak)(Ak+1An),关于P(n)的递推式如下:,穷举法,方法2:动态规划,将矩阵连乘积 简记为Ai:j,这里ij,考察计算Ai:j的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,ikj,则其相应完全加括号方式为,计算量:Ai:k的计算量+Ak+1:j的计算量+Ai:k和Ak+1:j相乘的计算量,特征:计算Ai:j的最优次序所包含的计算矩阵子链 Ai:k和Ak+1:j的次序也是最优的。即:矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。,分析最优解的结构 是否可
10、用动态规划?,建立递归关系,设计算Ai:j,1ijn,所需要的最少数乘次数mi,j,则原问题的最优值为m1,n 当i=j时,Ai:j=Ai,因此,mi,i=0,i=1,2,n当ij时,断开位置k可以递归地定义mi,j为:,这里 的维数为,的位置只有 种可能,计算最优值,对于1ijn,不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有由此可见,在递归计算时,许多子问题被重复计算多次 这也是该问题可用动态规划算法求解的又一显著特征。用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算:1)在计算过程中,保存已解决的子问题答案。每个子问题只计算一次 2)而在后面需要时
11、只要简单查一下,从而避免大量的重复计算 最终得到多项式时间的算法,子问题Ai,i,1i n,void MatrixChain(int*p,int n,int*m,int*s)for(int i=1;i=n;i+)mii=0;/*规模为1的子问题的最优解 for(int r=2;r=n;r+)/*自下而上,从规模为r=2的子问题开始,依次计算规模为2、3、n的子问题 for(int i=1;i=n-r+1;i+)/*考察规模为r的共n-r+1个子问题 mi,j,j-i=r-1,int j=i+r-1;/*子问题左端点i,右端点j,规模r mij=0+mi+1j+pi-1*pi*pj;/*设置子问
12、题mi,j的初始最优值 sij=i;/*记录子问题最优值的初始断点位置 for(int k=i+1;k j;k+)/*依次考察不同断点,计算mi,j最优值 int t=mik+mk+1j+pi-1*pk*pj;if(t mij)mij=t;sij=k;,输入参数,最优值,断开位置,子问题mi,j的递推比较,矩阵维度,1,n,子问题规模r:,2,n,r,左端点i:,1,(=n-1),n-r+1,右端点j:,2,j=i+r-1,n,i,子问题mi,j的断点k:,i+1,j,k,规模为r的子问题mi,j,共n-r+1个,mi,j,子问题:AiAi+1AkAj,r,断点,右端点,左端点,子问题规模/长
13、度,共有 j-i个断点,示例,A2A3A4A5,1,1,6,6,1,2,5,6,1,3,4,6,1,4,3,6,1,5,2,6,1,6,算法复杂度分析:算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。,27,总结矩阵连乘问题求解要素,1.原问题/子问题形式化表述2.(定量)最优化目标3.原问题/子问题最优解递归表达式,28,问题归结:原问题 子问题(问题规模更小),原问题:A(i,j),最优解:m(i,j),A(i,k),m(i,k),A(
14、k,j),m(k,j),动态规划算法基本要素,一、最优子结构,矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质 E.g.,这5种计算次序对应的计算代价分别为:16000,10500,36000,87500,34500 原问题最优解(最优次序)为:(A(B(CD),原问题最优解(最优次序)为:(A(B(CD)原问题分解为2个子问题:(A)(BCD)对子问题(BCD),其最优计算顺序仍然是(B(CD),与原问题中计算顺序相同保证了:由子问题解合成原问题解时候,可以得到最优解,(ABCD),(A),(BCD),(B),(CD),(C),(D),(BCD),(B),(CD
15、),(C),(D),全局最优,子问题最优,(BCD),(BC),(D),(B),(C),子问题非最优,10*40*30+10*30*5=13500,40*30*5+10*40*5=8000,如何证明一个问题具有最优子结构性质:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。最优子结构是问题能用动态规划算法求解的前提:利用此性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。,同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低),二、重叠子问题,递归算法求解
16、问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质 重复计算子问题,可能导致计算复杂度非多项式型E.g.1 E.g.2,用P54页递归算法,计算A1,4时的递归树,动态规划算法,对每一个子问题只解一次,子问题解保存在一个表格中;当再次需要解此子问题时,只是简单地用常数时间查看一下结果不同子问题个数一般随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,e.g.O(n3),从而获得较高的解题效率(?未必,特别是当n很大时)问题具有重叠子问题性质是保证采用动态规划法可以获得更高效率(相比于分治、递归)的前提 反例:对第2章中排序问题,分治算法与
17、动态规划法性能差别不大 3 2 7 9 1 6 8 5 1 2 3 5 6 7 8 9,递归分治法 vs 动态规划法,动态规划法带有全局最优化目标极大/极小化目标值;在子问题划分时,可以有多种划分方式,不同划分导致不同的目标值,因此需要在多种划分方式中选择使目标达到极值的划分方式分治法可以不涉及全局最优化目标,而且问题划分方式一般 是固定的E.g.动态规划-矩阵连乘:(ABCD)有以下3种分解/合成方法,(A)(BCD)(AB)(CD)(ABC)(D),最优目标,E.g.分治法-排序、大整数乘、矩阵乘 固定划分方式、无选择和最优化目标要求 1)3 2 7 9 1 6 8 5 1 2 3 5 6
18、 7 8 9,2),3),递归分治法 vs 动态规划法(续),分治法自上而下分解问题,有可能导致重复计算,e.g.斐波那契数列 动态规划自下而上合成问题,避免重复计算,备忘录方法,自上而下、递归、避免重复计算子问题的问题求解方法控制结构与直接递归方法的控制结构相同,为每个解过的子问题建立了备忘录以备需要时查看,避免对相同子问题的重复求解,E.g.矩阵连乘 矩阵mi,j初始化为0,表示子问题没有计算过,int LookupChain(int i,int j)/*求解问题 Ai,j=(Ai Ai+1 Aj)if(mij 0)return mij;/*Ai,j 如果以前以计算过,则 mi,j0,直接
19、返回计算结果,避免重复计算 if(i=j)return 0;/*Ai,j=Ai,i,只有1个矩阵的最小规模子问题/*以下各步依次比较 k=i,j-1 等多种划分方法,求最优划分和最优值 int u=LookupChain(i,i)+LookupChain(i+1,j)+pi-1*pi*pj;sij=i;/*初始最佳划分点位置k=i for(int k=i+1;k j;k+)int t=LookupChain(i,k)+LookupChain(k+1,j)+pi-1*pk*pj;if(t u)u=t;sij=k;mij=u;return u;,Ai,i*Ai+1,j,Ai,k*Ak+1,j,备忘
20、录 vs 动态规划,备忘录方法采用自上而下的递归分解法与动态规划法一样,避免子问题重复计算但由于采用递归,需要多次函数调用和参数传递,计算时间仍然比动态规划要大,最长公共子序列,若给定序列X=x1,x2,xm,则另一序列Z=z1,z2,zk,是X的子序列是指存在一个严格递增下标序列i1,i2,ik使得对于所有j=1,2,k有:zj=xijE.g.对序列X=A,B,C,B,D,A,B,子序列Z=B,C,D,B,相应的递增下标序列为2,3,5,7。应用:网络内容审查,敏感字检查给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。问题:给定2个序列X=x1,
21、x2,xm和Y=y1,y2,yn,找出X和Y的最长公共子序列,E.g.X=(A,B,C,B,D,A,B)Y=(B,D,C,A,B,A)子序列:Z1=(B,C,A),长度3 Z2=(B,C,B,A),长度4,设计步骤1:判断最长公共子序列的结构是否具有最优子结构性质,设序列X(m)=x1,x2,xm和Y(n)=y1,y2,yn的最长公共子序列为Z(k)=z1,z2,zk,则(1)若xm=yn,则zk=xm=yn,且Z(k-1)=z1,z2,zk-1 是X(m-1)=x1,x2,xm-1和Y(n-1)=y1,y2,yn-1的最长公共子序列,B,C,B,A,X(m):,C,B,A,Y(n):,B,B
22、,C,B,X(m-1):,Y(n-1):,Z(k):,C,B,B,A,Z(k-1):,C,B,B,问题规模前缀,问题归结:原问题 子问题(问题规模更小),子问题最优解:Z(k-1)Z(k)Z(k)上述3种情况下,原问题最优解包括了子问题最优解!,前缀,3种情况:,(2)若xmyn且zkxm,则Z(k)是x(m-1)和Y(n)的最长公共子序列,B,C,B,A,C,B,A,B,B,C,B,C,B,B,A,X(m):,Y(n):,X(m-1):,Z(k):,问题规模前缀,A,(3)若xmyn且zkyn,则Z(k)是X(m)和y(n-1)的最长公共子序列,B,C,B,A,C,B,A,B,C,B,B,A
23、,C,B,A,B,X(m):,Y(n-1):,Y(n):,Z(k):,问题规模 前缀,由此可见,2个序列的最长公共子序列包含了这2个序列的前缀(i.e.子问题)的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。,设计步骤2:子问题的递归结构,根据最优子结构性质,建立子问题最优值的递归关系。cij:序列X(i)和Y(j)的最长公共子序列的长度,X(i)=x1,x2,xi;Y(j)=y1,y2,yj。当i=0或j=0时,即其中1个序列为空,则空序列是Xi和Yj的最长公共子序列。故此时Cij=0。其它情况下,由最优子结构性质可建立递归关系如下:,3种情况,计算最优值,对X(m)和Y(n)
24、,总共有(mn)个不同的子问题,用动态规划算法自底向上地计算最优值,以提高算法效率。,void LCSLength(int m,int n,char*x,char*y,int*c,int*b),数组x*和y*:存储2个输入序列X(m)、Y(n)输出数组c:cij存储序列Xi、Yj的最长公共子序列的长度输出数组b:bij 记录cij的值是由哪个子问题得到的(3种情 况之一),构造最长公共子序列时用到,X(i)=x1,x2,xi,1i m;Y(j)=y1,y2,yj,1j n;,void LCSLength(int m,int n,char*x,char*y,int*c,int*b)int i,j
25、;for(i=1;i=cij-1)/*情况2 cij=ci-1j;bij=2;else cij=cij-1;/*情况3 bij=3;,每个数组单元的计算耗时O(1),算法耗时:O(mn),算法LCSLength构造了数组bij,据此可递归构造出X(i)、Y(j)的最长公共子序列:,void LCS(int i,int j,char*x,int*b)if(i=0|j=0)return;if(bij=1)LCS(i-1,j-1,x,b);coutxi;/*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和 Y(j-1)的解LCS(i-1,j-1,x,b),加上位于最后的Xi 组成 e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 PPT 课件
链接地址:https://www.31ppt.com/p-5565432.html