最常见的子序列算法

时间:2012-06-25 13:09:29

标签: algorithm dynamic-programming

我正在经历CLRS引入算法中最长的常见子序列问题。但我无法理解它背后的思维过程。解释的大多数其他问题非常直观,我相信我可以在将来解决类似的问题,但我无法想象LCS问题,因为我不理解如何确定最佳子结构背后的逻辑。

本书给出了最优子结构的以下解释

**定理15.1(LCS的最佳子结构)

设X ==和Y ==为序列,设Z =  是X和Y的任何LCS。 1.如果xm = yn,则zk = xm = ynZk−1Xm−1Yn−1的LCS。 2.如果xm != yn,则zk = xm表示ZXm−1Y的LCS。 3.如果xm != yn,则zk = yn表示ZXYn−1的LCS。 证明(1)如果zk != xm,我们可以将xm = yn追加到Z以获得共同点 长度X的{​​{1}}和Y的子序列与k + 1的假设相矛盾 ZX的最长公共子序列。因此,我们必须Y

现在,pre fi x zk = xm = ynZk−1length-(k − 1)的{​​{1}}公共子序列。 我们希望证明它是一个LCS。假设为了矛盾的目的 Xm−1Yn−1的共同子序列W的长度大于Xm−1。 然后,将Yn−1追加到k−1会产生xm = ynW的公共子序列 其长度大于X,这是一个矛盾。

(2)如果Y,则kzk != xmZ的公共子序列。如果有的话 Xm−1的常见子序列Y和长度大于W的{​​{1}},然后Xm−1 也是Yk的共同子序列,与W的假设相矛盾 是XmY的LCS。

(3)证明与(2)对称。**

证据很清楚,但我看不出他们是如何想出最佳子结构的。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

请仔细阅读以下链接的重复部分:

  

https://en.wikipedia.org/wiki/Longest_common_subsequence_problem#LCS_function_defined

这些递归关系只不过是最优的子结构和重叠的子问题等式。