【问题标题】:Reducing Longest common subsequence to Longest increasing Subsequence将最长公共子序列减少为最长递增子序列
【发布时间】:2016-04-11 21:31:03
【问题描述】:

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

假设你有序列:

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}

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

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    根据您构建 S3 的方式,可以保证 S3 的元素“仅”指向 S1 和 S2 的公共元素。

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

    • 它将是 S1 的子序列,因为 S3 中元素的数值编码了 S1 中的位置,所以 增加 S3 的子序列 = S1 的子序列
    • 它将是S2的子序列,因为S3的元素中编码的元素与S2的元素顺序相同,所以S3的子序列 = S2的子序列

    因此,S3的最长递增子序列将“编码”:

    • S1 的子序列
    • S2 的子序列
    • 仅包含 S1 和 S2 中存在的元素的序列
    • 此类子序列中最长的一个

    即S1和S2之间的最长公共子序列

    您可以使用所描述的过程“解码”,即使用索引 = S3 的元素获取 S1 的元素。

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

    这似乎与更常见的reduction of LIS to LCS 相反。

    【讨论】:

    • 能否请您解释一下这部分:“这将是 S2 的子序列,因为在 S3 的元素中编码的元素与 S2 的元素的顺序相同,因此 S3 的子序列 = S2”。谢谢!
    • 您通过按顺序获取 S2 的每个元素来构建 S3,如果它也存在于 S1 中,则将其添加到 S3(编码)。这意味着 S3 只是 S2 以编码形式删除了一些元素(非常见元素);因此 S3 的每个子序列必然编码 S2 的子序列。这不适用于 S1:S3 的子序列可能不编码 S1 的子序列。这就是为什么对于 S1 我突出了 increasing 部分,而对于 S2 我突出了最长增加子序列的 subsequence 部分。
    猜你喜欢
    • 2011-03-01
    • 2016-05-02
    • 2013-07-03
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多