Aquí está el problema de la supercadena más corta: se le dan cadenas s 1 , ... , s n sobre algún alfabeto Σ y desea encontrar la cadena más corta sobre Σ que contiene cada s i como una subsecuencia de caracteres consecutivos, es decir, una subcadena.ns1,…,snΣΣsi
Cuando hablamos de algoritmos exactos para el problema, encontrar la longitud de la supercadena más corta es equivalente a encontrar la compresión máxima C, que es la suma de todas las superposiciones de cadenas consecutivas en la supercadena final, es decir, C = ∑ i | s i | - L .LCC=∑i|si|−L
Hasta donde yo sé, el algoritmo exacto más rápido para las supercuerdas más cortas se ejecuta en ( 2 n ) donde n es el número de cadenas. Este es un algoritmo de programación dinámica simple similar al algoritmo de programación dinámica para la ruta más larga (y otros problemas):O∗2nn
Para cada subconjunto de cadenas y cadena v en S calculamos la compresión máxima sobre todas las supercadenas sobre S donde v es la primera cadena que aparece en la supercadena, almacenando esto como C (( v , S )). Hacemos esto procesando primero todos los subconjuntos con un solo elemento, y luego acumulando los valores de C (( v , S )) para los subconjuntos S en las cadenas k de aquellos en las cadenas k - 1 . Específicamente:SvSSvv,Sv,SSkk−1
uS′k−1uu,u∪S′vS′uvv,S′
n22n+n2l) where l is the maximum string length.
There are better algorithms if you assume that l is small, or the pairwise overlaps are small, the alphabet size is small etc, but I am not aware of any algorithm that's faster than 2n.