Quanto è difficile riordinare una stringa?


117

Una mescolanza di due stringhe si forma intervallando i caratteri in una nuova stringa, mantenendo in ordine i caratteri di ciascuna stringa. Ad esempio, MISSISSIPPIè un riordino di MISIPPe SSISI. Permettetemi di chiamare un quadrato di stringhe se è un riordino di due stringhe identiche. Ad esempio, ABCABDCDè quadrato, perché è un riordino di ABCDe ABCD, ma la stringa ABCDDCBAnon è quadrata.

Esiste un algoritmo veloce per determinare se una stringa è quadrata o è NP-difficile? L'ovvio approccio di programmazione dinamica non sembra funzionare.

Anche i seguenti casi speciali sembrano essere difficili: (1) stringhe in cui ogni carattere appare al massimo quattro sei volte e (2) stringhe con solo due caratteri distinti. Come sottolineato da Austrin di seguito, il caso speciale in cui ogni personaggio si presenta al massimo quattro volte può essere ridotto a 2SAT.


Aggiornamento: questo problema ha un'altra formulazione che può rendere più semplice una prova di durezza.

Considera un grafico G i cui vertici sono gli interi da 1 a n; identificare ogni fronte con l'intervallo reale tra i suoi punti finali. Diciamo che due bordi di G sono nidificati se un intervallo contiene correttamente l'altro. Ad esempio, i bordi (1,5) e (2,3) sono nidificati, ma (1,3) e (5,6) non lo sono, e (1,5) e (2,8) non lo sono. Una corrispondenza in G non è nidificata se nessuna coppia di bordi è nidificata. Esiste un algoritmo rapido per determinare se G ha una corrispondenza perfetta non nidificata o è un problema NP-difficile?

  • Disordinare una stringa equivale a trovare una corrispondenza perfetta non nidificata in un'unione disgiunta di cricche (con bordi tra caratteri uguali). In particolare, riordinare una stringa binaria equivale a trovare una corrispondenza perfetta non nidificata in un'unione disgiunta di due cricche. Ma non so nemmeno se questo problema è difficile per i grafici generali o facile per qualsiasi classe di grafici interessante.

  • Esiste un semplice algoritmo a tempo polinomiale per trovare corrispondenze perfette non incrociate .


Aggiornamento (24 giugno 2013): il problema è stato risolto! Ora ci sono due prove indipendenti che identificano le stringhe quadrate è NP-completo.

C'è anche una prova più semplice che trovare corrispondenze perfette non nidificate è NP-difficile, a causa di Shuai Cheng Li e Ming Li nel 2009. Vedi " Su due problemi aperti di schemi a 2 intervalli ", Theoretical Computer Science 410 (24–25 ): 2410-2423, 2009.


2
La sequenza non è solo A000984, il "numero di possibili valori di un numero binario a 2 * n bit per cui metà dei bit sono attivi e metà sono disattivati"?
Travis Brown,

5
@Travis, a meno che non mi fraintenda: per n = 4, 10000111 è un numero binario 2 * n bit per cui metà dei bit sono attivi e metà sono disattivati, ma che non è un quadrato, come definito. Seguendo questa logica, poiché i quadrati sono un sottoinsieme rigoroso dell'insieme che genera A000984, i valori dei quadrati su un alfabeto binario dovrebbero essere più bassi a indici uguali attraverso la sequenza - no?
Daniel Apon,

1
Osservazione: usando il formalismo grafico, sia 2n il numero di vertici in G. Sia G ′ un grafico ottenuto dal grafico a linee di G aggiungendo i bordi tra i vertici corrispondenti ai bordi nidificati di G. Il problema chiede se G ′ ha un set indipendente di dimensioni n. Esistono varie classi di grafici in cui è possibile calcolare un tempo polinomiale di un set massimo indipendente. Se seguiamo questa strada, la domanda è: quali belle proprietà ha G ′? (altro)
Tsuyoshi Ito,

2
@Radu: non credo che la frazione di quadrati in non quadrati (sopra alfabeti binari) converge a 1/3. Ho fatto alcune simulazioni MonteCarlo che indicano una lenta convergenza a 1/2. Quindi nel limite essenzialmente tutte le stringhe binarie con numeri pari di 0 e 1 sono quadrati. Questo è sorprendente per me e può essere sfruttabile in un algoritmo. Per alfabeti più grandi la frazione di quadrati sembra convergere rapidamente a 0.
Martin Berger,

