最长公共子序列
1.问题的理解与描述
最长公共子序列(LCS)问题形式化为:
输入:序列X = <x1, x2, ..., xm>
和Y = <y1, y2, ..., yn>
。
输出:X与Y的一个最长公共子序列Z。
X = <x1, x2, ..., xm>
和Y = <y1, y2, ..., yn>
为两个序列,并设Z = <z1, z2, ..., zk>
为X 和Y的任一LCS。 设c[i, j]为子序列Xi和Yj的LCS的长度。根据最长公共子序列问题的最优子结构得出下列递归式:
eg:
3.算法的伪代码描述
LCS-LENGTH (X, Y)
1 m ← length[X]
2 n ← length[Y]
3 for i ← 1 to m
4 do c[i, 0] ← 0
5 for j ← 0 to n
6 do c[0, j] ← 0
7 for i ← 1 to m
8 do for j ← 1 to n
9 do if xi = yj
10 then c[i, j] ← c[i - 1, j - 1] + 1
11 else if c[i - 1, j] ? c[i, j - 1]
12 then c[i, j] ← c[i - 1, j]
13 else c[i, j] ← c[i, j - 1]
15 return c
4.构造一个最优解
PRINT-LCS(c, X, Y, i, j)
1 if i = 0 or j = 0
2 then return
3 if xi = yj
4 then PRINT-LCS (c, X, Y, i - 1, j - 1)
5 print xi
6 elseif c[i - 1, j] ? c[i, j - 1]
7 then PRINT-LCS (c, X, Y, i - 1, j)
8 else PRINT-LCS (c, X, Y, i, j - 1)
5.算法的运行时间
过程LCS-LENGTH的主体是第7~8行两重嵌套的for循环,容易看出其时间复杂度为T(m, n)= Θ(mn),其中m,n分别为X和Y的长度。而过程PRINT-LCS的时间复杂度为T(m, n)= Θ(m+n)。
参考:徐子珊–《算法设计、分析与实现:C、C++和 Java》
原文地址:http://blog.csdn.net/u010177286/article/details/45677603