Algorithm 求最长公共差子序列

Algorithm 求最长公共差子序列,algorithm,Algorithm,对于两个给定的序列,比如A和B,人们如何找到其中最长的公共差子序列的长度,从而使这些序列中相邻元素之间的差相同。例如如果 A={2,4,6,12} 及 B={4,8,14} ,则A和B之间的最长公共差为{2,6,12}和{4,8,14},因为两者中相邻TEMR的差相同,即 {4,6} 所以长度是3。 这里可以应用最长的公共子序列吗?或者,解决这个问题的方法是什么? 谢谢。您可以通过用列表中最小的元素减去每个列表中的每个元素来转换您的问题 例如: 在A中,你得到:min(A)=2,然后A={0,2

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

A={2,4,6,12}

B={4,8,14}

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

{4,6}

所以长度是3。 这里可以应用最长的公共子序列吗?或者,解决这个问题的方法是什么?
谢谢。

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

例如:

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

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

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

我想您可以在SO或web上的任何地方找到解决此问题所需的工具:

希望能有帮助


编辑

@Saeed Amiri是正确的,我的答案是正确的,当且仅当A和B的最小元素在最长的子序列中

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

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

然后

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

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

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


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

例如:

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

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

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

我想您可以在SO或web上的任何地方找到解决此问题所需的工具:

希望能有帮助


编辑

@Saeed Amiri是正确的,我的答案是正确的,当且仅当A和B的最小元素在最长的子序列中

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

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

然后

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

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

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


0如果push变成了steff,您可以尝试将k添加到其中一个序列中的所有元素,然后运行最长的公共子序列,以获得k的所有合理值


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

如果遇到困难,您总是可以尝试将k添加到其中一个序列中的所有元素,然后运行最长的公共子序列,以获得k的所有合理值


如果计算每个序列中每个可能值出现的频率,则可以通过计算所有相等字符排列时的匹配数,对与每个k相关联的最长公共子序列设置上界。这将允许您从最有希望的k值开始,然后丢弃迄今为止无法超过最佳答案的k值,而不实际计算它们的最长公共子序列。

不删除最小元素不会导致这样的情况:a={0,10,12,20},B={0,20,22,30}最长公共差将是{2,8}长度是3。不移除最小的元素不会导致:A={0,10,12,20},B={0,20,22,30}最长的公共差是{2,8},长度是3。