Conseguenza (sparsa) ripetuta più a lungo in una stringa


26

Dichiarazione di problema informale:

Data una stringa, ad esempio , vogliamo colorare alcune lettere in rosso e alcune in blu (e alcune in nessun caso), in modo tale che leggere solo le lettere rosse da sinistra a destra produca lo stesso risultato della lettura delle sole lettere blu.ACCABBAB

Nell'esempio possiamo colorarli in questo modo:ACCABBAB

Pertanto, diciamo che è una ripetuta di . È anche una sottosequenza ripetuta più lunga (che è facile da controllare).A C C A B B A BCABACCABBAB

Possiamo calcolare efficientemente le sottosequenze ripetute più lunghe?

Domanda formale:

NP è difficile decidere per una stringa e qualche , se nella stringa esiste una sottosequenza ripetuta di lunghezza ?kkk

  • In tal caso: quale problema può essere ridotto a questo problema?
  • In caso contrario: che cos'è un algoritmo efficiente? (ovviamente, questo algoritmo può quindi essere utilizzato per calcolare una sottosequenza ripetuta più lunga)

Domanda bonus:

La loro sarà sempre una sottosequenza ripetuta di lunghezza se la dimensione dell'alfabeto è delimitata da una costante?n/2o(n)

(Questo è noto per gli alfabeti binari.)

Modifica 2: la risposta negativa alla domanda bonus è già nota per alfabeti di dimensioni almeno . In effetti per alfabeti di dimensione Σ , ci sono stringhe con sottosequenze ripetute più lunghe di una lunghezza di solo O (n · Σ ^ {- 1/2}) . Le stringhe casuali sono sufficienti per dimostrarlo. Il risultato esisteva già, ma l'ho trascurato.5ΣO(n·Σ1/2)

Modifica: Nota:

Alcune persone significano "sottostringa" quando dicono "sottosequenza". Io non. Questo non è il problema di trovare due sottostringhe.


Sekti, grazie. Hai ragione: il mio primo commento è stato errato; L'ho ora eliminato. D'altra parte, il mio commento restante si parla di sottosequenze non contigui. Se è risolto, c'è un modo per risolvere il tuo problema (con sottosequenze non contigue, obbligate a non sovrapporsi) in o giù di lì. Ogni sottoproblema dp tiene traccia degli indici di tutte le lettere rosse e di tutte le lettere blu scelte finora. Questo probabilmente non è interessante, perché non ci dice cosa succede quando fa parte dell'input. kO(n2k+2)k
DW

@DW Perché non è possibile rispondere in modo efficace alla domanda formale con questa modifica della sottosequenza comune più lunga? Forse mi manca qualcosa e qualcuno può chiarirmi.
Bryce Kille,

@BryceKille, non lo so; forse può. Se capisci come farlo, spero che tu scriva una risposta!
DW

Risposte:


-2

Questo può essere risolto tempo polinomialecostruendo un grafico cui ciascun nodo rappresenta un punto in una sottosequenza ripetuta di tale che . Bordo tra i nodi e mezzi che può proseguire per formare una sottosequenza ripetuta di lunghezza 2.G(i,j)SS[i]=S[j]uvuv

1. Trova i nodi. Questo può essere fatto in tempo costruendo un elenco ordinato di indici per ciascun carattere , quindi enumerando le coppie univoche. Non ci sono più di nodi.O(n2)cm=n2

2. Trova i bordi. Ci vuole tempo per verificare se il nodo può essere continuato dal nodo , quindi considerando tutte le coppie questo passaggio richiede tempo.O(1)uv(u,v)O(m2)

3. Notare che il percorso più lungo in potrebbe non essere una sottosequenza ripetuta valida. Considera i percorsi e . Se esiste un fronte allora è una sottosequenza ripetuta valida di lunghezza 3. Quindi ci vuole tempo per trovare tutte le sottosequenze ripetute di lunghezza 3. Nel caso generale ci vuole tempo lineare per verificare se due percorsi validi di lunghezza può essere combinato in un percorso valido di lunghezza .GabbcacabcO(m4)nn+1

4. Scorrere il passaggio 3 fino a quando non è più possibile trovare percorsi.


Hmm. Troppo veloce. Nel passaggio 3 il numero di sottosequenze da considerare diventa sempre più grande. Quindi non è polinomiale.
noplogista,

1
Benvenuto in CS.SE e grazie per aver provato a risolvere questo problema! Temo di non capire il tuo algoritmo. Che cos'è il passaggio 3? Tutto quello che vedo in "3." sono alcune dichiarazioni / osservazioni dichiarative, ma non vedo una specifica procedurale di ciò che dovrebbe fare l'algoritmo. Inoltre, non vedo cosa significhi ripetere il passaggio 3 o la logica della tua affermazione secondo cui il tempo sufficiente. Il tuo commento successivo ti fa sembrare che non credi più che la tua risposta sia corretta. In tal caso, potrebbe essere meglio eliminare la risposta, per evitare confusione. O(nnm2)
DW

Puoi sempre ripristinare o pubblicare una nuova risposta se trovi la risposta in un secondo momento.
DW

DW, grazie. L'input al passaggio 3 è tutte le sottosequenze ripetute di lunghezza n e l'output è tutte le sottosequenze ripetute di lunghezza n + 1. Credo che l'algoritmo sia corretto ma che non sia un algoritmo temporale polinomiale. Ora ho contrassegnato le affermazioni che ritengo errate.
noplogista,

Grazie. Capisco. Sfortunatamente, con quelle revisioni, temo che questa risposta non risponda alla domanda che è stata posta. La domanda era: questa NP è dura? Esiste un algoritmo efficiente? Mostrare che esiste un algoritmo a tempo esponenziale non aiuta a rispondere a nessuna di queste domande. In effetti, è già banale vedere che esiste un algoritmo a tempo esponenziale per il problema, senza invocare alcuna tecnica elaborata. Apprezzo il tuo tentativo.
DW
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.