N序列的最长公共子序列(用于差异目的)

时间:2017-11-01 19:32:24

标签: algorithm diff lcs

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

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

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

我有什么遗失的东西吗?它看起来不像解决N难问题......

我知道用每对字符串调用LCS可能有多个子序列作为解决方案,但是如果我在下一次调用中只使用其中一个子序列作为输入,也许我的最后一个子序列-sequence不是最长的,但我有一些东西可能符合我的需要。

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

1 个答案:

答案 0 :(得分:1)

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

aaabb1xyz
aaabb2xyz
cccdd1xyz
cccdd2xyz

如果您按照给定的顺序对这些进行配对,您将获得aaabbcccdd的LCS,错过了该集的xyz

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

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