Ось найкоротша проблема суперструнних: вам надається рядків s 1 , … , s n над деяким алфавітом Σ, і ви хочете знайти найкоротший рядок над Σ, який містить кожне s i як послідовність послідовних символів, тобто підрядку.ns1,…,snΣΣsi
Коли ми говоримо про точні алгоритми задачі, то знаходження довжини найкоротшого суперрядка еквівалентно знаходженню максимального стиснення C, що є сумою всіх послідовних перекриттів рядків у підсумковій суперрядці, тобто C = ∑ i | s 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 (( v , S ′ )).uS′k−1uu,u∪S′vS′uvv,S′
Кінцевий час виконання не більше O ( ), де l - максимальна довжина рядка.n22n+n2ll
Є кращі алгоритми, якщо ви припускаєте, що малий або парне перекриття мале, розмір алфавіту невеликий і т. Д., Але мені невідомий жоден алгоритм, який швидше 2 n .l2n