找到最长的共同差异子序列

时间:2011-12-07 17:00:06

标签: algorithm

对于两个给定序列,如A和B,如何找到它们中最长公共差异子序列的长度,使得这些序列中相邻元素之间的差异相同。例如,

  

A = {2,4,6,12}

  

B = {4,8,14}

,A和B之间最长的共同差异是{2,6,12}和{4,8,14},因为两者中相邻的temrs的差异是相同的,即

  

{4,6}

所以长度为3。 可以在这里应用最长的常见子序列吗?或者可以解决这个问题的方法是什么? 感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过用列表中最小的元素减去每个列表中的每个元素来转换您的问题。

例如:

  

在A中你得到:min(A)= 2然后A = {0,2,4,10}

     

在B中你得到:min(B)= 4然后B = {0,4,10}

现在您的问题是找到最长的公共子序列。

我想您可以在SO或网络上的任何地方找到解决此问题所需的内容:

Wikipedia article on longest subsequence

希望有所帮助


修改

@Saeed Amiri是对的,当且仅当A和B的最小元素在最长的子序列中时,我的答案才是真的。

所以它给了我一个解决这个问题的新想法:

设D(i,j)为最长子序列的长度,使得A中的最小元素是A(排序)的第i个元素,B中的最小元素是B的第j个元素。

然后

  

D(i,j)= | {A-A(i)}与{B-B(j)} |

相交

(符号:| A | =卡(A))

你需要在i和j上找到D(i,j)的最大值,你知道

  

0℃; = d(I,J)&LT =分钟(| A | -i,| B | -j)

所以如果你发现D(i,j)= min(| A | -i,| B | -j)你不需要测试i',j'这样min(| A | -i) ',| B | -j')< = min(| A | -i,| B | -j)

它不是很有效(在最坏的情况下它是O(n * m))但至少它纠正了我的错误。

它应该有用,

希望有所帮助

答案 1 :(得分:1)

如果push推进,你总是可以尝试将k添加到其中一个序列中的所有元素,然后运行最长的公共子序列,对于所有合理的k值。

如果计算每个序列中每个可能值的出现频率,则可以在与每个k相关联的最长公共子序列上设置上限,方法是,如果所有相等的字符对齐,则计算出匹配的数量。这将允许您从最有希望的k值开始,然后丢弃k的值,这些值到目前为止无法击败最佳答案,而不实际计算它们的最长公共子序列。