8
Dato che questa domanda è menzionata nel post di oggi, vediamo se possiamo ottenere un rinnovato interesse nel risolvere questo problema. È passato un anno da quando questa domanda è stata avanzata e da allora abbiamo guadagnato molti nuovi utenti. Ho fatto una ricompensa di 100 rappresentanti per la domanda.
Alex ten Brink,

Risposte:


66

Michael Soltys e io siamo riusciti a dimostrare che il problema di determinare se una stringa può essere scritta come un riordino quadrato è NP completo. Questo vale anche per un alfabeto finito con solo simboli distinti, sebbene la nostra prova sia scritta per un alfabeto con simboli. Questa domanda è ancora aperta per alfabeti più piccoli, diciamo con solo simboli. Non abbiamo esaminato il problema con la restrizione che ogni simbolo appare solo volte (o, più in generale, un numero costante di volte); quindi quella domanda è ancora aperta.9 2 67926

La dimostrazione utilizza una riduzione da -Partition. È troppo lungo per pubblicare qui, ma una prestampa, "Unshuffling a string is -hard", è disponibile dalle nostre pagine Web all'indirizzo:NP3NP

http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/

e

http://www.cas.mcmaster.ca/~soltys/#Papers .

L'articolo è stato pubblicato nel Journal of Computer System Sciences:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


11
Eccezionale!! (E con mio immenso sollievo, seriamente non banale.)
Jeffε

15
Grazie. StackExchange era la nostra fonte per questa domanda. È una grande risorsa!
Sam Buss,

9
@SamBuss una piccola richiesta: mentre citi la domanda di Jeff, nel testo citi solo la soluzione di Per Austrin. Se guardi le risposte, c'è un modo per generare una citazione formale anche per le risposte (fai clic sul pulsante di condivisione e premi il link "cita"). In questo modo, puoi generare una citazione adeguata anche per la risposta di Per. Lo dico solo in modo che anche le persone che forniscono contributi formali sul sito possano ottenere un riconoscimento formale. Grazie ! e complimenti per aver risolto questo problema
Suresh Venkat,

2
@SureshVenkat. Grazie per il suggerimento: questo è utile. Ho aggiunto questo alla versione online del documento.
Sam Buss,

Il problema del riconoscimento di un riordino piazza ha ora dimostrato di essere difficile anche su un alfabeto binario: sciencedirect.com/science/article/pii/S0304397519300258
a3nm

58

Per il caso speciale che menzioni quando ogni personaggio appare al massimo quattro volte, c'è una semplice riduzione a 2-SAT (a meno che non mi manchi qualcosa ...), come segue:

Il punto cruciale è che per ogni personaggio ci sono (al massimo) due modi validi per abbinare le occorrenze del personaggio (la terza possibilità sarà la nidificazione). Utilizzare una variabile booleana per rappresentare quale delle due corrispondenze è stata scelta. Ora un'assegnazione a queste variabili fornisce un riordino valido della stringa iff per ogni coppia di bordi nidificati, non entrambi sono stati scelti. Questa condizione può essere descritta con precisione da una disgiunzione delle variabili (eventualmente negata) corrispondente ai due caratteri coinvolti.


Bello. La stessa idea si generalizza alle stringhe in cui ogni carattere si presenta al massimo sei volte, ma il risultato è un'istanza di 5-SAT. :-(
Jeffε

2
Questa risposta è la preferita per vincere la taglia.
Jeffε

quindi questo sembra dimostrare che il problema è NPC e perché abbiamo bisogno di lunghe prove per conferenze e riviste?
T ....

@Turbo Molto tardivo, ma questo non dimostra il problema di essere NPC perché 2-SAT non è NPC; è in P.
Steven Stadnicki il

Questa riduzione a 2-SAT funziona se la dimensione dell'alfabeto è illimitata?
Mohammad Al-Turkistany,

11

Ecco un algoritmo che potrebbe avere qualche possibilità di essere corretto anche se sembra difficile da dimostrare e non scommetterei la casa su di esso ...

