【问题标题】:The longest common sub sequence algorithm最长公共子序列算法
【发布时间】:2012-06-25 13:09:28
【问题描述】:

我正在研究 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得到一个共同的 XY 的子序列,长度为 k + 1,与 Z 的假设相矛盾 XY 的最长公共子序列。因此,我们必须有zk = xm = yn

现在,前缀 Zk−1length-(k − 1) 的公共子序列 Xm−1Yn−1。 我们希望证明它是 LCS。假设为了矛盾的目的 Xm−1Yn−1 的公共子序列 W 的长度大于 k−1。 然后,将xm = yn 附加到W 会产生XY 的公共子序列 其长度大于k,这是矛盾的。

(2) 如果zk != xm,那么ZXm−1Y 的公共子序列。如果有一个 Xm−1Y 的公共子序列 W 的长度大于 k,那么 W 将 也是XmY 的公共子序列,这与Z 的假设相矛盾 是 XY 的 LCS。

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

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

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    请通过以下链接的重复部分:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2011-04-09
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2011-02-25
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多