Shortest Common Superstring: найти самую короткую строку, содержащую все заданные фрагменты строки

12

Учитывая некоторые строковые фрагменты, я хотел бы найти самую короткую возможную единственную строку («выходная строка»), которая содержит все фрагменты. Фрагменты могут перекрывать друг друга в выходной строке.

Пример:

Для фрагментов строки:

BCDA
AGF
ABC

Следующая выходная строка содержит все фрагменты и была сделана наивным добавлением:

BCDAAGFABC

Однако эта выходная строка лучше (короче), поскольку она использует перекрытия:

ABCDAGF
^
ABC
 ^
 BCDA
    ^ 
    AGF

Я ищу алгоритмы для этой проблемы. Не совсем важно найти строго самую короткую выходную строку, но чем короче, тем лучше. Я ищу алгоритм лучше, чем очевидный наивный, который попытался бы добавить все перестановки входных фрагментов и убрать перекрытия (которые выглядели бы как NP-Complete).

Я начал работу над решением, и оно оказалось довольно интересным; Я хотел бы посмотреть, что другие люди могут придумать. Я добавлю мою работу в этот вопрос через некоторое время.

occulus
источник
3
Проблема, кажется, NP-полная. Если это так, вы не сможете найти полиномиальный алгоритм для определения самой короткой строки, но могут быть полиномиальные алгоритмы, которые дают приблизительные (не самые короткие возможные) решения.
СуперМ
3
Это сообщение в блоге относительно NP-Complete приятно: codinghorror.com/blog/2008/11/…
occulus
Блог действительно хороший, я его все время читаю)))
superM
@superM это достаточно похоже на коммивояжера (каждая строка - город и стоимость между городами = некоторое количество совпадений)
трещотка урод
@ rachet freak, это _ вы могли бы дать небольшую цену между городами, если у них больше общих букв, и самую большую цену, когда у них вообще нет общих букв
superM

Ответы:

14

То, о чем вы спрашиваете, - это проблема Shortest Common Superstring, для которой не существует алгоритма, который бы работал во всех случаях. Но это общая проблема (при сжатии и секвенировании ДНК), и несколько приближенных алгоритмов хорошо известны.

«Жадные» алгоритмы, как правило, считаются наиболее эффективными (например, они имеют наихудший наихудший случай).

Прочтите статью Джонатана Тернера «Алгоритмы аппроксимации для самой короткой общей проблемы суперструн», чтобы получить больше информации.

прецизионный самописец
источник
1
Некоторые соответствующие страницы: update.uu.se/~shikaree/Westling и cs.sunysb.edu/~algorith/files/shortest-common-superstring.shtml
occulus
Хм, обратите внимание, что первая ссылка в моем комментарии чуть выше адреса суперспоследовательностей, а не суперструн! Суперпоследовательность не требует, чтобы все символы в последовательности были смежными.
Occulus
Ваша ссылка мертва.
Маджид