动态规划-最长公共子序列.doc

上传人:桔**** 文档编号:548889499 上传时间:2023-12-18 格式:DOC 页数:4 大小:63.51KB
返回 下载 相关 举报
动态规划-最长公共子序列.doc_第1页
第1页 / 共4页
动态规划-最长公共子序列.doc_第2页
第2页 / 共4页
动态规划-最长公共子序列.doc_第3页
第3页 / 共4页
动态规划-最长公共子序列.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《动态规划-最长公共子序列.doc》由会员分享,可在线阅读,更多相关《动态规划-最长公共子序列.doc(4页珍藏版)》请在金锄头文库上搜索。

1、动态规划-最长公共子序列问题描述一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,k有Xij =Zj例如,序列Z=是序列X=的子序列,相应的递增下标序列为。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=和Y=,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。最长公共子序列(LCS)问题:给定两个序列X=和Y=,要求找出X和Y的

2、一个最长公共子序列。动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法。1. 最长公共子序列的结构解最长公共子序列问题时最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列1, 2, , m的一个子序列,因此,X共有2m个不同子序列,从而穷举搜索法需要指数时间。事实上,最长公共子序列问题也有最优子结构性质,因为我们有如下定理:定理: LCS的最优子结构性质设序列X=和

3、Y=的一个最长公共子序列Z=,则:若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列; 若xmyn且zkxm ,则Z是Xm-1和Y的最长公共子序列; 若xmyn且zkyn ,则Z是X和Yn-1的最长公共子序列。 其中Xm-1=,Yn-1=,Zk-1=。证明用反证法。若zkxm,则是X和Y的长度为k十1的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。因此,必有zk=xm=yn。由此可知Zk-1是Xm-1和Yn-1的一个长度为k-1的公共子序列。若Xm-1和Yn-1有一个长度大于k-1的公共子序列W,则将xm加在其尾部将产生X和Y的一个长度大于k的公共子序列。此为

4、矛盾。故Zk-1是Xm-1和Yn-1的一个最长公共子序列。 由于zkxm,Z是Xm-1和Y的一个公共子序列。若Xm-1和Y有一个长度大于k的公共子序列W,则W也是X和Y的一个长度大于k的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。由此即知Z是Xm-1和Y的一个最长公共子序列。 这个定理告诉我们,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。2. 子问题的递归结构由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾

5、部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xmyn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。与矩阵连乘积最优计算次序问题类似,我们来建立子问题的最优值的递归关系。用ci,j记录序列Xi和Yj的最长公共子序列的长度。其中Xi=,Yj=。当i=0或j

6、=0时,空序列是Xi和Yj的最长公共子序列,故ci,j=0。其他情况下,由定理可建立递归关系如下:3. 计算最优值直接利用上式式容易写出一个计算ci,j的递归算法,但其计算时间是随输入长度指数增长的。由于在所考虑的子问题空间中,总共只有O(m*n)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。X和Y的最长公共子序列的长度记录于cm,n中。由于每个数组单元的计算耗费O(1)时间,算法LCS_LENGTH耗时O(m*n)。4.构造(打印)最长公共子序列5.算法的改进对于一个具体问题,按照一般的算法设计策略设计出的算法,往往在算法的时间和空间需求上还可以改进。这种改进,通

7、常是利用具体问题的一些特殊性。数组元素ci,j的值仅由ci-1,j-1左斜上,ci-1,j 正上和ci,j-1 左三个值之一确定。 Program p8_2(Input, Output);const maxlen=200;var i,j:longint; c:array0.maxlen,0.maxlen of byte; x,y,z:string;begin assign(input,lcs.in); reset(input); assign(output,lcs.out); rewrite(output);readln(x); readln(y); fillchar(c,sizeof(c),

8、0); for i:=1 to length(x) do for j:=1 to length(y) do if xi=yj then ci,j:=ci-1,j-1+1 else if ci-1,jci,j-1 then ci,j:=ci-1,j else ci,j:=ci,j-1; 构造(打印)最长公共子序列 z:=; i:=length(x); j:=length(y); writeln(ci,j); while (i0) and (j0) doif xi=yj then begin z:=xi+z;i:=i-1;j:=j-1 end else if ci-1,jci,j-1 then i

9、:=i-1 else j:=j-1; if z then writeln(z); close(input);close(output)end.另外,如果只需要计算最长公共子序列的长度,则算法的空间需求还可大大减少。事实上,在计算ci,j时,只用到数组c的第i行和第i-1行。因此,只要用2行的数组空间就可以计算出最长公共子序列的长度。更进一步的分析还可将空间需求减至min(m, n)。我们将a的前缀长度i设为阶段(1=i=n),b的前缀长度j设为状态(1=j=n),根据最优子结构的三个性质决策的 LCS长度ci,j。由状态转移方程可以看出,第i阶段的计算仅与第i-1阶段的状态发生联系。为了节省内

10、存,设c0,i 与的LCS长度;c1,j 与的LCS长度。(1=jc0,j then c1,j:=c1,j-1 性质2,3 else c1,j:=c0,j; end; end; writeln(n-c1,n);var x,y,z:string; c:array0.255,0.255of integer; i,j:integer;begin assign(input,lcs11.in);reset(input); assign(output,lcs.out);rewrite(output); readln(x); readln(y); fillchar(c,sizeof(c),0); for i

11、:=1 to length(x) do for j:=1 to length(y) do if xi=yj then begin ci,j:=ci-1,j-1+1; end else if ci-1,jci,j-1 then ci,j:=ci-1,j else ci,j:=ci,j-1; i:=length(x); j:=length(y); writeln(ci,j); z:=; while (i0)and(j0) do begin if xi=yj then begin z:=xi+z;dec(i);dec(j); end else if ci-1,jci,j-1 then dec(i) else dec(j); end; if z then writeln(z); close(input); close(output);end.第 4 页 2009-10-29

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号