【问题标题】:How to calculate the number of longest common subsequences如何计算最长公共子序列的数量
【发布时间】:2010-02-11 15:13:55
【问题描述】:

我正在尝试计算两个字符串之间存在的最长可能子序列的数量

例如 字符串 X = "efgefg"; 字符串 Y = "efegf";

输出:最长公共序列数为:3 (即:efeg, efef, efgf——这个不需要算法计算,这里只是演示)

我已经设法在 O(|X|*|Y|) 中使用基于这里一般思想的动态编程:Cheapest path algorithm

任何人都可以想出一种方法来更高效地进行此计算吗?

--根据 Jason 的评论进行编辑。

【问题讨论】:

  • 这些看起来是子序列而不是子字符串。请澄清。
  • 我不确定我理解你在计算什么。使 efeg、efef、efgf 成为所有有效解决方案的规则是什么?我想你不能重新排列字符的顺序,而只能删除一些?这两个字符串是否应该是完全通用的,例如,您可能有“X=AAAAAAAAAAAAAAAAAAAAAAAAA”和“Y=B”,在这种情况下答案是 0?
  • @p.marino:正确。您不能重新排列顺序,但可以删除字母。在你的例子中答案是 0。
  • 对于 X=AAAAAAAAAAAAAAAAAA 和 Y=B,最长公共子序列的数量不应该是 1 吗?有一个长度为 0 的公共子序列,它是最长的。

标签: algorithm lcs


【解决方案1】:

最长公共子序列问题是一个经过充分研究的 CS 问题。

您可能想在这里阅读:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

【讨论】:

    【解决方案2】:

    我不知道,但这里有一些大声思考的尝试:

    我能够构建的最坏情况具有指数 - 2**(0.5 |X|) - 最长公共子序列的数量:

    X = "aAbBcCdD..."
    Y = "AaBbCcDd..."
    

    其中最长的公共子序列恰好包括 {A, a} 之一,恰好包括 {B, b} 之一等等......(挑剔:如果您的字母限制为 256 个字符,这最终会分解 - 但是2**128 已经很大了。)

    但是,您不一定必须生成所有子序列才能对它们进行计数。 如果你有 O(|X| * |Y|),那么你已经比这更好了!我们从中学到的是任何比你更好的算法都不能尝试生成实际的子序列

    【讨论】:

      【解决方案3】:

      首先,我们确实知道,除非强指数时间假设失败,否则无法在 O(n2-ε) 时间内找到长度为 n 的两个序列的任何最长公共子序列,请参阅: https://arxiv.org/abs/1412.0348

      这几乎意味着您无法计算如何在 O(n2-ε) 时间内将公共子序列与输入序列对齐的方法数量。 另一方面,可以在 O(n2) 时间内计算这种对齐方式的数量。也可以在 O(n2/log(n)) 时间内用所谓的四俄罗斯人加速来计算它们。

      现在真正的问题是您是否真的打算计算这个或者您想要找到 不同 子序列的数量?恐怕后者是一个#P-complete 计数问题。至少,我们确实知道计算常规语法可以生成的给定长度的序列数是#P-complete:

      S。 Kannan、Z. Sweedyk 和 S. R. Mahaney。数数 和随机生成常规语言的字符串。 在 ACM-SIAM 离散算法研讨会上 (苏打水),第 551-557 页,1995 年

      从某种意义上说,这是一个类似的问题,计算常规语法可以生成给定长度的序列的方式的数量是一种简单的动态规划算法。但是,如果您不想区分产生相同序列的世代,那么问题就会从简单变为极其困难。我的自然猜想是序列比对问题也应该是这种情况(最长公共子序列、编辑距离、最短公共超串等)。

      因此,如果您想计算两个序列的不同子序列的数量,那么您当前的算法很可能是错误的,并且任何算法都无法在多项式时间内计算它,除非 P = NP(以及更多...)。

      【讨论】:

        【解决方案4】:

        我找到的最佳解释(带代码):

        Count all LCS

        【讨论】:

        • 请在此处详细说明您的回答,而不是简单地包含外部链接。
        • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
        猜你喜欢
        • 1970-01-01
        • 2011-03-01
        • 2012-12-11
        • 2011-02-12
        • 2011-04-09
        • 1970-01-01
        • 2011-02-25
        • 2013-02-13
        相关资源
        最近更新 更多