O problema é NP-difícil para em que A é o idioma finita que contém as seguintes palavras:L=A∗A
- , x 000 ,x111x000
- , y 010 , y 001 ,y100y010y001
- , 01 c 10 , 10 c 01 e 11 c 0000c1101c1010c0111 c 00
A redução é proveniente do problema Graph Orientation, que é conhecido por ser NP-difícil (consulte https://link.springer.com/article/10.1007/s00454-017-9884-9 ). Nesse problema, recebemos um gráfico não direcionado 3-regular no qual todos os vértices são rotulados como " " ou " { 0 , 3 } ". O objetivo é direcionar as arestas do gráfico para que o grau de cada vértice esteja no conjunto que rotula esse vértice.{ 1 }{ 0 , 3 }
A redução precisa tomar como entrada uma instância de Orientação Gráfica e produzir uma lista de triplos como saída. Nesta redução, os triplos que produzimos sempre satisfarão certas restrições. Essas restrições estão listadas abaixo, e nos referiremos a uma lista de triplos como válida se e somente se eles satisfizerem essas restrições:
- Os caracteres , y , e c são apresentadas somente intervalos que contêm exactamente um índice. Em outras palavras, sempre que esses caracteres são colocados, eles são colocados em locais específicos.xyc
- Para cada triplo presente na instância com i ∈ { 0 , 1 } , o triplo ( 1 - i , l , r )( i , l , r )i ∈ { 0 , 1 }( 1 - i , l , r ) também está presente.
- Se e ( α ′ , l ′ , r ′ ) são triplos presentes no caso, então l < l ′ ≤ r ′ < r ou l ′ < l ≤ r < r ' , ou { α , α ′ } = { 0 , 1 } com l = l( α , l , r )( α′, l′, r′)l < l′≤ r′< reu′< l ≤ r < r′{ α , α′} = { 0 , 1 } .l = l′< r = r′
- Se é um triplo, o número de triplos ( α ′ , l ′ , r ′ ) com l ≤ l ′ ≤ r ′ ≤ r é exatamente r - l + 1 .( α , l , r )( α′, l′, r′)l≤l′≤r′≤rr−l+1
Observe o seguinte lema, comprovado no final deste post.
Lema: para uma lista válida de triplos, os caracteres , y , e C deve ser colocado exactamente como indicado pelos triplos, e para qualquer par de triplos ( 0 , l , r ) e ( 1 , l , r ) , o dois caracteres para esse triplo devem ser colocados nos índices l e r .xyc(0,l,r)(1,l,r)lr
Então a idéia da redução é a seguinte.
Usamos pares de triplos e ( 1 , l , r ) para representar arestas. A aresta varia entre os pontos de extremidade no índice le no índice r . Supondo que produzimos uma lista válida de triplos, os caracteres desses dois triplos devem ser colocados em l e r , para que possamos tratar a ordem em que eles são colocados como indicando a direção da aresta. Aqui 1 é a "cabeça" da aresta e 0 é a "cauda". Em outras palavras, se o 1 é colocado em r(0,l,r)(1,l,r)lrlr101rentão a aresta aponta de para r e se o 1 é colocado em l , a aresta aponta de r para l .lr1lrl
Para representar vértices, colocamos um caractere ou y em um índice e usamos os próximos três caracteres como pontos finais das três arestas que tocam o vértice. Nota que, se colocar um x , todos os três arestas no vértice deve apontar na mesma direção (todas no vértice ou todos fora do vértice) simplesmente devido às cordas que estão em linguagem finita A . Como esses vértices têm graus negativos de 0 ou 3 , colocamos um x exatamente para os vértices marcados com { 0 , 3 } . Se colocarmos um yxyxA03x{0,3}y, Exactamente uma das três arestas no vértice deve ponto na mesma direcção devido às cordas em . Como esses vértices têm graus negativos 1 , colocamos y exatamente para os vértices rotulados como { 1 } .A1y{1}
Em certo sentido, terminamos. Em particular, a correspondência entre resolver esta instância e resolver a instância de Orientação do gráfico deve ser clara. Infelizmente, a lista de triplos que produzimos pode não ser válida e, portanto, as "arestas" descritas podem não funcionar conforme o esperado. Em particular, a lista de triplos pode não ser válida porque a condição em que os intervalos das triplas sempre devem conter um ao outro pode não se manter: os intervalos das duas arestas podem se sobrepor sem que um contenha o outro.
Para combater isso, adicionamos mais infraestrutura. Em particular, adicionamos "vértices cruzados". Um vértice cruzado é um vértice de grau cujas arestas são emparelhadas de modo que dentro de cada par uma aresta deve apontar para o vértice cruzado e uma para fora. Em outras palavras, um vértice cruzado se comportará da mesma maneira que apenas duas arestas "cruzadas". Representamos um vértice cruzado colocando o caractere c em algum índice i . Observe que o idioma A restringe os caracteres em i - 1 e i + 2 como opostos (um 0 e um 1 ) e os caracteres em i - 24ciAi−1i+201i−2e para ser o oposto. Assim, se usarmos esses índices como pontos finais para as quatro arestas no vértice do cruzamento, o comportamento será exatamente como descrito: as quatro arestas estão em pares e, em cada par, um ponto e um ponto.i+1
Como realmente colocamos esses crossovers? Bem, suponha que tenhamos dois intervalos e ( l ' , r ' ) que se sobrepõem. WLOG, l < l ' < r < r ' . Nós adicionamos o caractere crossover no meio (entre l ′ e r ). (Digamos que, desde o início, espaçamos tudo até agora, para que haja sempre espaço suficiente e, no final, removeremos qualquer espaço não utilizado.) Deixe o índice do caractere crossover ser i . Em seguida, substituímos os quatro triplos ( ,(l,r)(l′,r′)l<l′<r<r′l′rEu , ( 1 , l , r ) , ( 0 , l ′ , r ′ ) e ( 1 , l ′ , r ′ ) com oito triplos, com dois cada (um com o caractere 0 e outro com o caractere 1 ) pelos quatro intervalos a seguir ( l , i - 1 ) , ( i + 2 , r )( 0 , l , r )( 1 , l , r )( 0 , l′, r′)( 1 , l′, r′)0 01( l , i - 1 )( i + 2 , r ), , ( i + 1 , r ′ ) . Observe que os intervalos não se sobrepõem mais do jeito ruim! (Após essa alteração, se dois intervalos se sobrepõem, um fica estritamente dentro do outro.) Além disso, a aresta de l para r é substituída por uma aresta de l para o vértice cruzado, seguida pela aresta de lá para r ; essas duas arestas são emparelhadas no vértice cruzado de modo que uma seja apontada para dentro e outra; em outras palavras, as duas arestas juntas se comportam exatamente como a única aresta que estão substituindo.( l′, i - 2 )( i + 1 , r′)eureur
Em certo sentido, colocar esse vértice cruzado "não cruzou" duas arestas (cujos intervalos estavam sobrepostos). É fácil ver que a adição do vértice cruzado não pode fazer com que outras arestas sejam cruzadas. Assim, podemos descruzar cada par de arestas cruzadas inserindo vértices de cruzamento suficientes. O resultado final ainda corresponde à instância Orientação do gráfico, mas agora a lista de triplos é válida (todas as propriedades são fáceis de verificar agora que "não cruzamos" as arestas de cruzamento); portanto, o lema se aplica, as arestas devem se comportar conforme descrito , e a correspondência é realmente uma equivalência. Em outras palavras, essa redução está correta.
prova de lema
Lema: para uma lista válida de triplos, os caracteres , y , e C deve ser colocado exactamente como indicado pelos triplos, e para qualquer par de triplos ( 0 , l , r ) e ( 1 , l , r ) , o dois caracteres para esse triplo devem ser colocados nos índices l e r .xyc( 0 , l , r )( 1 , l , r )eur
prova:
Prosseguimos por indução nos triplos por duração do intervalo. Em particular, nossa afirmação é a seguinte: para qualquer se algum triplo tiver um comprimento de intervalo k , o caractere nesse triplo deve ser colocado conforme descrito no lema.kk
Caso base: para , o triplo deve estar colocando um caractere x , y ou c no índice único dentro do intervalo. Isso é exatamente como descrito no lema.k = 0xyc
Caso indutivo: assuma que a afirmação vale para qualquer menor que alguns k ' . Agora considere alguns triplos com comprimento de intervalo k ' . Então esse triplo deve ter a forma ( i , l , r ) com r = l + k ′ - 1 e i ∈ { 0 , 1 } . O triplo ( 1 - i , l , r ) também deve estar presente. O número de triplos ( ′kk′k′( i , l , r )r = l + k′- 1i ∈ { 0 , 1 }( 1 - i , l , r ) com l ≤ l ′ ≤ r ′ ≤ r é exatamente r - l + 1 = k ′ . Esses triplos incluem triplos ( 0 , l , r ) e ( 1 , l , r ), mas também k ′ - 2 outros triplos da forma ( α ′ , l ′)( α′, l′, r′)l ≤ l′≤ r′≤ rr - l + 1 = k′( 0 , l , r )( 1 , l , r )k′−2 com l < l ' ≤ r ′ < r . Todos esses outros triplos têm um intervalo menor que k ' , portanto todos devem colocar seus caracteres conforme especificado no lema. A única maneira de isso ocorrer é se esses triplos colocarem caracteres em todos os índices, começando no índice l + 1 e terminando no índice r + 1 . Assim, nossos dois triplos ( 0 , l , r ) e ( 1 , l , r )(α′,l′,r′)l<l′≤r′<rk′l+1r+1(0,l,r)(1,l,r)devem colocar seus caracteres nos índices e r , conforme descrito no lema, concluindo o caso indutivo.lr
Por indução, o lema está correto.