最长公共子序列

✍ dations ◷ 2025-10-12 19:11:01 #算法,动态规划,组合数学,多项式时间问题,NP完全问题

最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置 。最长公共子序列问题是一个经典的计算机科学问题,也是数据比较(英语:data comparison)程序,比如Diff工具,和生物信息学应用的基础。它也被广泛地应用在版本控制,比如Git用来调和文件之间的改变。

一个数列 S {\displaystyle S} ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S {\displaystyle S} 称为已知序列的最长公共子序列。

对于一般性的LCS问题(即任意数量的序列)是属于NP-hard。但当序列的数量确定时,问题可以使用动态规划(Dynamic Programming)在多项式时间内解决。

最长公共子序列问题存在最优子结构:这个问题可以分解成更小,更简单的“子问题”,这个子问题可以分成更多的子问题,因此整个问题就变得简单了。最长公共子序列问题的子问题的解是可以重复使用的,也就是说,更高级别的子问题通常会重用低级子问题的解。拥有这个两个属性的问题可以使用动态规划算法来解决,这样子问题的解就可以被储存起来,而不用重复计算。这个过程需要在一个表中储存同一级别的子问题的解,因此这个解可以被更高级的子问题使用。

动态规划的一个计算最长公共子序列的方法如下,以两个序列 X {\displaystyle X} Y {\displaystyle Y} 为例子:

设有二维数组 f {\displaystyle f} 表示 X {\displaystyle X} i {\displaystyle i} 位和 Y {\displaystyle Y} j {\displaystyle j} 位之前的最长公共子序列的长度,则有:

其中, s a m e ( a , b ) {\displaystyle same(a,b)} X {\displaystyle X} 的第 a {\displaystyle a} 位与 Y {\displaystyle Y} 的第 b {\displaystyle b} 位完全相同时为“1”,否则为“0”。

此时, f {\displaystyle f} 中最大的数便是 X {\displaystyle X} Y {\displaystyle Y} 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。

该算法的空间、时间复杂度均为 O ( n 2 ) {\displaystyle O(n^{2})} ,经过优化后,空间复杂度可为 O ( n ) {\displaystyle O(n)}


下面算法计算了所有子问题的最长公共子序列长度C

相关

  • 硒酸钠硒酸钠(Sodium selenate)是具有化学式Na2SeO4的无机化合物,区分于亚硒酸钠。 它以无水盐、七水合物和十水合物的形式存在。 它们都是白色水溶性固体。十水合物是混合维生素补
  • 毁灭天使毁灭天使(英语:destroying angel)是鹅膏菌属当中一系列亲缘相近的白色毒菇种类。在美国东部与西部,这个名称指的分别是北美东部毁灭天使(Amanita bisporigera)与赭鹅膏,在欧洲则是
  • 海斯坐标:51°04′18″N 1°05′02″E / 51.0716°N 1.084°E / 51.0716; 1.084海斯(Hythe)是位于英格兰肯特郡南海岸的一个城市。在2011年时,海斯有人口14,516人。许皓翔
  • 热带法西斯主义在非洲的政治哲学中,热带法西斯主义是在后殖民主义国家中,要么被视为法西斯主义,要么被视为具有强烈的法西斯主义倾向。1967年至2005年多哥独裁者纳辛贝·埃亚德马被认为是非洲
  • C·S·刘易斯克利夫·斯特普尔斯·刘易斯(英语:Clive Staples Lewis,1898年11月29日-1963年11月22日),通称C·S·刘易斯(C.S. Lewis)或 鲁益师,其朋友及家人昵称他为杰克(Jack),出生于北爱尔兰首府贝
  • 空隙黑点空隙黑点(Gap Black Spot)为港铁东铁线在部分车站空隙较大或列车与月台高度相差较大的上下车位置,在地面设置的警告标识。此外,金钟站月台地面亦有特别的“请小心月台空隙”警告
  • 加藤和彦加藤 和彦(1947年3月21日-2009年10月17日),出身于京都市伏见区,是一位日本著名的音乐制作人、作曲家及歌手。于1960年代中期与北山修(日语:北山修)、平沼义男、井村干生、芦田雅喜等
  • 安德烈·尼古拉耶维奇·吉洪诺夫安德烈·尼古拉耶维奇·吉洪诺夫 (俄语:Андрей Николаевич Тихонов,转写:Andrey Nikolayevich Tikhonov,1906年10月30日-1993年10月7日),是苏联与俄罗斯数
  • 洛纳尔洛纳尔(Lonar),是印度马哈拉施特拉邦Buldana县的一个城镇。总人口20082(2001年)。该地2001年总人口20082人,其中男性10383人,女性9699人;0—6岁人口3114人,其中男1694人,女1420人;识字
  • Lp范数 L p {\displaystyle L_{p}} -范数(英语: L