确定LCS算法中的子序列是什么

时间:2013-11-22 19:13:24

标签: algorithm lcs

我上周一直在研究LCS问题,我有一个问题。

每当我们也有兴趣找到最长的子序列本身(而不仅仅是它的长度)时,我们创建一个辅助(string1.length X string2.length)矩阵,通过向上箭头,左箭头确定子序列是什么或对角线箭头,对应于我们来自哪里,所以我们可以稍后回溯我们的步骤并找到子序列本身。

(参见示例:最后一页的http://www.columbia.edu/~cs2035/courses/csor4231.F13/lcs.pdf

我的问题是: 考虑以下输出矩阵来运行这两个字符串:“abfcytyruc”和“vxczcxabfc”通过LCS:

- 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 1 1 1
- 0 0 0 0 0 0 0 1 2 2 2
- 0 0 0 0 0 0 0 1 2 3 3
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 1 1 1 2 3 4
- 0 0 0 1 1 2 2 2 2 3 4

我们是否可以根据矩阵中的最后一列找到公共子序列,而不需要更多的空间复杂度?

1 个答案:

答案 0 :(得分:0)

使用简单的动态编程方法(如上所述)时,您只能确定最后一列的LCS长度,而不是实际序列。

这是一个失败的例子:

  a a a a a c b b
c 0 0 0 0 0 1 1 1
b 0 0 0 0 0 1 2 2
b 0 0 0 0 0 1 2 3
a 1 1 1 1 1 1 2 3
a 1 2 2 2 2 2 2 3
a 1 2 3 3 3 3 3 3
a 1 2 3 4 4 4 4 4

看看Hirschberg算法。它是Needleman-Wunsch算法的分而治之适应,适用于线性空间。

进一步阅读:http://www.akira.ruc.dk/~keld/teaching/algoritmedesign_f03/Artikler/05/Hirschberg75.pdf