Diciamo che viene eliminato se per ogni bordo e esiste una corrispondenza perfetta (possibilmente nidificata) di G che usa e e non usa alcun bordo contenuto in o contenente e .GeGee

È facile verificare se viene rimosso e se non si trovano i bordi che violano. Chiaramente nessuno di questi bordi violanti può essere usato in un perfetto abbinamento senza nidificazione di G , quindi è sicuro rimuoverli dalla considerazione. Ripetendo questo processo, otteniamo un sottografo (unico) purificato di G che ha una corrispondenza perfetta non nidificata se G ha.GGGG

Ora arriva il salto di fede, che può o non può essere corretto: la speranza è che in un grafico purificato, se ci sono ancora vertici di grado , possiamo fare la scelta avida e abbinare il primo di questi vertici al primo vicino (o equivalentemente, rimuovi i bordi da tutti gli altri vicini).>1

Dopo la scelta avida eliminiamo di nuovo il grafico, e così via, e il processo termina quando il grafico è (si spera) una corrispondenza perfetta senza nidificazione.

All'inizio ho pensato che sarebbe stato più o meno come avere un piccolo sguardo avanti nell'avido algoritmo e non funzionare davvero, ma ho trovato sorprendentemente difficile trovare un controesempio.


Sono scettico sulla seconda fase golosa, ma eliminare il grafico sembra utile. Nel contesto di stringa originale, in cui il grafico è l'unione disgiunta di cricche, puoi dire qualcosa sulla struttura del grafico purificato? È ancora un'unione disgiunta di cricche? (In altre parole, è possibile partizionare le occorrenze di ciascun carattere nella stringa di input in modo che i caratteri in parti diverse non possano essere abbinati?)
Jeffε

2
Per la seconda domanda, considera la stringa "aaaa". Spurgando rimuove i bordi 1-4 e 2-3, dando un ciclo di 4. Due varianti del secondo passaggio avido che sarebbero anche sufficienti e che non sono riuscito a trovare controesempi sono: 1) Un grafico purificato ha una corrispondenza perfetta non nidificata se ha una corrispondenza perfetta (ciò sembra incomparabile con la fase avida) . 2) In un grafico purificato con una corrispondenza perfetta senza nidificazione, ogni bordo viene utilizzato in una corrispondenza perfetta senza nidificazione (questo è più forte sia del passo goloso che del primo oggetto, quindi dovrebbe essere più facile da confutare).
Per Austrin,

11

La soluzione che io e Sam Buss abbiamo proposto a novembre 2012 (mostrando che riordinare un quadrato in NP-hard con una riduzione da 3-Partition) è ora un articolo pubblicato sul Journal of Computer System Sciences:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


2
Questo dovrebbe davvero essere una modifica alla risposta precedente di Sam Buss, piuttosto che una risposta separata. Puoi fare clic su "modifica" per suggerire una modifica alla risposta di qualcun altro e la tua modifica verrà esaminata da altri utenti del sito.
DW

11

Romeo Rizzi e Stéphane Vialette dimostrano che il riconoscimento delle stringhe quadrate è NP-completo nel loro documento del 2013 " Riconoscere le parole che sono quadrati per il prodotto Shuffle ", grazie alla riduzione del più lungo problema di sottosequenza binaria. Dichiarano che la complessità di riordinare le stringhe binarie è ancora aperta.

Una prova ancora più semplice che trovare una perfetta corrispondenza non nidificata sia NP-completa è data da Shuai Cheng Li e Ming Li nel loro articolo del 2009 " Su due problemi aperti di schemi a 2 intervalli ". Tuttavia, usano la terminologia ereditata dalla bioinformatica. Invece di "perfetta corrispondenza non nidificata", lo chiamano "problema DIS-2-IP- ". L'equivalenza tra i due problemi è descritta da Blin, Fertin e Vialette :{<,}

