Ecco il problema più corto delle superstringhe: ti vengono date stringhe s 1 , ... , s n sopra un po 'di alfabeto Σ e vuoi trovare la stringa più corta su Σ che contiene ciascuna s i come una sequenza di caratteri consecutivi, cioè una sottostringa.ns1,…,snΣΣsi
Quando parliamo di algoritmi esatti per il problema, trovare la lunghezza della superstring più corta equivale a trovare la massima compressione C che è la somma di tutte le sovrapposizioni di stringhe consecutive nella superstring finale, ovvero C = ∑ i | s i |LC .C=∑i|si|−L
Per quanto ne so, l'algoritmo esatto più veloce per le superstringhe più corte viene eseguito in ( 2 n ) doveO∗2n è il numero di stringhe. Questo è un semplice algoritmo di programmazione dinamica simile all'algoritmo di programmazione dinamica per il percorso più lungo (e altri problemi):n
Per ogni sottoinsieme di stringhe e stringa v in S calcoliamo la massima compressione su tutte le superstringhe su S dove v è la prima stringa che appare nella superstringa, memorizzandola come C (( v , S )). Lo facciamo elaborando prima tutti i sottoinsiemi con un solo elemento, quindi costruendo i valori C (( v , S )) per i sottoinsiemi S su k stringhe da quelli su kSvSSvv,Sv,SSk stringhe. In particolare:k−1
Per ogni stringa osserviamo tutti i sottoinsiemi S ′ su k - 1 stringhe che non includono u e impostiamo il valore per ( u , u ∪ S ′ ) sul massimo sopra le stringhe v in S ′ della somma del massimo sovrapposizione di u con v con C (( v , S ′ )).uS′k−1uu,u∪S′vS′uvv,S′
Il runtime finale non è superiore a O ( ) dove l è la lunghezza massima della stringa.n22n+n2ll
Esistono algoritmi migliori se si presume che sia piccola o che le sovrapposizioni a coppie siano piccole, la dimensione dell'alfabeto sia piccola ecc., Ma non sono a conoscenza di alcun algoritmo che sia più veloce di 2 n .l2n