Вот кратчайшая проблема суперструн: вам дано строк s 1 , … , s n над некоторым алфавитом Σ, и вы хотите найти самую короткую строку над Σ, которая содержит каждый s i как подпоследовательность последовательных символов, то есть подстроку.ns1,…,snΣΣsi
Когда мы говорим о точных алгоритмах для задачи, нахождение длины самой короткой суперструны эквивалентно нахождению максимального сжатия C, которое является суммой всех последовательных перекрытий строк в конечной суперструне, то есть C = ∑ i | с я | - L .LCC=∑i|si|−L
Насколько я знаю, самый быстрый точный алгоритм для самой короткой суперструны работает в ( 2 n ), где n - количество строк. Это простой алгоритм динамического программирования, аналогичный алгоритму динамического программирования для самого длинного пути (и других задач):O∗2nn
Для каждого подмножества строк и строки v в S мы вычисляем максимальное сжатие по всем суперструнам по S, где v - первая строка, появляющаяся в суперструне, сохраняя ее как C (( v , S )). Мы делаем это, сначала обрабатывая все подмножества только с одним элементом, а затем собирая значения C (( v , S )) для подмножеств S в k строках из тех, что в k - 1 строках. В частности:SvSSvv,Sv,SSkk−1
Для каждой строки мы рассматриваем все подмножества S ′ на k - 1 строках, которые не включают в себя u, и устанавливаем значение для ( u , u ∪ S ′ ) максимального значения над строками v в S ′ суммы максимума перекрытие U с V с C (( VuS′k−1uu,u∪S′vS′uv )).v,S′
Конечное время выполнения не более O ( n22n+n2l ), где - максимальная длина строки.l
Есть лучшие алгоритмы, если вы предполагаете, что мало, или попарные наложения малы, размер алфавита маленький и т. Д., Но я не знаю ни одного алгоритма, который быстрее, чем 2 n .l2n