在网上查阅到关于算法的改进,摘录如下最长公共子序列问题的改进.doc

在网上查阅到关于算法的改进,摘录如下最长公共子序列问题的改进.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在网上查阅到关于算法的改进,摘录如下最长公共子序列问题的改进.doc

在网上查阅到关于算法的改进,摘录如下: 最长公共子序列问题的改进快速算法 李欣 舒风笛 摘 要 现在几个最常用的解决最长公共子序列(LCS)问题的算法的时间复杂度分别是O(pn),O(n(m-p))。这里m、n为两个待比较字符串的长度,p是最长公共子串的长度。给出一种时间复杂度为O(p(m-p)),空间复杂度为O(m+n)的算法。与以前的算法相比,不管在pm的情况下,还是在p接近m时,这种算法都有更快的速度。 关键词 最长公共子序列 LCS 1 问题介绍与基本定义   最长公共子序列(Longest Common Subsequence,LCS)是将两个给定字符串分别删去零个或多个字符后得到的长度最长的相同字符序列。例如,字符串abcabcabb与bcacacbb的最长公共子序列为bcacabb。LCS问题就是要求两个给定字符串的最长公共子序列。本文给出了一种比较有效的求解LCS问题的算法,它是对Nakatsu的时间复杂度为O(n(m-p))算法的改进。它的时间复杂度是O(p(m-p)),空间复杂度为O(m+n)。   LCS问题的算法有着广泛的应用。最初对LCS问题的研究是将它作为一种差分压缩算法来研究的。例如,在版本管理系统中,一个文件经过不断地修改产生不同的版本,新产生的版本相对老版本变化并不大。为了节省存储空间,我们可以将老文件版本与修改后新版本进行比较,找出它们的相同部分和不同部分。这样就不必将原始文件和修改文件都独立存储,而只需存储老文件版本以及新老版本的不同部分即可。这种增量式存储方法在文件版本较多的情况下能够大大提高存储效率。两个文件版本的比较就类似于LCS问题。LCS算法的时间复杂度与其它差分压缩算法(如Vdelta算法[4])比较相对较高,它也不是压缩比例最高的差分压缩算法,所以现在它已经基本退出了这方面的应用。但在版本管理系统中,对同一文件的不同版本进行比较与合并时,LCS算法还是有重要作用的。   LCS算法还可用在基因工程领域。如确定一种致病基因的基本方法就是将该疾病患者的DNA链与健康者的DNA链相比较,找出其中的相同部分与不同部分,再进行分析。这种基因链的比较也可以用LCS算法来解决。   80年代初期,国外对LCS算法的研究比较多。现在,LCS算法在一些领域有新的应用,所以对它研究又有增长的趋势。   下面先给出一些基本定义:   定义1 子序列(Subsequence)。给定字符串A= A[1]A[2]...A[m],(A[i]是A的第i个字母,A[i]∈字符集∑,1=im=|A|,|A|表示字符串A的长度),字符串B是A的子序列是指B=A[i1]A[i2]...A[ik],其中i1i2...ik且k=m。   也就是说任意删去给定字符串中的零个或多个字符,但不改变剩余字符的顺序就得到了该字符串的一个子序列。例如:bec是abdeace的一个子序列。子序列与子串的区别在于子序列不必是原字符串中的连续字符。   定义2 公共子序列(Common Subsequence)。给定字符串A、B、C,C称为A和B的公共子序列是指C既是A的子序列,又是B的子序列。例如、abd是abcd和bacbd的公共子序列。   定义3 最长公共子序列(Longest Common Subsequence,简称LCS)。给定字符串A、B、C,C称为A和B的最长公共子序列是指C是A和B的公共子序列,且对于A和B的任意公共子序列D,都有|D|=|C|。   两个字符串的LCS不是唯一的。例如A= cbacbaaba,B=abcdbb,C=bcbb和D=acbb,C和D都是A和B的最长公共子序列。   给定字符串A和B,|A|=m,|B|=n,不妨设m=n,LCS问题就是要求出A和B的LCS。 2 几种目前常用的算法 已经证明,LCS问题算法的时间复杂度不可能小于O(m log n)[1]。目前几种比较有效的算法有Hirschberg[2]提出的算法,时间复杂度分别为O(pn),以及nakatsu[3]提出的算法,时间复杂度为O(n(m-p))。   这两种算法以及我们要介绍的改进快速算法都是基于下面几个基本定理:   定义4 给定字符串A=A[1]A[2]...A[m]和字符串B=B[1]B[2]...B[n],A(1: i)表示A的连续子序列A[1]A[2]...A[i],同样B(1: j)表示B的连续子序列B[1]B[2]...B[j]。Li(k)表示所有与字符串A(1:i)有长度为k的LCS的字符串B(1:j)中j的最小值。用公式表示就是Li(k)=Minj(LCS(A(1:i),B(1:j))=k)。   定理1 i∈[1,m],有Li(1)Li(2)Li(3)...   定理2 i∈[1,m-1],(k∈[1

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档