Il problema 2-IP-DIS- ha una formulazione immediata in termini di corrispondenze vincolate nei grafici generali: Dato un grafico insieme a un ordinamento lineare dei vertici di , il 2-IP -DIS- problema equivale a trovare una cardinalità massima corrispondente a in con la proprietà che per due spigoli distinti e di né e né{<,}GπG{<,}MG{u,v}{u,v}Mmin{π(u),π(v)}<min{π(u),π(v)}max{π(u),π(v)<max{π(u),π(v)}min{π(u),π(v)}<min{π(u),π(v)} e .max{π(u),π(v)}<max{π(u),π(v)}

Aggiornamento (25 febbraio 2019): Bulteau e Vialette hanno mostrato che il problema decisionale di riordinare una stringa binaria è NP-completo nel loro documento, Riconoscere i riquadri shuffle binari è NP-difficile .


Non vedo la connessione e non vedo dove gli autori affermano che il riordino di una stringa equivale al loro problema.
Suresh Venkat,

2
Non dicono che equivale a rimescolare; è un problema più generale.
Jeffε

@SureshVenkat Ho modificato la mia risposta, spero sia più chiara. Fondamentalmente, quello che stanno dicendo nella nota a piè di pagina è che due bordi nella corrispondenza ( ) non sono nidificati. M
Mohammad Al-Turkistany,

Nella versione pubblicata effettiva, l'equivalenza è dichiarata a pagina 320. books.google.com/…
Mohammad Al-Turkistany,


9

7
Bel riferimento. È difficile vedere come i risultati si applicherebbero al mio problema, ma forse le tecniche potrebbero aiutare. È facile dire se una determinata stringa X è un riordino di due copie di un'altra stringa Y. Il documento allegato dimostra che NP è difficile decidere se una determinata stringa X è un riordino di un numero qualsiasi di copie di un'altra stringa Y. Voglio sapere se una determinata stringa X è un riordino di due copie di
ALCUNA

5

MAI MENTE, QUESTA RISPOSTA È SBAGLIATA. Non riesce sull'input "AABAAB": abbinare avidamente le prime due A tra loro rende impossibile abbinare i simboli rimanenti. Lo sto lasciando piuttosto che cancellarlo per aiutare gli altri a evitare di fare lo stesso errore.

Mi sembra che sia sempre sicuro abbinare avidamente ogni personaggio successivo del presunto quadrato ad un altro personaggio uguale che si trova il prima possibile. Cioè, penso che dovrebbe funzionare il seguente algoritmo di tempo lineare:

Passa attraverso ogni posizione i nella stringa di input, i = 0, 1, 2, ... n. Per ogni posizione i, controlla se quella posizione è già stata confrontata con una posizione precedente nella stringa. In caso contrario, abbinalo a un carattere uguale che viene dopo l'ultima posizione già abbinata ed è altrimenti il ​​più presto possibile nella stringa. Se non viene trovata una corrispondenza per alcuni personaggi, dichiarare che l'input non è un quadrato; altrimenti, è l'insieme di caratteri nella prima coppia di ogni partita.

Eccolo in Python:

def sqrt (S):
    partite = []
    i, j = 0, 0
    mentre io <len (S):
        se j <len (corrisponde) e corrisponde [j] [1] == i:
            i + = 1
            j + = 1
            Continua
        se corrisponde:
            k = corrisponde a [-1] [1] + 1
        altro:
            k = 1
        mentre k <len (S) e S [k]! = S [i]:
            k + = 1
        se k> = len (S):
            aumenta l'eccezione ("Not a square")
        matches.append ((i, k))
        i + = 1
    restituisce "" .join (S [a] per a, b nelle partite)

print sqrt ("ABCABDCD")

Qui i è la variabile del ciclo principale (la posizione che stiamo cercando di abbinare), j è un puntatore nella matrice di coppie abbinate che accelera il controllo se la posizione i è già abbinata e k è un indice usato per cercare il personaggio che corrisponde a quello in posizione i. È tempo lineare perché i, j e k stanno aumentando monotonicamente attraverso la stringa e ogni iterazione del ciclo interno ne aumenta uno.


4
Stato lì. Fatto. :-)
Jeffε

5

Aggiornamento: non ha senso parlare della difficoltà di trovare la corrispondenza perfetta che non è nidificazione e non attraversa, quando le etichette sono da 1 a n, perché ce n'è solo una. (Sì, mi prendo a calci da solo.) Tuttavia, avrebbe senso dare una gamma più ampia sulle etichette ... quindi vedo ancora qualche speranza, ma dopo tutto potrebbe essere del tutto inutile. Dovrei sicuramente dare seguito a questo.


