1、DB-LAB(2003),第四章Dynamic Programming技术,骆吉洲 计算机科学与工程系,DB-LAB(2003),4.1 Elements of Dynamic Programming 4.2 Matrix-chain multiplication 4.3 Longest Common Susequence 4.4 凸多边形的三角剖分 4.5 0/1 Knapsack Problem 4.6 The Optimal binary search trees,提要,DB-LAB(2003),参考资料,Introduction to Algorithms第15章: 15.2, 15.
2、3, 15.4, 15.5 计算机算法设计与分析第3章: 3.1, 3.3, 3.5, 3.10, 3.11网站资料第四章,DB-LAB(2003),4.1 Elements of Dynamic Programming,Why? What? How?,DB-LAB(2003),Divide-and-conquer技术的问题 子问题是相互独立的 如果子问题不是相互独立的,分治方法将重复计算公共子问题,效率很低 优化问题 给定一组约束条件和一个代价函数,在解空间中搜索具有最小或最大代价的优化解 很多优化问题可分为多个子问题,子问题相互关联,子问题的解被重复使用,Why?,DB-LAB(2003)
3、,Dynamic Programming特点 把原始问题划分成一系列子问题 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间 自底向上地计算 适用范围 一类优化问题:可分为多个相关子问题,子问题的解被重复使用,What?,DB-LAB(2003),使用Dynamic Programming的条件 Optimal substructure(优化子结构) 当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构。 缩小子问题集合,只需那些优化问题中包含的子问题,减低实现复杂性 优化子结构使得我们能自下而上地完成求解过程 Subteties(
4、重叠子问题) 在问题的求解过程中,很多子问题的解将被多次使用,How?,DB-LAB(2003),Dynamic Programming算法的设计步骤 分析优化解的结构 递归地定义最优解的代价 自底向上地计算优化解的代价保存之,并获取构造最优解的信息 根据构造最优解的信息构造优化解,DB-LAB(2003),4.2 Matrix-chain Multiplication,DB-LAB(2003),输入:, Ai是矩阵 输出:计算A1A2.An的最小代价方法,问题的定义,矩阵乘法的代价/复杂性: 乘法的次数若A是pq矩阵,B是qr矩阵,则AB 的代价是O(pqr),DB-LAB(2003),矩阵
5、链乘法的实现 矩阵乘法满足结合率。 计算一个矩阵链的乘法可有多种方法: 例如, (A1A2A3A4)=(A1(A2(A3A4)=((A1A2)(A3A4))= ((A1A2)A3)A4),Motivation,DB-LAB(2003),矩阵链乘法的代价与计算顺序的关系 设A1=10100矩阵, A2=1005矩阵, A3=550矩阵T(A1A2)A3)=101005+10550=7500T(A1(A2A3)=100550+1010050=750000,结论: 不同计算顺序有不同的代价,DB-LAB(2003),p(n)= 1 if n=1 p(n)= if n1p(n)=C(n-1)=Cata
6、lan数= = (4n/n3/2),矩阵链乘法优化问题的解空间 设p(n)=计算n个矩阵乘积的方法数p(n)的递归方程,(A1 Ak)(Ak+1An),如此之大的解空间是无法用枚举方法求出最优解的!,DB-LAB(2003),下边开始设计求解矩阵链乘法问题的Dynamic Programming算法,分析优化解的结构 递归地定义最优解的代价 自底向上地计算优化解的代价保存之,并获取构造最优解的信息 根据构造最优解的信息构造优化解,DB-LAB(2003),两个记号 Ai-j=AiAi+1Aj cost(Ai-j )=计算Ai-j的代价 优化解的结构 若计算A1n的优化顺序在k处断开矩阵链, 即
7、A1n=A1kAk+1n,则在A1n的优化顺序中,对应于子问题A1k的解必须是A1-k的优化解,对应于子问题Ak+1n的解必须是Ak+1n的优化解,分析优化解的结构,具有优化子结构: 问题的优化解包括子问题优化解,DB-LAB(2003),子问题重叠性,A1A2A3A4,(A1)(A2A3A4),(A1A2)(A3A4 ),(A1A2 A3)(A4 ),具有子问题重叠性,(A3A4),(A3A4),(A1A2 ),(A1A2),DB-LAB(2003),假设 mi, j = 计算Aij的最小乘法数 m1, n = 计算A1n的最小乘法数 A1 . Ak Ak+1 An 是优化解(k实际上是不可
8、预知) 代价方程 mi, i = 计算Ai i 的最小乘法数= 0 mi, j = mi, k + mk+1, j + pi-1pkpj 其中, pi-1pkpj是计算AikAk+1j所需乘法数, Ai k和Ak+1 j分别是pi-1pk和pkpj矩阵.,递归地定义最优解的代价,DB-LAB(2003),考虑到所有的k,优化解的代价方程为mi, j= 0 if i=jmi, j= minikj mi, k+mk+1, j+pi-1 pk pj if ij,DB-LAB(2003),自底向上计算优化解的代价,mi, j= mini k j mi, k + mk+1, j + p0 pk p5 ,
9、m1,5,m1,1,m4,4,m5,5,m2,2,m3,3,m4,5,m3,4,m2,3,m1,2,m1,3,m2,4,m3,5,m1,4,m2,5,DB-LAB(2003),mi, j= mini k j mi, k + mk+1, j + pi-1 pk pj ,m1,5,m1,1,m4,4,m5,5,m2,2,m3,3,m4,5,m3,4,m2,3,m1,2,m1,3,m2,4,m3,5,m1,4,m2,5,DB-LAB(2003),Matrix-Chain-Order(p) n=length(p)-1; FOR i=1 TO n DOmi, i=0; FOR l=2 TO n DO /
10、* 计算地l对角线 */FOR i=1 TO n-l+1 DOj=i+l-1;mi, j=; FOR ki To j-1 DO /* 计算mi,j */q=mi, k+mk+1, j+pi-1pkpjIF qmi, j THEN mi,j=q; Return m.,DB-LAB(2003),Matrix-Chain-Order(p) n=length(p)-1; FOR i=1 TO n DOmi, i=0; FOR l=2 TO n DOFOR i=1 TO n-l+1 DOj=i+l-1;mi, j=; FOR ki To j-1 DOq = mi, k+mk+1, j+pi-1 pk p
11、jIF qmi, j THEN mi,j=q,si,j=k; Return m and s.,获取构造最优解的信息,Si,j记录AiAi+1Aj的 最优划分处在Ak与Ak+1 之间,DB-LAB(2003),Print-Optimal-Parens(s, i, j)IF j=iTHEN Print “A”i; ELSE Print “(”Print-Optimal-Parens(s, i, si, j)Print-Optimal-Parens(s, si, j+1, j)Print “)”,构造最优解,调用Print-Optimal-Parens(s, 1, n) 即可输出A1n的优化计算顺序
12、,Si, j记录Ai Aj的最优划分处; Si, Si,j记录Ai Asi,j的最优划分处; SSi,j+1, j记录Asi,j+1 Aj的最优划分处.,DB-LAB(2003),时间复杂性 计算代价的时间 (l, i, k)三层循环, 每层至多n-1步 O(n3) 构造最优解的时间: O(n) 总时间复杂性为:O(n3) 空降复杂性 使用数组m和S 需要空间O(n2),算法复杂性,DB-LAB(2003),4.3 Longest Common Susequence,问题的定义最长公共子序列 (LCS) 结构分析建立求解LCS长度的递归方程 自底向上LCS长度的计算 构造优化解,DB-LAB(
13、2003),子序列 X=(A, B, C, B, D, B) Z=(B, C, D, B)是X的子序例 W=(B, D, A)不是X的子序例 公共子序列 Z是序列X与Y的公共子序列如果Z是X的子序也是Y的子序列。,问题的定义,DB-LAB(2003),最长公共子序列(LCS)问题输入:X = (x1,x2,.,xn),Y = (y1,y2,.ym) 输出:Z = X与Y的最长公共子序列,DB-LAB(2003),最长公共子序列结构分析,第i前缀 设X=(x1, x2, ., xn)是一个序列,X的第i前缀Xi是一个序列,定义为Xi=(x1, ., xi )例. X=(A, B, D, C, A
14、), X1=(A), X2=(A, B), X3=(A, B, D),DB-LAB(2003),优化子结构 定理1(优化子结构)设X=(x1, ., xm)、Y=(y1, ., yn) 是两个序列,Z=(z1, ., zk)是X与Y的LCS,我们有: 如果xm=yn, 则zk=xm=yn, Zk-1是Xm-1和Yn-1的LCS, 即,LCSXY = LCSXm-1Yn-1+ . 如果xmyn,且zkxm,则Z是Xm-1和Y的LCS,即 LCSXY= LCSXm-1Y 如果xmyn,且zkyn,则Z是X与Yn-1的LCS,即 LCSXY= LCSXYn-1,DB-LAB(2003),证明:. X
15、=, Y=,则LCSXY = LCSXm-1Yn-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。设不然,则存在Xm-1与Yn-1的公共子序列W,W的长大 于k-1。增加xm=yn到W,我们得到一个长大于k的X与Y的 公共序列,与Z是LCS矛盾。于是,Zk-1是Xm-1与Yn-1的 LCS.,DB-LAB(2003), X=, Y=, xmyn,zkxm,则 LCSXY= LCSXm-1Y由于
16、zkxm,Z是Xm-1与Y的公共子序列。我们来 证Z是Xm-1与Y的LCS。设Xm-1与Y有一个公共子序列 W,W的长大于k, 则W也是X与Y 的公共子序列,与 Z是LCS矛盾。 同可证。,DB-LAB(2003),X和Y的LCS的优化解结构为LCSXY=LCSXm-1Yn-1+ if xm=ynLCSXY=LCSXm-1Y if xmyn, zkxmLCSXY=LCSXYn-1 if xmyn, zkyn,DB-LAB(2003),子问题重叠性,LCSXY,LCSXm-1Yn-1,LCSXm-1Y,LCSXYn-1,LCSXm-2Yn-2,LCSXm-2Yn-1,LCSXm-1Yn-2,LC
17、S问题具有子问题重叠性,DB-LAB(2003),建立LCS长度的递归方程,Ci, j = Xi与Yj 的LCS的长度 LCS长度的递归方程Ci, j = 0 if i=0 或 j=0Ci, j = Ci-1, j-1 + 1 if i, j0 and xi = yjCi, j = Max(Ci, j-1, Ci-1, j) if i, j0 and xi yj,DB-LAB(2003),基本思想,自底向上计算LCS的长度,DB-LAB(2003),计算过程,C0,0,C0,1,C0,3,C0,2,C0,4,C1,0,C2,0,C3,0,C1,1,C2,1,C3,1,C1,2,C1,3,C1,
18、4,C2,2,C2,3,C2,4,C3,2,C3,3,C3,4,DB-LAB(2003),计算LCS长度的算法 数据结构C0:m,0:n: Ci,j是Xi与Yj的LCS的长度B1:m,1:n: Bi,j是指针,指向计算Ci,j时所选择的子问题的优化解所对应的C表的表项,DB-LAB(2003),LCS-length(X, Y)mlength(X);nlength(Y);For i1 To m Do Ci,00;For j1 To n Do C0,j0;For i1 To m DoFor j1 To n DoIf xi = yj Then Ci,jCi-1,j-1+1;Bi,j“”; Else
19、If Ci-1,jCi,j-1Then Ci,jCi-1,j; Bi,j“”;Else Ci,jCi,j-1; Bi,j“”; Return C and B.,DB-LAB(2003),基本思想 从Bm, n开始按指针搜索 若Bi, j=“”,则xi=yj是LCS的一个元素 如此找到的“LCS”是X与Y的LCS的Inverse,构造优化解,DB-LAB(2003),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
20、=“” 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。,DB-LAB(2003),时间复杂性 计算代价的时间 (i, j)两层循环,i循环m步, j循环n步 O(mn) 构造最优解的时间: O(m+n) 总时间复杂性为:O(mn) 空降复杂性 使用数组C和B 需要空间O(mn),算法复杂性,DB-LAB(2003),4.4 凸多边形的三角剖分,DB-LAB(2003),多边形 多边形表示为顶点坐标集P=(v0,v1,.vn)或顶
21、点序列v0v1,.vn-1vn 简单多边形 除了顶点以外没有任何边交叉点的多边形 多边形的内部、边界与外部 平面上由多边形封闭的点集合称为多边形内部, 多边形上的点集合称为多边形的边界 平面上除多边形内部和边界以外的点集合称为多边形的外部,问题的定义,DB-LAB(2003),弦 多边形P上的任意两个不相邻结点vi、vi+1所对应的线段vivi+1称为弦 三角剖分 一个多边形P的三角剖分是将P划分为不相交三角形的 弦的集合 优化三角剖分问题 输入:多边形P和代价函数W 输出:求P的三角分T,使得代价sSTW(s)最小,其中ST是T所对应的三角形集合,DB-LAB(2003),设 P=(v0,v
22、1,.vn)是n+1个顶点的多边形 TP是P的优化三角剖分,包含三角形v0vk vn,优化解结构的分析,TP=T(v0, ., vk)T(vk, ., vn)v0vk, vkvn,Vk,DB-LAB(2003),优化三角剖分的代价函数,设 ti,j = 的优化三角剖分代价 ti, i = tj, j = 0ti, j = minikj ti, k + tk+1, j + w(vi-1vkvj ),注意: ti, k = 的优化三角剖分代价 tk+1, j = 的优化三角剖分代价,DB-LAB(2003),与矩阵链乘法问题一致,把算法Matrix-chain-OrderPrint-Optimal
23、-Parens略加修改即可计算ti,j并构造优化三角剖分解,优化三角剖分动态编程算法,DB-LAB(2003),4.5 0/1 Knapsack Problem,DB-LAB(2003),问题的定义,给定n种物品和一个背包,物品i的重量是wi,价值vi, 背包容量为C, 问如何选择装入背包的物品,使装入背包中的物品的总价值最大?对于每种物品只能选择完全装入或不装入,一个物品至多装入一次。,DB-LAB(2003),输入:C0, wi0, vi0, 1 in 输出:(x1, x2, , xn), xi0, 1, 满足1inwi xi C, 1invi xi 最大,等价的整数规划问题max 1 i
24、 n vi xi 1in wixi C xi0, 1, 1 i n,DB-LAB(2003),优化解结构的分析,定理 (优化子结构) 如果(y1, y2, , yn)是0-1背包问题的优化解,则(y2, , yn)是如下子问题的优化解:,max 2 i n vi xi 2in wixi C w1 y1xi0, 1, 2 i n,证明:如果(y2, , yn)不是子问题优化解, 则存在 (z2, , zn)是子问题更优的解。于是, (y1, z2, , zn)是原问题比(y1, y2, , yn)更优解,矛盾。,DB-LAB(2003),建立优化解代价的递归方程,设子问题max i k n vk
25、 xk ikn wkxk jxk0, 1, i k n的最优解代价为m(i, j).即m(i, j)是背包容量为j, 可选物品为i, i+1, , n 时问题最优解的代价.,DB-LAB(2003),递归方程m(i, j) = m(i+1, j) 0 j wim(i, j) = maxm(i+1, j), m(i+1, j-wi)+vi j wim(n, j) = 0 0 j wnm(n, j) = vn j wn,DB-LAB(2003),自底向上计算优化解的代价,计算m(i, j)需要 m(i+1, j-wi)和m(i+1, j),令wi=整数, n=4,m(2,C-w1),m(1,C),
26、m(2,C),m(4, 1),m(3, C-w1-w2),m(3,C-w1),m(4,C-w2),m(4,C-w1),m(4, 6),m(3,C),m(3,C-w2),m(3, 1),m(2, 1),m(4, C-w1-w2),DB-LAB(2003),算法,For j=0 To min(wn-1, C) Domn, j = 0; For j=wn To C Domn, j = vn; For i=n-1 To 2 DoFor j=0 To min(wi -1, C) Domi, j = mi+1, j;For j=wi To C Domi, j=maxmi+1, j, mi+1, j-wi+
27、vi; If Cw1 Then m1, C=m2, C; Else m1, C=maxm2, C, m2, C-w1+v1;,DB-LAB(2003),构造优化解,1. m(1, C)是最优解代价值,相应解计算如下:If m(1, C)=m(2, C) Then x1=0Else x1=1; 2. 如果x1=0, 由m(2, C)继续构造最优解; 3. 如果x1=1, 由m(2, C-w1)继续构造最优解.,DB-LAB(2003),4.6 The Optimal binary search trees,DB-LAB(2003),二叉搜索树T 结点 K=k1, k2, , kn D=d0, d
28、1, , dn di对应区间(ki, ki+1)d0对应区间(-, k1)dn对应区间(kn,+) 附加信息 搜索ki的概率为pi 搜索di的概率为qi,问题的定义,搜索树的期望代价,DB-LAB(2003),问题的定义输入:k=k1, k2, , kn, k1 k2 kn,P=p1, p2, , pn, pi为搜索ki的概率Q=q0, q1, , qn, qi为搜索值di的概率输出:K的二叉搜索树T, E(T)最小,DB-LAB(2003),优化子结构 定理. 如果优化二叉搜索树T具有包含关键字集合ki, ki+1, , kj子树T, 则T必是关于关键字集合ki, ki+1, , kj子问题
29、的优化解. 证明: 若不然,必有关键字集ki, ki+1, , kj子树T,T的期望搜索代价低于T. 用T替换T中的T, 可以得到一个期望搜索代价比T小的原始问题的二叉搜索树, 与T是最优解矛盾.,优化二叉搜索树结构的分析,DB-LAB(2003),用优化子结构从子问题优化解构造优化解 K=ki, ki+1, , kj的优化解的根必为K中某个kr,只要对于每个krK, 确定ki , , kr-1和 kr+1, , kj 的优化解, 我们就可以求出K的优化解.,如果r=i, 左子树ki, , ki-1仅包含di-1 如果r=j, 右子树kr+1, , kj仅包含dj,DB-LAB(2003),令
30、E(i, j)为ki, , kj的优化解Tij的期望搜索代价 当j=i-1时, Tij中只有叶结点di-1, E(i, i-1)=qi-1 当ji时, 选择一个 krki, , kj:,建立优化解的搜索代价递归方程,当把左右优化子树放进Tij时, 每个结点的深度增加1,E(i, j)=Pr + E(左子树)+ W(i, r-1)+ E(右子树)+ W(r+1, j),DB-LAB(2003),由,知,同理,计算W(i, r-1)和W(r+1, j),W(i, j)=W(i, r-1) + W(r+1, j) + Pr,E(i, j) = E(i, r-1) + E(r+1, j) + W(i,
31、 j),DB-LAB(2003),总之E(i, j)=qi-1 If j=i-1E(i, j)=minirj E(i,r-1)+E(r+1,j)+W(i, j) if ji,DB-LAB(2003),E(i, j)=minirj E(i,r-1)+E(r+1,j)+W(i, j),自下而上计算优化解的搜索代价,E(1,4),E(1,0),E(2,4),E(1,1),E(3,4),E(1,2),E(4,4),E(1,3),E(5,4),E(2,1),E(2,2),E(2,3),E(3,3),E(3,2),E(4,3),q4 =,q3 =,q2 =,q1 =,q0 =,DB-LAB(2003),W
32、(i, i-1) = qi-1, W(i, j) = W(i, j-1) + pj + qj,W(1,4),W(1,0),W(2,4),W(1,1),W(3,4),W(1,2),W(4,4),W(1,3),W(5,4),W(2,1),W(2,2),W(2,3),W(3,3),W(3,2),W(4,3),q4 =,q3 =,q2 =,q1 =,q0 =,DB-LAB(2003),算法 数据结构M1:n+1; 0:n: 存储优化解搜索代价W1: n+1; 0:n: 存储代价增量Root1:n; 1:n: root(i, j)记录子问题 ki, , kj优化解的根,DB-LAB(2003),Opti
33、mal-BST(p, q, n)For i=1 To n+1 DoE(i, i-1) = qi-1;W(i, i-1) = qi-1;For l=1 To n DoFor i=1 To n-l+1 Doj=i+l-1;E(i, j)=;W(i, j)=W(i, j-1)+pj+qj;For r=i To j Dot=E(i, r-1)+E(r+1, j)+W(i, j);If tE(i, j)Then E(i, j)=t; Root(i, j)=r;Return E and Root,DB-LAB(2003),作业:优化解的构造算法,DB-LAB(2003),时间复杂性 (l, i, r)三层循环,每层循环至多n步 时间复杂性为O(n3) 空间复杂性 二个(n+1)(n+1)数组,一个nn数组 O(n2),算法的复杂性,