Il problema è NP-difficile per dove A è il linguaggio finito contenente le seguenti parole:L=A∗A
- , x 000 ,x111x000
- , y 010 , y 001 ,y100y010y001
- , 01 c 10 , 10 c 01 e 11 c 0000c1101c1010c0111c00
La riduzione deriva dal problema Orientamento grafico, che è noto per essere NP-difficile (consultare https://link.springer.com/article/10.1007/s00454-017-9884-9 ). In questo problema, ci viene fornito un grafico non indiretto 3-regolare in cui ogni vertice è etichettato " " o " { 0 , 3 } ". L'obiettivo è dirigere i bordi del grafico in modo tale che il superamento di ogni vertice sia nell'insieme che identifica quel vertice.{1}{0,3}
La riduzione deve prendere come input un'istanza di orientamento del grafico e produrre un elenco di triple come output. In questa riduzione, le triple che produciamo soddisfano sempre determinati vincoli. Questi vincoli sono elencati di seguito e faremo riferimento a un elenco di triple come valido se e solo se soddisfano questi vincoli:
- I caratteri , y e c ricevono solo intervalli contenenti esattamente un indice. In altre parole, ogni volta che questi personaggi vengono posizionati, vengono posizionati in posizioni specifiche.xyc
- Per ogni tripla presente nell'istanza con i ∈ { 0 , 1 } , è presente anche la tripla ( 1 - i , l , r ) .(i,l,r)i∈{0,1}(1−i,l,r)
- Se e ( α ′ , l ′ , r ′ ) sono entrambi tripli presenti nell'istanza, allora l < l ′ ≤ r ′ < r , oppure l ′ < l ≤ r < r ′ , oppure { α , α ′ } = { 0 , 1 } con l = l(α,l,r)(α′,l′,r′)l<l′≤r′<rl′<l≤r<r′{α,α′}={0,1} .l=l′<r=r′
- Se è un triplo, allora il numero di triple ( α ′ , l ′ , r ′ ) con l ≤ l ′ ≤ r ′ ≤ r è esattamente r - l + 1 .( α , l , r )( α', l', r')l ≤ l'≤ r'≤ rr - l + 1
Nota il seguente lemma, dimostrato alla fine di questo post.
Lemma: per un elenco valido di triple, i caratteri , y e c devono essere posizionati esattamente come indicato dalle triple, e per ogni coppia di triple ( 0 , l , r ) e ( 1 , l , r ) , il due caratteri per che tripla devono essere posizionati ad indici l e r .Xyc(0,l,r)(1,l,r)lr
Quindi l'idea della riduzione è la seguente.
Usiamo coppie di triple e ( 1 , l , r ) per rappresentare i bordi. Il bordo passa tra le terminazioni dall'indice l e all'indice r . Supponendo si produce un elenco valido di triple, i caratteri di queste due triple devono essere messi a l e r , in modo da poter trattare l'ordine in cui essi sono disposti come indica la direzione del bordo. Qui 1 è la "testa" del bordo e 0 è la "coda". In altre parole, se 1 è posizionato a r(0,l,r)(1,l,r)lrlr101rquindi il bordo punta da a r e se l' 1 viene posizionato su l allora il bordo punta da r a l .lr1lrl
Per rappresentare i vertici, posizioniamo un carattere o y in un indice e utilizziamo i tre caratteri successivi come punti finali dei tre bordi che toccano il vertice. Si noti che se poniamo una x , tutti i tre spigoli al vertice deve puntare nella stessa direzione (sempre nel vertice o tutti fuori del vertice) semplicemente dovuto alle corde che sono in linguaggio finita A . Tali vertici hanno un livello superiore a 0 o 3 , quindi posizioniamo una x esattamente per i vertici etichettati { 0 , 3 } . Se posizioniamo una yxyxA03x{0,3}y, Esattamente uno dei tre lati del punto di vertice mosto nella stessa direzione a causa delle stringhe in . Tali vertici hanno un livello inferiore a 1 , quindi posizioniamo una y esattamente per i vertici etichettati { 1 } .A1y{1}
In un certo senso, abbiamo finito. In particolare, la corrispondenza tra la risoluzione di questa istanza e la risoluzione dell'istanza di orientamento del grafico dovrebbe essere chiara. Sfortunatamente, l'elenco delle triple che produciamo potrebbe non essere valido, quindi i "bordi" descritti potrebbero non funzionare come previsto. In particolare, l'elenco delle triple potrebbe non essere valido perché la condizione che gli intervalli delle triple debbano sempre contenere l'un l'altro potrebbe non essere valida: gli intervalli tra i due bordi potrebbero sovrapporsi senza che uno contenga l'altro.
Per combattere questo, aggiungiamo qualche altra infrastruttura. In particolare, aggiungiamo "vertici crossover". Un vertice crossover è un vertice di grado cui bordi sono accoppiati in modo tale che all'interno di ciascuna coppia un bordo deve puntare nel vertice crossover e uno fuori. In altre parole, un vertice crossover si comporterà come due soli bordi "incrocio". Rappresentiamo un vertice crossover posizionando il carattere c in un indice i . Quindi nota che la lingua A limita i caratteri in i - 1 e i + 2 per essere opposti (uno 0 e uno 1 ) e i caratteri in i - 24ciAi−1i+201i−2e per essere opposto. Quindi, se usiamo questi indici come punti finali per i quattro spigoli nel vertice del crossover, il comportamento è esattamente come descritto: i quattro spigoli sono in coppia e tra ogni coppia uno punta dentro e uno punta.i+1
Come posizioniamo effettivamente questi crossover? Supponiamo di avere due intervalli e ( l ′ , r ′ ) che si sovrappongono. WLOG, l < l ′ < r < r ′ . Aggiungiamo il carattere crossover nel mezzo (tra l ′ e r ). (Diciamo che da sempre abbiamo distanziato tutto così tanto che c'è sempre abbastanza spazio, e alla fine rimuoveremo qualsiasi spazio inutilizzato.) Lascia che l'indice del personaggio crossover sia io . Quindi sostituiamo le quattro triple ( 0(l,r)(l′,r′)l<l′<r<r′l′ri , ( 1 , l , r ) , ( 0 , l ′ , r ′ ) e ( 1 , l ′ , r ′ ) con otto triple con due ciascuna (una con carattere 0 e una con carattere 1 ) per i seguenti quattro intervalli ( l , i - 1 ) , ( i + 2 , r )(0,l,r)(1,l,r)(0,l′,r′)(1,l′,r′)01(l,i−1)(i+2,r), , ( i + 1 , r ′ ) . Nota che gli intervalli non si sovrappongono più nel modo sbagliato! (Dopo questa modifica, se due intervalli si sovrappongono, uno è strettamente all'interno dell'altro.) Inoltre, il bordo da l a r viene sostituito da un bordo da l al vertice del crossover seguito dal bordo da lì a r ; questi due bordi sono accoppiati al vertice del crossover in modo tale che uno sia puntato verso l'interno e uno sia sottolineato; in altre parole, i due bordi insieme si comportano esattamente come quello che stanno sostituendo.(l′,i−2)(i+1,r′)lrlr
In un certo senso, inserendo questo vertice crossover "non incrociato" due bordi (i cui intervalli erano sovrapposti). È facile vedere che l'aggiunta del vertice crossover non può far incrociare eventuali bordi aggiuntivi. Pertanto, possiamo annullare l'attraversamento di ogni coppia di bordi incrociati inserendo abbastanza vertici di crossover. Il risultato finale corrisponde ancora all'istanza di Orientamento grafico, ma ora l'elenco di triple è valido (le proprietà sono tutte facili da verificare ora che abbiamo "non incrociato" eventuali bordi di attraversamento), quindi si applica il lemma, i bordi devono comportarsi come descritto e la corrispondenza è in realtà un'equivalenza. In altre parole, questa riduzione è corretta.
prova del lemma
Lemma: per un elenco valido di triple, i caratteri , y e c devono essere posizionati esattamente come indicato dalle triple, e per ogni coppia di triple ( 0 , l , r ) e ( 1 , l , r ) , il due caratteri per che tripla devono essere posizionati ad indici l e r .xyc(0,l,r)(1,l,r)lr
prova:
Procediamo per induzione sulle triple per lunghezza dell'intervallo. In particolare, la nostra affermazione è la seguente: per ogni se una tripla ha una lunghezza di intervallo k, il carattere in quella tripla deve essere posizionato come descritto nel lemma.kk
Caso di base: per , la tripla deve posizionare un carattere x , y o c nel singolo indice all'interno dell'intervallo. Questo è esattamente come descritto nel lemma.k=0xyc
Caso induttivo: supponiamo che l'affermazione valga per qualsiasi inferiore a qualche k ′ . Consideriamo ora alcune triple con intervallo di lunghezza k ′ . Quindi quel triplo deve essere della forma ( i , l , r ) con r = l + k ′ - 1 e i ∈ { 0 , 1 } . Deve essere presente anche la tripla ( 1 - i , l , r ) . Il numero di triple ( αkk′k′(i,l,r)r=l+k′−1i∈{0,1}(1−i,l,r) con l ≤ l ′ ≤ r ′ ≤ r è esattamente r - l + 1 = k ′ . Queste triple comprendono le triple ( 0 , l , r ) e ( 1 , l , r ) ma anche k ′ - 2 altre triple della forma ( α ′ , l ′(α′,l′,r′)l≤l′≤r′≤rr−l+1=k′(0,l,r)(1,l,r)k′−2 con l < l ′ ≤ r ′ < r . Queste altre triple hanno una lunghezza dell'intervallo inferiore a k ' , quindi devono posizionare tutti i loro caratteri come specificato nel lemma. L'unico modo per far sì che ciò avvenga è se queste triple posizionano i caratteri in ogni indice iniziando dall'indice l + 1 e finendo all'indice r + 1 . Pertanto, le nostre due triple ( 0 , l , r ) e ( 1 , l , r )(α′,l′,r′)l<l′≤r′<rk′l+1r+1(0,l,r)(1,l,r)devono posizionare i loro caratteri agli indici e r , come descritto nel lemma, concludendo il caso induttivo.lr
Per induzione, il lemma è corretto.