Posso pensare al motivo per cui potrebbe essere difficile trovare un abbinamento che non sia nidificante e non attraversante. Vorrei chiamare tale corrispondenza una corrispondenza disgiunta . Non sono sicuro di quanto aiuti, ma lasciatemi comunque presentare il ragionamento. (Devo sottolineare che il mio argomento, così com'è, non è completo, e il dettaglio che lascio fuori è forse cruciale. Tuttavia, immagino che potrebbe essere una sorta di inizio.)

Inizierò con un problema leggermente diverso. Dato un grafico cui bordi sono colorati con colori e i vertici sono etichettati da a , esiste una corrispondenza disgiunta che contiene esattamente un bordo di ciascun colore? Questo problema sembra essere NP-difficile (l'argomento per questo è sia completo che diretto - a meno che non mi manchi qualcosa). La riduzione rivela un grafico che è un'unione disgiunta di cricche.k 1 nGk1n

La riduzione è dovuta a Disjoint Factors , un problema NP completo introdotto in [1]. Un'istanza di fattori disgiunti è data da una stringa su un alfabeto di dimensione , e la domanda è se ci sono fattori disgiunti, in cui un fattore è una sottostringa che inizia e termina con la stessa lettera; e due fattori sono disgiunti se non si sovrappongono nella stringa (si noti che anche la "nidificazione", in particolare, è vietata).kkk

Vorrei indicare con , gli elementi dell'alfabeto di dimensioni associati all'istanza di Fattori disgiunti. ka1,,akk

Data un'istanza di fattori disgiunti, vale a dire una stringa di lunghezza , crea un grafico che ha vertici con etichette vertici da a . Aggiungi un bordo tra i vertici e se le posizioni corrispondenti hanno la stessa lettera (diciamo ) e colora anche il bordo con il colore .n 1 n u v a i ( u , v ) inn1nuvai(u,v)i

La prova della riduzione deriva essenzialmente dalle definizioni. Dati fattori disgiunti, abbiamo chiaramente una corrispondenza colorata -disjoint, semplicemente selezioniamo i bordi come dato dai fattori disjoint, ed è facile vedere che la corrispondenza risultante è sia colorata che disgiunta. Al contrario, se esiste una corrispondenza colorata -disgiunto, allora abbiamo k fattori disgiunti, uno per ogni lettera, perché la corrispondenza è colorata (e quindi seleziona un fattore per lettera), ed è disgiunta (quindi i fattori corrispondenti non si sovrappongono ).k kkkk

Per sbarazzarsi dei colori e rendere perfetto l'abbinamento, anche se su un intervallo forse più ampio , apportare le seguenti modifiche al grafico così creato:

Consenti a indicare il sottoinsieme di vertici che hanno etichette che sono posizioni associate alla lettera . Se ha vertici , quindi aggiungere nuovi vertici e indurre un grafico bipartito completo tra e i vertici appena aggiunti. Ripeti, ovviamente, per ogni lettera. a U a A ( A - 2 ) U aUaaUaA(A2)Ua

In , se il grafico deve indurre una corrispondenza perfetta, i vertici appena introdotti devono essere abbinati ai vertici di , e tutti tranne una coppia di vertici, e il bordo tra i vertici rimanenti corrisponderà al fattore disgiunto . Non ho elaborato i numeri che si devono associare ai vertici appena aggiunti ... notare che devono essere in modo che la corrispondenza risultante sia disgiunta. Ho solo la sensazione (leggi: spero) che "si possa fare"!Ua

[1] Su problemi senza kernel polinomiali , Hans L. Bodlaender, Rodney G. Downey, Michael R. Fellows e Danny Hermelin, J. Comput. Syst. Sci.


3
Non ho capito bene. (1,2), (3,4), (5,6), ..., (n-1, n) non è l'UNICO perfetto abbinamento disgiunto?
Jeffε

Una volta passato allo scenario di "abbinamento perfetto", modifico la costruzione e aggiungo molti nuovi vertici (nota che aggiungo | U_a | -2 nuovi vertici per ogni a dell'alfabeto). Pertanto, n esploderà di conseguenza - all'incirca a 2n-2k, per un alfabeto di dimensioni k. Spero di aver chiarito che la riduzione è incompleta in quanto non ho specificato quali numeri sono assegnati ai nuovi vertici, ma spero che possa essere esteso senza troppe difficoltà. Tuttavia, devo sicuramente pensarci un po 'prima di poter aggiungere altro.
Neeldhara,

1
Penso che il punto del commento di JeffE sia che è facile trovare una corrispondenza perfetta che sia non-nidificazione e non-attraversamento (o riferire la loro assenza) perché esiste una sola possibilità.
Tsuyoshi Ito,

2
Non sto parlando del contenuto della tua idea di prova, ma sto parlando della prima frase della tua risposta: "Riesco a pensare al motivo per cui potrebbe essere difficile trovare un abbinamento perfetto che non si annida e non si attraversa". Questo compito è facile per il motivo che JeffE ha scritto.
Tsuyoshi Ito,

2
Senza il vincolo di colorazione imposto dal problema del fattore disgiunto (al massimo un bordo di ciascun colore), è anche facile trovare abbinamenti disgiunti massimi.
Jeffε

1

L'approccio non funziona: decomporre un quadrato mischiato eliminando due lettere corrispondenti non si traduce in quadrati mescolati ... Vedi i commenti di Radu di seguito.


Σ

S(XY)A(X,Y)(1)A(aX1,aX2Y1Y2)A(X1,Y1)A(X2,Y2)(2)A(ε,ε)ε(3)
aΣε

X1Y1Y1X2Y2Y1Y2X1X2

abcabdcd

S(abcabdcd)A(abc,abdcd)(by 1,X=abc,Y=abdcd)A(bc,bdcd)A(ε,ε)(by 2,X1=bc,Y1=bdcd,X2=Y2=ε)A(c,c)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(ε,ε)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(d,d)A(ε,ε)(by 3)A(d,d)A(ε,ε)(by 3)A(ε,ε)A(ε,ε)A(ε,ε)(by 2)3εi.e. success

0011

S(0011)A(0,011)A(ε,ε)A(1,1)A(1,1)ε

XY


ϵ

Io non la penso così.
Serge Gaspers,

ϵ

Grazie per i ritorni; Ho cambiato un po 'la grammatica e ho anche una piccola intuizione di cui potrebbe funzionare.
Sylvain,

3
ϵ

1

Aggiornamento: Come Tsuyoshi Ito sottolinea nei commenti, questo algoritmo ha un tempo di esecuzione esponenziale.

Post originale:

Ecco come lo programmerei nel mondo reale.

Ci viene data una stringa S = (S [1], ..., S [n]). Per ogni prefisso S_r = (S [1], ..., S [r]), esiste un insieme {(T_i, U_i)} di coppie di stringhe, tale che S_r è un riordino di (T_i, U_i), e T_i è un prefisso di U_i (cioè U_i 'inizia con' T_i). S_r stesso è un quadrato se e solo se questo set contiene una coppia (T_i, U_i) con T_i = U_i.

Ora, non abbiamo bisogno di generare tutte queste coppie; dobbiamo solo generare il suffisso V_i di ogni stringa U_i ottenuta rimuovendo la sua copia di T_i. Ciò eliminerà un numero (possibilmente esponenziale) di duplicati irrilevanti. Ora S_r è un quadrato se e solo se questo insieme di suffissi contiene la stringa vuota. Quindi l'algoritmo diventa:

Initialise: SuffixSet = {<empty string>} ; r = 0
Loop: while (r < n) {
  r = r + 1
  NextSuffixSet = {}
  for each V in SuffixSet {
    if (V[1] == S[r]) Add V[2...] to NextSuffixSet // Remove first character of V
    Add V||S[r] to NextSuffixSet // Append character S[r] to V
    }
  SuffixSet = NextSuffixSet
  }
Now S is a square if and only if SuffixSet contains the empty string.

Ad esempio, se S è AABAAB:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB, AABA}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA, AABAA}
r=6: S[r] = B; SuffixSet = {AA, BAAB, <empty string>, BB, ABAB, AABAAB}

Possiamo scartare tutti i suffissi che sono più della metà della stringa di input, quindi questo semplifica:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA}
r=6: S[r] = B; SuffixSet = {AA, <empty string>, BB}

