One - One Code All

Blog Content

最长公共子序列LCS算法

算法   2017-03-11 13:11:07

参考:《算法导论》第三版 15.4节

介绍:

最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。 最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序,比如Diff工具,和生物信息学应用的基础。它也被广泛地应用在版本控制,比如Git用来调和文件之间的改变。


动态规划:

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


算法:

Ax表示序列A的连续前x项构成的子序列,即Ax= a1,a2,……ax, 

By表示序列A的连续前y项构成的子序列,By= b1,b2,……by, 

LCS(x, y)表示它们的最长公共子序列长度,

L(x, y)表示Ax和By的一个最长公共子序列。


结论:

LCS(x,y) = 

(1) LCS(x - 1,y - 1) + 1 如果Ax = By

(2) max(LCS(x – 1, y) , LCS(x, y – 1)) 如果Ax ≠ By

(3) 0 如果x = 0或者y = 0


LCS1.png



上一篇:numba之gdb调试
下一篇:统计分析模块statistics

The minute you think of giving up, think of the reason why you held on so long.