Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将最长公共子序列缩减为最长递增子序列_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 将最长公共子序列缩减为最长递增子序列

Algorithm 将最长公共子序列缩减为最长递增子序列,algorithm,dynamic-programming,Algorithm,Dynamic Programming,如果最多有一个序列重复,我们可以将最长公共子序列问题简化为最长递增子序列问题。减少问题的过程如下所述: 假设您拥有以下序列: S1 = {D, B, A, C, E} S2 = {E, Z, X, D, A, Y, C} 然后,创建一个整数序列S3,其中必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,则忽略该元素)。在示例中: S3 = {4, 0, 2, 3} // Z, X and Y in S2 where ignored 然后,只需在S3中找到LIS。要找到原始元素,只

如果最多有一个序列重复,我们可以将最长公共子序列问题简化为最长递增子序列问题。减少问题的过程如下所述:

假设您拥有以下序列:

S1 = {D, B, A, C, E}
S2 = {E, Z, X, D, A, Y, C}
然后,创建一个整数序列S3,其中必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,则忽略该元素)。在示例中:

S3 = {4, 0, 2, 3}
// Z, X and Y in S2 where ignored
然后,只需在S3中找到LIS。要找到原始元素,只需使用LIS中的整数作为S1的索引。例如,在这种情况下,S3的LIS是
{0,2,3}
,其中表示序列
{D,A,C}


这种方法是如何工作的?为什么这种简化解决了查找最长公共子序列的问题?

考虑到如何构建S3,可以保证S3的元素“仅和所有”指向S1和S2的公共元素

通过使用位置并查找最长的递增的子序列,您可以确保找到的是原始S1和S2的子序列,而不仅仅是它们的共同元素数:

  • 这将是S1的子序列,因为S3中元素的数值编码S1中的位置,因此增加S3的子序列=S1的子序列
  • 它将是S2的子序列,因为S3元素中编码的元素与S2元素的顺序相同,因此S3的子序列=S2的子序列
因此,S3的最长递增子序列将“编码”:

  • S1的子序列
  • S2的子序列
  • 仅包含S1和S2中存在的元素的序列
  • 最长的子序列
i、 e.S1和S2之间的最长公共子序列

您可以使用所描述的过程对其进行“解码”,即使用索引=S3元素的S1元素

注意:正如链接中指出的,这仅在最多一个序列有重复时有效,并且在构建S3时,应将没有重复的序列作为S1


这似乎与更常见的相反。

请您解释一下这一部分:“这将是S2的子序列,因为S3元素中编码的元素与S2元素的顺序相同,因此S3的子序列=S2的子序列”。谢谢通过按顺序获取S2的每个元素来构建S3,如果它也存在于S1中,则将其添加到S3(已编码)。这意味着S3只是S2,删除了一些编码形式的元素(非公共元素);因此,S3的每个子序列必然编码S2的子序列。这不适用于S1:S3的子序列可能不编码S1的子序列。这就是为什么对于S1,我突出显示了递增部分,而对于S2,我突出显示了最长递增子序列的子序列部分。