L'ho programmato in C ++ e funziona su tutti gli esempi forniti qui. Posso pubblicare il codice, se qualcuno è interessato. La domanda è: la dimensione di SuffixSet può crescere più rapidamente del polinomio?


3
Ho provato anche questo, ma gli esperimenti mostrano che la dimensione di SuffixSet sembra crescere esponenzialmente in n se la stringa originale è (AB) ^ n.
Tsuyoshi Ito,

1

EDIT: questa è una risposta errata.


Sylvain ha suggerito un RCG che purtroppo non era appropriato per questi "riquadri shuffle". Tuttavia, penso che ce ne sia uno (EDIT: non un RCG, vedi i commenti di Kurt qui sotto!) , Che appare come segue:

S(Y)A(ϵ,Y)(1)A(X,ZY)A(XZ,Y)(2)A(aX,aY)A(X,Y) for every aΣ(3)A(ϵ,ϵ)ϵ(4)

aabbabab(1,2)(3)(2)

100110101010

S(100110101010)A(ϵ,100110101010)(1)A(1001,10101010)(2)A(01,101010)(3)A(011,01010)(2)A(1,010)(3)A(10,10)(2)A(ϵ,ϵ)(3)ϵ(4)

Non ho elaborato una prova formale che questa grammatica catturi davvero esattamente i "riquadri shuffle", ma non dovrebbe essere troppo difficile. Sylvain ha già detto che il problema decisionale per gli RCG è polinomiale.


