最长公共子序列

✍ dations ◷ 2025-04-05 00:33:56 #算法,动态规划,组合数学,多项式时间问题,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

相关

  • 艾哈迈达巴德बाप तहसील घंटियाली 大城市艾哈迈达巴德(Ahmedabad),又译阿麦达巴,在郑和下西洋时译称阿拨巴丹,是印度西北与古吉拉特邦的第一大城、全国第七大城,以素食闻名印
  • 负折射率负折射(英语:Negative refraction)指的是光束在界面处的折射方向与正常折射方向(正常的折射光线与入射光线在法线异侧)相反,即折射光线和入射光线位于法线同侧的电动力学现象。用
  • 瓦尔特·乌布利希苏联:瓦尔特·乌布利希(德语:Walter Ulbricht,1893年6月30日-1973年8月1日),德国政治家、共产主义者。他亦是首位东德领导人(统一社会党第一书记)。乌布利希在莱比锡出生。他的父亲
  • 城市维护建设税城市维护建设税(简称城建税),是在中国大陆境内地区征收的一种用于市政建设维护的税种,其征收的主要依据于1985年2月8日由中华人民共和国国务院颁布施行的《城市维护建设税暂行条
  • 封装内系统封装内系统(System in Package, SiP)为一种封装的概念,是将一个系统或子系统的全部或大部分电子功能配置在集成型衬底内,而芯片以2D、3D的方式接合到集成型衬底的封装方式。SIP
  • 阿葰·卡浦尔阿葰·卡浦尔(印地语:श्रद्धा कपूर,英语:Arjun Kapoor,1985年6月26日-)是印度宝莱坞男演员。在2012年以电影《Ishaqzaade》出道之前,他曾经担任助理导演及助理监制。《I
  • 文化素养文化素养是用优势文化中的习语、隐喻和非正式内容流利交谈的能力。从熟悉的街道路标,到历史出处的知识,再到理解最近的俚语,文化素养需要理解文化的相互影响并作出反应。社会成
  • 奥莉薇·瑟尔比奥莉薇•瑟尔比(英语:Olivia J. Thirlby,1986年10月6日-)是一位美国女演员。她最为人熟知的角色包括奥斯卡获奖影片《朱诺》(2007)中的里娅、《至暗之时》(2011)中的娜塔莉和《超时空
  • 教宗安日纳二世教宗安日纳二世(拉丁语:Eugenius PP. II;?-827年8月)于824年2月至5月-827年8月为教宗。
  • 雷蒙·斯鲁伊特瑞曼·斯鲁伊特(Raemon Sluiter,1978年4月13日-)是一位荷兰职业网球运动员,1996年转为职业球员。2010年,他宣布退役。退役后,他转型担任教练,2015年,他成为基基·贝尔腾斯的教练。