1、算法设计与分析讲义chapter4第四章 Dynamic Programming技术4.1 Dynamic Programming 概述 优化问题: 一个优化问题可能有很多解,每个解有一 个代价,我们希望选择一个具有最少代价 的解。一个优化问题可能有多个优化解。 动态规划方法:Dynamic Programming方法适用于:当一个优化问 题可分为多个子问题,子问题的解被重复使用。 Dynamic Programming方法求解每个子问题仅一次, 并保存其结果,以后用到时直接存取,不重复计算, 节省计算时间。 Dynamic Programming方法自底向上,而divid- and-conq
2、ue方法自顶向下。 动态规划算法的书记步骤 分析优化解的结构 递归地定义最优解的代价 自底向上地计算优化解的代价保存之, 并获取构造最优解的信息。 根据构造最优解的信息构造优化解4.2. Matrix-chain Multiplication4.2.1 问题的提出 矩阵链乘法问题 输入: Ai是矩阵 输出:矩阵乘积 A1A2An 矩阵链乘法的实现 矩阵乘法满足结合率。 计算一个矩阵链的乘法可有多种方法: 例如:(A1A2A3A4)=(A1(A2(A3A4) =((A1A2)(A3A4)) . =((A1A2)A3)A4) 两个矩阵的乘法AB的代价依赖于计算的顺序 复杂性测度:乘法的次数 AB的
3、代价:设A是pq矩阵,B是qr矩阵, 则计算AB的时间是0(pqr). 矩阵链乘法的代价 设A1=10100矩阵, A2=1005矩阵, A3=550矩阵, 则 T(A1A2)A3)=101005+10550=5000+2500=7500 T(A1A2) A3)=100550+1010050 =25000+50000=750000. 结论: 不同解法有不同的代价。 矩阵链乘法优化问题 输入:, Ai是pi-1pi矩阵 输出:代价最小的计算A1A2.An的方法 矩阵链乘法优化问题的解空间设p(n)=计算具有n个矩阵的矩阵链乘积的方法数 1 if n=1 p(n)= if n2 p(n)=C(n-
4、1)=Catalan数= (4n/n) *如此之大的解空间是无法用枚举方法求出最优解的!4.2.2 优化解的结构几个记号 Ai-j=AiAi+1.Aj cost(Ai-j)=计算Ai-j的代价 优化解的结构 对于任意k,1kn,A1n=A1kAk+1n cost(A1n)=cost(A1k)+cost(Ak+1n)+cost(A1kAk+1n) 在A1n的优化解中,子问题A1k的解法必须是A1-k的优化 解,子问题Ak+1n的解必须是Ak+1n的优化解。 -问题的优化解包括子问题优化解 -Dynamic-programming可用的原因4.2.3. 优化解的代价方程 假设 mi,j=计算Ai-
5、j的最小乘法数 m1,n=计算Ain的最小乘法数 A1.AkAk+1.An是优化解 代价方程 mi,i=计算Aii=Ai的最小乘法数=0 mi,j=mi,k+mk+1,j+pi-1pkpj,其中, pi-1pkpj是计算 Ai-kAi-k所需要完成的乘法数, AI和Ak分别是pI-1pI和 pk-1pk矩阵. *k实际上是不可预知. 0 if i=j mi,j= minikjmi,k+mk+1,j+pI-1pkpj if ij *以下令Si,j是Aij的优化解对应的k值.4.2.4 优化解代价方程的计算 1. 递归计算方法 0 if i=j m1,n= min1knm1,k+mk+1,n+po
6、pkpn if ij 算法: IF i=j THEN Return 0; m=; For k=1 to n-1 Do x=m1,k+mk+1,n+popkpn; IF xm THEN m=x; Return m; 算法复杂性分析 T(n)= (T(k)+T(n-k)+(1) =(1)+ (T(k)+T(n-k) =(1)+2T(k) =(n)+ 2T(k) (n)+2T(n-1) (n)+(n-1)+22T(n-2) (n)+(n-1)+.+(1)+2n-1T(1) (2n) *递归算法并不好于枚举算法 2.动态规划算法 数据结构 矩阵Ai: Pi-1Pi for i=1,2,.n, 以为数组
7、p= 二维数组m1.n,1.n,存储mi,j 二维年数组s1.n,1.n, 存储计算mi,j时确定的 优化解对应的k值. 基本思想 对于ikj, mi,j=mini,k+mk+1,j+pi-1pkpj 对于ikj,必须在计算mi,j之前计算出所有 mi,k,mk+1,j,并加以存储。 算法 Matrix-Chain-Order(p) n=length(p)-1; FOR i=1 TO n DO Mi,i=0; FOR =2 TO n DO FOR i=1 TO n-+1 DO j=i+-1; mi,j=; /* 以下计算mi,j=minikji,k+mk+1,j+pi-1pkpj */ FOR
8、 ki To j-1 DO q=mi,k+mk+1,j+pi-1pkpj IF qmi,j THEN mi,j=q;si,j=k; Return m and s. 算法注释 =2: i=1,2,.,n-+1=n-1 j=i+-1=i+1 计算mk,k+1,1kn-1; =3: i=1,2,.,n-+1=n-2 j=i+-1=i+3-1=i+2 计算mk,k+2,1kn-2; =4: i=1,2,.,n-+1=n-3 j=i+l-1=i+4-1=i+3 计算mk,k+3, 1kn-3; =n: i=1,.n-+1=n-n+1=1 j=i+-1=1+n-1=n 计算m1,n =2时:计算mi,i+
9、1需要mi,k和mk+1,i+1, iki+1,即mi,i, mi+1,i+1 =3时:计算mi,i+2 需要mi,k,mk+1,i+2,iki THEN X=Matrix-Chain-Multiply(A,s,i,si,j); Y=Matrix-Chain-Multiply(A,s,si,j+1,j); Return Matrix-Multiply(X,Y); Else Return Aj4.3 动态规划原理问题:什么情况下可以应用 Dynamic Programming可用动态规划方法求解的问题必须满足: 1. 具有Optimal substructure 2. 具有Overlapping
10、 sub-problems 4.3.1 Optimal substructure 1优化结构定义1. 如果一个问题的优化解包含了他的子问题的优化解, 则称此问题具有优化结构。*优化结构是应用动态规划方法的一个条件,也是应用Greedy 方法的一个条件,是否用动态规划方法,尚需看是否满足 Overlapping subproblems条件。 例1. Matrix-Chain-Multiply问题具有优化结构,因为 A1.An的优化解(A1.An) (Ak+1.An)包含 子问题(A1.An)和(Ak+1An)的优化解。 2.子问题空间 理想情况:子问题空间越小越好,可减少时间和空间复杂性。 例1
11、 Matrix-Chain-Multiply问题的子问题是所有子链 的集合。 我们也可以使子空间为任意的矩阵子序例太多 的无必要的子问题不得不被求解。 合适子空间地确定 在分析问题的结构时,用循环方法可以得到一个好的子问题 空间。 例2(A1An)=(A1.Ak1)(Ak+1.An) =(A1.Ak2)(Ak2+1.A1) (Ak+1.Ak3)(Ak3+1.An) 最后得到子问题空间为S=AiAi+1.Aj1ijn. 我们来计算S的大小。S包括: 长为1的矩阵子链n个, 长为2的矩阵子链n-1个, 长为n-1的矩阵子链2个, 长为n的矩阵子链1个. 于是,S的大小为n(n+1)/2。4.3.2
12、 Overlapping sub-problems 1.相交子问题 定义2.如果递归算法求解一个优化问题时,反复求解相同的 子问题,则称该优化问题有相交子问题。 *Dynamic Programming方法利用这种特点,只计算每个子问 题一次并保存,避免反复计算相同子问题多次。 *Divid-and-conguer方法每次都产生新问题并计算之,而不 管是否该子问题已计算过。 2Matrix-Chain-Multiply的递归分解算法 算法 Recursive-Matrix-chain(p,i,j) If i=j Then Return 0; Mi,j=; For k=i To j-1 Do q
13、=Recursive-Matrix-chain(p,i,k)+ Recursive-Matrix-chain(p,k+1,j)+pi-1pkpj If qmi,j Then mi,j=q Return mi,j. 复杂性分析 求m1,n的复杂性: T(1)1 T(n)1+ (T(k)+T(n-k)+1) 2T(k)+n2T(n-1)+n22T(n-2)+2(n-1)+n 23T(n-3)+.2n-1T(1)=0(2n)4.3.3. Memoization基本思想 使低效的递归算法记忆化用表记住子问题的解,供以后查 找,控制结构仍然是自顶向下的递归结构。 Matrix-Chain-Multipl
14、y记忆算法 Matrix-Chain-Multiply(p)1. n=length(p)-12. For i=1 To n Do3. For j=i To n Do4. mi,j=;5. Return Lookup-chain(p,1,n).Lookup-chain(p,i,j)1. IF mi,j THEN Return mi,j;2. IF i=j THEN mi,j=0;3. ELSE FOR k=i To j-1 Do q=Lookup-china(p,i,k)+Lookupchina(p,k+1,j)+ pi-1pkpj4. If qmi,j THEN mi,jq5. Return
15、mi,j.Matrix-Chain-Multiply算法的复杂性 共有0(n2)表项,每个表项调用一次Lookup-chain, 每次调用 0(n)时间, T(n)=0(n3) S(n)=0(n2)m1:n,1:n4.4 最长公共子序列问题4.4.1. 问题定义 1. 子序列 定义1. 设x=(x1,x2,.xm)是一个序列,z=(z1,z2,.zm)是x的一个子序列,如果存在1i1i2.ikm,使xij=zj 例1. X=(A,B,C,B,D,A,B),Z=(B,C,D,B)是X的子序例。 2公共子序列 定义2. Z是序列X与Y的公共子序列如果Z是X的子序列且Z是Y的子序列。 3最长公共子序
16、列问题(LCS) 输入:X=(x1,x2,.xn),Y=(y1,y2,.ym) 输出:Z=X与Y的最长公共子序列6.4.2.最长公共子序列结构分析 定义3.设X=(x1,x2,.xn)是一个序列,X的第I前缀Xi是一个序列,定义为Xi=(x1,.xi)例2. X=(A,B,D,C,A),X1=(A),X2=(A,B),X3=(A,B,D) 1. 优化解的结构 定理1(LCS的优化结构)设X=(x1,.xm), Y=(y1,y2,.yn)是两个序列,Z=(z1,z2,.zk)是X与Y的LCS。下列结论成立: 如xm=yn, 则zk=xm=yn, Zk-1是Xm-1和Yn-1的LCS,即,LCSX
17、Y=LCSXm-1Yn-1+. 若xmyn,且zkxm,则Z是Xm-1和Y的LCS,即LCSXY=LCSXm-1Y 若xm=yn,且zkyn,则Z是X与Yn-1的LCS,即LCSXY=LCSXYn-1证明. 设zkxm,则可加xm=yn到Z,得到一个长为k+1的X与Y的公共序列,与Z是X和Y的LCS矛盾。于是zk=xm=yn。 现在证明Zk-1是Xm-1与Yn-1的LCS。显然Zk-1是Xm-1与Yn-1的公共序列,我们需要证明Zk-1是LCS。设不然,则存在X与Y的公共子序列W,W的长大于k-1。增加xm=yn到W,我们得到一个长大于k的X与Y的公共序列,与Z是LCS矛盾。于是,Zk-1是X
18、m-1与Yn-1的LCS。 由于zkxm,Z是Xm-1与Y的公共子序列。我们来证Z是Xm-1与Y的LCS。设Xm-1与Y有一个公共子序列W,W的长大于k, 则W也是X与Y 的公共子序列,与Z是LCS矛盾。 同可证。证毕 *X和Y的LCS的优化解结构为 LCSXm-1Yn-1+ if xm=yn LCSXY= LCSXm-1Y if xmyn,zkxm LCSXYn-1 if xmyn,zkyn 2.相交子问题 (见下边的递归图)LCSXY LCSXm-1Yn-1 LCSXm-1Y LCSXYn-1LCSXm-2Yn-2 LCSXm-2Yn-1 LCSXm-1Yn-2 LCSXm-2Yn-1 L
19、CSXm-2Y LCSXm-1Yn-1 . *求LCSXm-1Y和LCSXYn-1时都需要LCSXm-1Yn-1 . 3.子问题空间X与Y的LCS问题空间由求X与Y的前缀的LCS问题构成。 由于X的前缀个数为m个,Y的前缀个数为n个,求X与Y 的前缀的LCS问题的个数为m*n个。于是子问题空间的大小 为(m*n)。4.4.3 建立求解LCS长度的递归方程定理1说明: If xm=yn, xm属于X和Y的LCS,须求解Xm-1和Yn-1的LCS。 If xmyn,必须求解须求解Xm-1和Y的LCS以及须求解X和Yn-1 的LCS,长者是X和Y的LCS。 令Ci,j=Xi与Yj的LCS的长度,则
20、0 if i=0或j=0 Ci,j= Ci-1,j-1+1 if i,j0 and xi=yj Max(Ci,j-1,Ci-1,j) if i,j0 and xiyj4.4.4 LCS长度的计算 1基本思想 计算Ci,j需先计算Ci-1,j-1、Ci,j-1、Ci-1,jCi-1,j-1Ci-1,jCi,j-1Ci,j 先计算出第0行与第0列,然后逐行计算。 2算法 数据结构 C0:m,0:n: Ci,j是Xi与Yj的LCS的长度 B1:m,1:n: Bi,j是指针,指向计算Ci,j时所选择的 子问题的优化解所对应的C表的表项。 算法 LCS-length(x,y) mlength(x);nl
21、ength(y); For i1 To m Do Ci,00; For j1 To n Do C0,j0; For i1 To m Do For j1 To n Do If xi=yj Then Ci,jCi-1,j-1+1;Bi,j“”; Else If Ci-1,jCi,j-1 Then Ci,jCi-1,j; Bi,j“”; Else Ci,jCi,j-1; Bi,j“”; Return C and B.4.4.5.构选优化解-LCS 1. 基本思想 从Bm,n开始按指针搜索, 若Bi,j=“”,则xi=yj是LCS的一个元素。如此找到的“LCS”是X与Y的LCS的Inverse。2算法
22、Print-LCS(B,X,i,j) IF i=0 or j=0 THEN Return; IF Bi,j=“”THEN Print-LCS(B,X,i-1,j-1); Print xi; ELSE If Bi,j=“”THEN Print-LCS(B,X,i-1,j); ELSE Print-LCS(B,X,i,j-1). *Print-LCS(B,X,length(X),length(Y)可打印出x与y的LCS。 例2.I j01234567BDCABA000000001A00001112B01111223C01122224B01122335D01222336A01223347B01223
23、444.5 优化的多边形三角4.5.1. 基本概念 多边形:一个多边形可以表示为顶点坐标的集合P=(v0,v1,.vn+1)或顶点序列 v0v1,.vn-1vn。 定义1.一个多边形是简单的如果除了顶点以外没有任何边交叉点。 定义2.平面上由多边形封闭的点集合称为多边形的内部,多边形上的点集合称为多边形的边界,平面上除多边形内部和边界以外的点集合称为多边形的外部。 定义3.设P是一个多边形。若P的边界或内部的任意两点的连线上的所有点都在P的内部或边界上,则称P是凸多边形。 定义4.多边形P上的任意两个不相邻结点vi、vi+1所对应的 线段vivi+1称为弦。 定义5.(三角剖分) 一个多边形P
24、的三角剖分是将P划分为不相交三角形的弦的集合。 定义6.(优化三角剖分问题) 设S是由多边形P的边和弦构成的三角形集合,W是S上的代价函数。优化三角剖分问题定义为: 输入:多边形P和代价函数W 输出:求一个P的三角分T,使得最小,其中ST是T 所对应的三角形集合。4.5.2 优化三角分的结构分析 设P=(v0,v1,.vn)是n+1点的多边形, Tx是X的优化三角剖分, 则 TP=T(v0, ., vk)T(vk+1, ., vn)v0vk,vkvn4.5.3 优化三角剖分的代价函数 代价函数 设ti,j=的优化三角剖分的代价,则: ti,i=tj,j=0 ti,j= minjkj-1ti,k+tk+1,j+w(vi-1vkvj). 算法 与矩阵链乘法问题一致,把Matrix-chain-Order和Matrix- chain-Multiply 算法略加修改即可计算ti,j并构造优化 三角剖分解。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1