编程之美吧 关注:55贴子:64
  • 0回复贴,共1

编程学习笔记:最长公共子序列

只看楼主收藏回复

问题
给定两个序列 
X = { x1 , x2 , ... , xm } Y = { y1 , y2 , ... , yn }求 X和 Y的一个最长公共子序列(LCS, Longest Common Sequence)
分析
一般典型的解法是利用动态规划,利用如下性质:
若xm = yn ,则 zk = xm = yn,且 Z[k-1] 是 X[m-1] 和 Y[n-1] 的最长公共子序列 
若xm != yn ,且 zk != xm , 则 Z 是 X[m-1]和 Y 的最长公共子序列 
若xm != yn , 且 zk != yn , 则 Z 是 Y[n-1] 和 X 的最长公共子序列 
在一个二维表格上递推:
当 i = 0 , j = 0 时 , c[i][j] = 0 
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
    算法复杂度为 O(mn),辅助空间也需要 O(mn)。后来也又不少改进算法,基本思想是通过发现一些规律,减少在表格上的递推次数。


1楼2009-12-04 11:15回复