A(x,ϵ)23

5
@DaniCL, Ripensandoci ... I parametri nell'RHS delle regole di produzione devono essere intervalli contigui dell'input? Non ho visto ciò esplicitamente dichiarato nella definizione del documento di Boullier, ma sembra che sia così che viene utilizzato. Nell'analisi del tempo di esecuzione dell'algoritmo di analisi, afferma che il numero di argomenti possibili per le clausole è O (n ^ 2h) dove h è la massima arità delle clausole e n è la lunghezza di input. Nella tua grammatica, XZ in generale non sarà contiguo nell'input originale.
Kurt,

3
@Kurt, penso che tu abbia trovato il difetto. In un altro documento ("Numeri cinesi, MIX, Scrambling e grammatiche di concatenazione di intervalli"), Boullier afferma esplicitamente: "Naturalmente, solo gli intervalli consecutivi possono essere concatenati in nuovi intervalli. In qualsiasi PRCG, terminali, variabili e argomenti in una clausola sono dovrebbe essere vincolato alle gamme da un meccanismo di sostituzione ". Questo probabilmente significa che la mia grammatica non è un RCG valido, che il dubbio di Radu era ragionevole e che neanche questo approccio funziona.
DaniCL,

2
@Kurt è corretto. Senza la restrizione di contiguità, sono abbastanza sicuro di poter creare un insieme di regole di produzione che riconoscono il linguaggio NP-completo UNARY 3PARTITION. Qualsiasi set di numeri interi non negativi può essere codificato in unario da una stringa nella lingua (1 * 0) ^ *. UNARY 3PARTITION è l'insieme di tutte queste stringhe il cui set codificato può essere partizionato in sottoinsiemi di 3 elementi, tutti con la stessa somma. (Vedi en.wikipedia.org/wiki/3-partition_problem .)
Jeffε

1
Grammatica per UNARY 3PARTITION: S (X0Y0Z) -> A (e, X0, Y0, Z); A (W, 1X, Y, Z), A (W, X, 1Y, Z), A (W, X, Y, 1Z) -> A (W1, X, Y, Z); A (W, 0X, 0Y, 0Z) -> B (W, XYZ); B (W, e) -> E; B (W, X0Y0Z) -> C (W, W, X0, Y0, Z); C (W, 1V, 1X, Y, Z), C (W, 1V, X, 1Y, Z), C (W, 1V, X, Y, 1Z) -> C (W, V, X, Y, Z); C (W, e, X, Y, Z) -> B (W, XYZ)
Radu GRIGore
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.