- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《算法CS,所有的最长公共子序列
所有的最长公共子序列(LCS)问题描述子序列的概念: 设X = x1, x2,┅, xm,若有1≤i1i2 ┅ ik≤m,得Z= z1, z2,┅, zk = xi1, xi2,┅, xik,则称Z是X的子序列,记为ZX。e.g. X=A,B,C,B,D,A,B, Z=B,C,B,A, 则有ZX。公共子序列的概念:设X,Y是两个序列,且有ZX和ZY,则称Z是X和Y 的公共列。最长公共子序列的概念:若ZX,ZY,且不存在比Z更长的X和Y 的公共子序列,则称Z是X和Y 的最长公共子序列,记为ZLCS(X , Y)。但是LCS不是只有一个,最长公共子序列往往不止一个。e.g. X=A,B,C,B,D,A,B, Y=B,D,C,A,B,A, 则Z=B,C,B,A, Z’=B,C,A,B, Z’’=B,D,A,B均属于LCS(X , Y) ,即X,Y有3个LCS。本文描述如何寻找所有的LCS二、问题分析①先描述寻找一个LCS的思想:记Xi=﹤x1,…,xi﹥即X序列的前i个字符 (1≤i≤m)(前缀)Yj=﹤y1,…,yj﹥即Y序列的前j个字符 (1≤j≤n)(前缀)假定Z=﹤z1,…,zk﹥∈LCS(X , Y)。若xm=yn(最后一个字符相同),则不难用反证法证明:该字符必是X与Y的任一最长公共子序列Z(设长度为k)的最后一个字符,即有zk = xm = yn。且显然有Zk-1∈LCS(Xm-1 , Yn-1)即Z的前缀Zk-1是Xm-1与Yn-1的最长公共子序列。若xm≠yn,则亦不难用反证法证明:要么Z∈LCS(Xm-1, Y),要么Z∈LCS(X , Yn-1)。由于zk≠xm与zk≠yn其中至少有一个必成立,因此:若zk≠xm则有Z∈LCS(Xm-1 , Y),若zk≠yn 则有Z∈LCS(X , Yn-1)。∴若xm=yn,则问题化归成求Xm-1与Yn-1的LCS,(LCS(X , Y)的长度等于LCS(Xm-1 , Yn-1)的长度加1) 若xm≠yn,则问题化归成求Xm-1与Y的LCS及X与Yn-1的LCSLCS(X , Y)的长度为:Max {LCS(Xm-1 , Y)的长度, LCS(X , Yn-1)的长度}求LCS(Xm-1 , Y)的长度与LCS(X , Yn-1)的长度这两个问题不是相互独立的:∵两者都需要求LCS(Xm-1,Yn-1)的长度,因而具有重叠性。此外,两个序列的LCS中包含了两个序列的前缀的LCS,故问题具有最优子结构性质 考虑用动态规划法。引进一个二维数组C,用C[i,j]记录Xi与Yj的LCS的长度。 如果我们是按行、列的序号从小到大地进行递推计算,(从第1行开始计算:C[1,1]、C[1,2]、。。。C[1,n],再算C[2,1]、C[2,2]、。。。C[2,n],。。。。。。。。最后计算C[m,1]、C[m,2]、。。。C[m,n],最后算出的C[m,n]即为LCS(X , Y)的长度。)那么在计算C[i,j]之前,C[i-1,j-1], C[i-1,j]与C[i,j-1]均已计算出来。此时根据X[i]=Y[j]还是X[i]Y[j],就可以计算出C[i,j]:若X[i]=Y[j],则执行C[i,j]←C[i-1,j-1]+1;若X[i]Y[j],进行下述判断:若C[i-1,j]≥C[i,j-1]则C[i,j]取C[i-1,j];否则C[i,j]取C[i,j-1]。即有C[i,j]=为了构造出LCS,使用一个mn的二维数组b,b[i,j]记录C[i,j]是通过哪一个子问题的值求得的,以决定搜索的方向:若X[i]=Y[j],则b[i,j]中记入“↖”(亦可不记);若X[i]Y[j]且C[i-1,j] ≥ C[i,j-1],则b[i,j]中记入“↑”;若X[i]Y[j]且C[i-1,j] C[i,j-1],则b[i,j]中记入“←”;e.g. 对于X=A,B,C,B,D,A,B,Y=B,D,C,A,B,A,求出的各个C[i,j]与b[i,j]如下图: 0 1 2 3 4 5 6 yj B D C A B A0 xi 00 0 0 0 0 0 ↑ ↑ ↑↖ ↖1 A 0 0 00 1←1 1 ↖↑↖ 2 B 01←1←1 1 2←2 ↑ ↑↖↑ ↑3 C 01 1 2 ←22 2 ↖ ↑ ↑ ↑↖ 4 B 01 1 2 2 3←3 ↑↖ ↑ ↑ ↑ ↑5 D 01 22 2 3 3 ↑ ↑ ↑↖ ↑↖6 A 01 22 33 4 ↖ ↑ ↑ ↑↖ ↑7 B 01 22 3 4 4②找出所有路径的思想:仅用“↑” ,“←” ,“↖”是搜索不到所有的LCS的,因为
文档评论(0)