最短公共超级字符串:查找包含所有给定字符串片段的最短字符串


12

给定一些字符串片段,我想找到包含所有片段的最短的单个字符串(“输出字符串”)。片段在输出字符串中可以相互重叠。

例:

对于字符串片段:

BCDA
AGF
ABC

以下输出字符串包含所有片段,并且是通过天真的附加而制成的:

BCDAAGFABC

但是,此输出字符串更好(更短),因为它使用了重叠:

ABCDAGF
^
ABC
 ^
 BCDA
    ^ 
    AGF

我正在寻找解决此问题的算法。找到严格最短的输出字符串并不是绝对重要,但是越短越好。我在寻找一种比明显的幼稚算法更好的算法,该算法会尝试附加输入片段的所有排列并消除重叠(看起来是NP-Complete)。

我已经开始研究解决方案,事实证明这很有趣。我想看看其他人会提出什么。我会在一段时间内将正在进行的工作添加到该问题中。


3
问题似乎是NP完全的。如果是这样,您将根本找不到用于确定最短字符串的多项式算法,但是可能会有多项式算法给出近似(而不是最短的)解。
superM 2012年

3
这对于NP完全的博客文章是好的:codinghorror.com/blog/2008/11/...
occulus

博客真的很好,我一直都在看它)))
superM 2012年

@superM这与旅行推销员非常相似(每个字符串都包含一个城市,且城市之间的成本=一些数字重叠)
棘手的怪胎2012年

@ratchet怪胎,这是_如果城市中有更多普通字母,您可以在城市之间付出很小的代价,而当他们根本没有任何普通字母时,您可以付出最大的代价
superM 2012年

Answers:


14

您要问的是最短公共超字符串问题,没有一种适用于所有情况的算法。但这是一个普遍的问题(在压缩和DNA测序中),并且几种近似算法是众所周知的。

通常公认“贪婪”算法是最有效的(例如,它们的最坏情况最糟)。

阅读乔纳森·特纳(Jonathan Turner)的论文《最短公共超弦问题的近似算法》,了解更多信息。



嗯,请注意,我评论中的第一个链接位于地址的超级序列而不是超字符串!超级序列似乎并不要求序列中的所有字符都是连续的。
occulus 2012年

您的链接已死。
Majid 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.