【问题标题】:Longest Common Sub-sequence of N sequences (for diff purposes)N个序列的最长公共子序列(用于不同目的)
【发布时间】:2017-11-01 19:32:23
【问题描述】:

我想找到 N 个字符串中最长的公共子序列。我得到了对 2 个字符串使用动态编程的算法,但是如果我将其扩展到 N,它将消耗指数量的内存,因为我需要一个 N 维数组。这不是一个选项。

在一般情况下(90%),几乎所有字符串都是相同的。

如果我尝试将我的 N 个序列分解为 N/2 对,每对 2 个字符串,为每对分别运行 2 个字符串的 LCS,我将有 N/2 个子序列。我可以删除重复项并重复此过程,直到我只有一个子序列,这是输入中所有字符串共有的。

我有什么遗漏的吗?它看起来不像 N-hard 问题的解决方案......

我知道每对字符串对 LCS 的每次调用都可能有多个子序列作为解决方案,但如果我只将其中一个子序列用作下一次调用中的输入,那么可能是我的最后一个子序列-sequence 不是最长的,但我有一些可能适合我的需求。

如果我尝试对一对使用所有可能的解决方案,然后将其与另一对的所有可能解决方案结合起来(它们中的每一个也可能有多个),我可能会以指数时间结束。我说的对吗?

【问题讨论】:

    标签: algorithm diff lcs


    【解决方案1】:

    是的,您错过了正确性:无法保证一对字符串的 LCS 与整个集合的 LCS 有任何重叠。考虑这个例子:

    aaabb1xyz
    aaabb2xyz
    cccdd1xyz
    cccdd2xyz
    

    如果您按照给定的顺序将它们配对,您将获得 aaabbcccdd 的 LCS,缺少该组的 xyz

    如果,如您所说,字符串几乎都是相同的,那么差异对您来说可能不是问题。如果不相同的字符串与“中位数”字符串非常相似,那么您的增量解决方案将足以满足您的目的。

    另一种可能性是对随机的字符串对进行 LCS,直到出现中间字符串;然后你从那个共同点开始,你应该有一个“足够好”的解决方案。

    【讨论】:

    • 感谢您的回答,但我认为您对最长公共子字符串问题感到困惑。来自维基百科:“与子串不同,子序列不需要占据原始序列中的连续位置”
    • 因此,在您的示例中,第一对中的 LCS 为 aaabbxyz,第二对中的 LCS 为 cccddxyz,最后的 LCS xyz
    • 哦......“顺序”的不同语义。明白了。在那种情况下,我的反例不是反例。
    • 不过,您仍然是对的。 (xaaabbbx,aaaxxbbb) -> aaabbb and (xcccdddx, cccxxddd) -> cccddd,但是4个的LCS都是xx
    • @MattTimmermans:谢谢。我可以看到还有另一个反例,但没有足够的大脑带宽来开发它。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2011-02-25
    相关资源
    最近更新 更多