《算法设计与分析》第07章.ppt
《《算法设计与分析》第07章.ppt》由会员分享,可在线阅读,更多相关《《算法设计与分析》第07章.ppt(66页珍藏版)》请在三一办公上搜索。
1、7.1 一般方法和基本要素7.2 每对结点间的最短路径 7.3 矩阵连乘 7.4 最长公共子序列7.5 最优二叉搜索树 7.6 0/1背包 7.7 流水作业调度,第7章 动态规划法,动态规划法的实质也是将较大问题分解为较小的同类子问题,这一点上它与分治法和贪心法类似。但动态规划法有自己的特点。分治法的子问题相互独立,相同的子问题被重复计算,动态规划法解决这种子问题重叠现象。贪心法要求针对问题设计最优量度标准,但这在很多情况下并不容易。动态规划法利用最优子结构,自底向上从子问题的最优解逐步构造出整个问题的最优解,动态规划则可以处理不具备贪心准则的问题。,7.1 一般方法和基本要素,7.1.1 一
2、般方法,最优性原理指出,一个最优策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,其余决策必定构成最优策略。这便是最优决策序列的最优子结构特性。,设计一个动态规划算法,通常可以按以下几个步骤进行:(1)刻画最优解的结构特性;(2)递归定义最优解值;(3)以自底向上方式计算最优解值;(4)根据计算得到的信息构造一个最优解。其中,第(1)至(3)步是动态规划算法的基本步骤。最优解值是最优解的目标函数的值。,7.1.2 基本要素,一个最优化多步决策问题适合用动态规划法求解有两个要素:最优子结构特性和重叠子问题。,多段图问题,例71 多段图G=(V,E)是一个带权有向图,它具有
3、如下特性:图中的结点被划分成k2个互不相交的子集Vi,1ik。其中V1和Vk分别只有一个结点,V1包含源点(source)s,Vk包含汇点(sink)t。对所有边E,多段图要求若uVi,则vVi1,1ik,每条边的权值为c(u,v)。从s到t的路径长度是这条路径上边的权值之和,多段图问题(multistage graph problem)是求从s到t的一条长度最短的路径。,【程序71】多段图的向前递推算法templatevoid Graph:FMultiGraph(int k,int*p)/采用程序68的邻接表存储图G。float*cost=new floatn;int q,*d=new in
4、tn;costn-1=0,dn-1=-1;,for(int j=n-2;j=0;j-)float min=INFTY;for(ENode*r=aj;r;r=r-nextArc)int v=r-adjVex;if(r-w+costvw+costv;q=v;costj=min;dj=q;p0=0;pk-1=n-1;for(j=1;j=k-2;j+)pj=dpj-1;delete cost;delete d;,7.1.4 资源分配问题,【例72】将n个资源分配给r个项目,已知如果把j个资源分配给第i个项目,可以收益N(i,j),0jn,1ir。求总收益最大的资源分配方案。,7.2.1 问题描述,设G
5、=(V,E)是一个有n个结点的带权有向图,w(i,j)是权函数,每对结点间的最短路径问题是指求图中任意一对结点i和j之间的最短路径。,7.2 每对结点间的最短路径,7.2.2 动态规划法求解,最优子结构设图G=(V,E)是带权有向图,(i,j)是从结点i到结点j的最短路径长度,k是这条路径上的一个结点,(i,k)和(k,j)分别是从i到k和从k到j的最短路径长度,则必有(i,j)=(i,k)+(k,j)。因为若不然,则(i,j)代表的路径就不是最短路径。这表明每对结点之间的最短路径问题的最优解具有最优子结构特性。,最优解的递推关系,重叠子问题:为了计算dkij时,必须先计算dk1ij、dk1i
6、k和dk1ik,dk1的元素被多个dk的元素的计算共享。,7.2.3弗洛伊德算法,弗洛伊德算法的基本思想是:令k=0,1,n-1,每次考察一个结点k。二维数组d用于保存各条最短路径的长度,其中,dij存放从结点i到结点j的最短路径的长度。在算法的第k步上应作出决策:从i到j的最短路径上是否包含结点k。,【程序72】弗洛伊德算法templatevoid MGraph:Floyd(T*,for(k=0;kn;k+)for(i=0;in;i+)for(j=0;jn;j+)if(dik+dkj dij)dij=dik+dkj;pathij=pathkj;弗洛伊德算法的时间复杂度为O(n3),7.2.4
7、 算法正确性,定理71 弗洛伊德算法得到的dij,0i,jn-1是从i到j的最短路径。,问题描述,给定n个矩阵A0,A1,An1,其中Ai,i=0,n-1的维数为pipi+1,并且Ai与Ai+1是可乘的。考察这n个矩阵的连乘积A0A1An1,由于矩阵乘法满足结合律,所以计算矩阵的连乘可有许多不同的计算次序。矩阵连乘问题是确定计算矩阵连乘积的计算次序,使得按照这一次序计算矩阵连乘积,需要的“数乘”次数最少。,7.3 矩阵连乘,完全加括号的矩阵连乘积可递归地定义为:单个矩阵是完全加括号的;矩阵连乘积A是完全加括号的,则A可表示为两个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。,例7
8、4 4个矩阵连乘积ABCD,设它们的维数分别为A:5010,B:1040,C:4030,D:305。,7.3.2 动态规划法求解,最优子结构矩阵连乘AiAi+1Aj简记为Ai:j,ij。于是矩阵连乘A0A1An-1可记作A0:n-1。将这一计算次序在矩阵Ak和Ak+1,0kn-1之间断开,则其相应的完全加括号形式为(A0A1Ak)(Ak+1Ak+2An1)。可先分别计算A0:k和Ak+1:n-1,然后将两个连乘积再相乘得到A0:n-1。,矩阵连乘A0:n-1的最优计算次序的计算量等于A0:k和Ak+1:n-1两者的最优计算次序的计算量之和,再加上A0:k和Ak+1:n-1相乘的计算量。如果两个
9、矩阵子序列的计算次序不是最优的,则原矩阵的计算次序也不可能是最优的。这就是说,矩阵连乘问题的最优解具有最优子结构特性。,最优解的递推关系先定义一个二维数组m,用来保存矩阵连乘时所需的最少计算量。,矩阵连乘算法,【程序73】矩阵连乘算法class MatrixChainpublic:MatrixChain(int mSize,int*q);int MChain();int LookupChain();void Traceback();,private:void Traceback(int i,int j);int LookupChain(int i,int j);int*p,*m,*s,n;,i
10、nt MatrixChain:MChain()/求A0:n-1的最优解值 for(int i=0;in;i+)mii=0;,for(int r=2;r=n;r+)for(int i=0;i=n-r;i+)int j=i+r-1;mij=mi+1j+pi*pi+1*pj+1;sij=i;for(int k=i+1;kj;k+)int t=mik+mk+1j+pi*pk+1*pj+1;if(tmij)mij=t;sij=k;return m0n-1;,void MatrixChain:Traceback(int i,int j)if(i=j)coutAi;return;if(isij)cout(;
11、Traceback(i,sij);if(isij)cout);if(sij+1j)cout(;Traceback(sij+1,j);if(sij+1j)cout);void MatrixChain:Traceback()cout(;Traceback(0,n-1);cout);coutendl;,例75 6个矩阵连乘积A0A1A2A3A4A5,设它们的维数分别为A:3035,B:3515 C:155 D:510,E:1020,F:2025。,备忘录方法,矩阵连乘的备忘录方法 备忘录方法为每个已经计算的子问题建立备忘录,即保存子问题的计算结果以备需要时引用,从而避免了相同子问题的重复求解。,【程
12、序74】矩阵连乘的备忘录方法 int MatrixChain:LookupChain(int i,int j)if(mij0)return mij;if(i=j)return 0;int u=LookupChain(i+1,j)+pi*pi+1*pj+1;sij=i;for(int k=i+1;kj;k+)int t=LookupChain(i,k)+LookupChain(k+1,j)+pi*pk+1*pj+1;if(tu)u=t;sij=k;mij=u;return u;,int MatrixChain:LookupChain()return LookupChain(0,n-1);,7.5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 07

链接地址:https://www.31ppt.com/p-5044718.html