我上周一直在研究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
我们是否可以根据矩阵中的最后一列找到公共子序列,而不需要更多的空间复杂度?
答案 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