Testando se as letras podem ser agendadas para obter uma palavra em um idioma regular


23

I corrigir uma linguagem regular L em um alfabeto Σ , e eu considere o seguinte problema que eu chamo carta agendamento para L . Informalmente, a entrada me fornece n letras e um intervalo para cada letra (ou seja, uma posição mínima e máxima), e meu objetivo é colocar cada letra em seu intervalo, de modo que não haja duas letras mapeadas para a mesma posição e para que as resultante n palavra -letter é em L . Formalmente:

  • Entrada: n triplos (ai,li,ri) onde aiΣ e 1lirin são números inteiros
  • Saída: existe uma bijeção f:{1,,n}{1,,n} tal que lif(i)ri para todo i , e af1(1)af1(n)L .

Obviamente, esse problema está no NP, adivinhando uma bijeção f e verificando a associação como L no PTIME. Minha pergunta: Existe uma linguagem regular L modo que o problema de agendamento de letras para L seja difícil de NP?

Algumas observações iniciais:

  • Parece que problemas semelhantes foram estudados no agendamento: poderíamos ver o problema como agendando tarefas de custo unitário em uma única máquina, respeitando as datas de início e término. No entanto, esse último problema está obviamente no PTIME com uma abordagem gananciosa, e não vejo nada na literatura de agendamento para o caso em que as tarefas são rotuladas e gostaríamos de obter uma palavra no idioma normal de destino.
  • Uma outra maneira de ver o problema é como um caso especial de um problema de correspondência máxima bipartida (entre letras e posições), mas, novamente, é difícil expressar a restrição de que devemos cair em L .
  • No caso específico em que L é um idioma da forma u para alguma palavra fixa u (por exemplo, (ab) )), o problema de agendamento de letras para L está em PTIME com um algoritmo fácil e ganancioso: construa a palavra da esquerda para a direita e coloque em cada posição uma das letras disponíveis que seja correta em relação a L e tenha o menor tempo ri . (Se não houver letras disponíveis corretas, falhe.) No entanto, isso não generaliza para idiomas regulares arbitrários L porque para esses idiomas podemos ter a opção de qual tipo de letra usar.
  • Parece que um algoritmo dinâmico deve funcionar, mas na verdade não é tão simples: parece que você precisaria memorizar qual conjunto de letras que você levou até agora. De fato, ao criar uma palavra da esquerda para a direita, quando você atinge uma posição , seu estado depende das letras que você consumiu até o momento. Você não pode memorizar todo o conjunto, pois haveria muitos estados exponencialmente. Mas não é tão fácil "resumir" (por exemplo, quantas cópias de cada carta foram usadas), porque para saber quais cópias você usou, parece que você precisa se lembrar de quando as consumiu (quanto mais tarde você as consumiu). eles, mais cartas estavam disponíveis). Mesmo com um idioma como ( a b | b a ) i(ab|ba), Já pode ser complicada restrições sobre quando você deve optar por tomar e quando você deve optar por tomar b umabba , dependendo de qual letras você vai precisar mais tarde e quando as cartas estiverem disponíveis.
  • No entanto, como o idioma regular é fixo e não pode memorizar tanta informação, estou tendo dificuldade em encontrar um problema difícil de NP do qual eu possa reduzir.L

Você pode obter NP-completeness para alguns L em PTIME?
Lance Fortnow

3
@LanceFortnow Sure. Você pode preencher um 3CNF para que todas as variáveis ​​ocorram em número par de literais e a cada duas ocorrências consecutivas sejam negadas. Codifique em 0 i ou 1 i ; em seguida, na instância de agendamento de letras, os símbolos ( , ) , , são fixos, enquanto os demais são metade de 0 e metade de 1 . No tempo polinomial, pode-se verificar se a sequência codifica um 3CNF acolchoado que é avaliado como verdadeiro. xi0i1i(,),,01
Willard Zhan

Você também pode generalizar o problema para "posições arbitrárias" (não se limitando a 1..n). Talvez seja mais fácil provar dureza (se for difícil).
Marzio De Biasi

@MarzioDeBiasi: Não sei ao certo, você quer dizer que a posição das letras pode ser qualquer subconjunto arbitrário em vez de um intervalo? Eu não sei se isso é difícil (ele começa a se parecer um pouco com o exato problema de correspondência perfeita ), mas a versão com intervalos permite um algoritmo ganancioso quando por isso tenho alguma esperança de que seja mais fácil. L=u
A3nm 02/03

@ a3nm: não, quero dizer que você pode generalizar a eliminação da restrição ; você pede uma palavra em L na qual exista pelo menos uma letra a i no intervalo [ l i . . r i ] ; em outras palavras, você não "constrói" a palavra completa de comprimento n , mas solicita uma palavra de comprimento arbitrário que contenha as letras dadas nos intervalos permitidos. Não sei se isso altera a complexidade do problema, mas, neste caso, você deve enfrentar "índices" que possivelmente não são polinomialmente limitados pelo comprimento da entrada. rinai[li..ri]n
Marzio De Biasi

Respostas:


7

O problema é NP-difícil para em que A é o idioma finita que contém as seguintes palavras:L=AA

  • , x 000 ,x111x000
  • , y 010 , y 001 ,y100y010y001
  • , 01 c 10 , 10 c 01 e 11 c 0000c1101c1010c0111c00

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}(1i,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<lr<rl<lr<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)llrrrl+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 - 24ciAi1i+201i2e 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<rlri , ( 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)01(l,i1)(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,i2)(i+1,r)lrlr

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)lr

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 ( kkk(i,l,r)r=l+k1i{0,1}(1i,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)llrrrl+1=k(0,l,r)(1,l,r)k2 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<lr<rkl+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.


Muito obrigado por essa prova elaborada e com uma linguagem muito simples! Eu acho que está correto, a única coisa que não tenho certeza é a afirmação de que "a adição do vértice cruzado não pode fazer com que nenhuma aresta adicional seja cruzada". Não seria possível que o intervalo incluísse algum outro intervalo ( l , r ) com l l r r e agora um de ( l , i - 1 ) e ( i + 2(l,r)(l,r)llrr(l,i1) atravessa? Parece que o processo ainda precisa convergir porque os intervalos diminuem, mas isso também não é totalmente claro devido à inserção de vértices cruzados. Como devo ver isso? (i+2,r)
a3nm

Se , é possível inserir os novos índices para o novo vértice de cruzamento imediatamente à direita de l ' . Isso faz com que os novos índices ( i ± um pouco) estejam exatamente naqueles intervalos que costumavam conter l ' . Deve ser fácil ver que a adição de um vértice de cruzamento pode adicionar um novo cruzamento com outro intervalo apenas se os novos índices caírem no outro intervalo. Se l < l < r < r , os novos índices não se enquadram no intervalo (l<l<r<rli±ll<l<r<r . Se l < l " < r " < r , em seguida, os novos índices pode cair no intervalo ( l " , r " ) , mas somente se l ' já caiu em que(l,r)l<l<r<r(l,r)l
Mikhail Rudoy

intervalo (continuação). Neste caso, você não está realmente criando um novo cruzamento, virando uma travessia de idade com o velho intervalo em um novo cruzamento com o intervalo ( i + algo , r )(l,r)(i+something,r)
Mikhail Rudoy

Acho que na sua segunda mensagem você quis dizer "com o intervalo antigo " em vez de " ( l , r ) "? Mas tudo bem, entendo: quando você adiciona o vértice de cruzamento, o único caso ruim seria um intervalo I que se sobrepõe a um novo intervalo sem se sobrepor ao intervalo correspondente. Isso não pode acontecer para os superconjuntos de ( l , r ) ou de ( l ' , r ' ) : se eles se sobrepõem a um novo intervalo, sobrepõem-se ao antigo. Da mesma forma para subconjuntos de ( l(l,r)(l,r)I(l,r)(l,r) ou ( l ' , r ' ) pelo motivo que você explica. Então, eu concordo que essa prova parece correta para mim. Obrigado novamente! (l,r)(l,r)
a3nm

2

O @MikhailRudoy foi o primeiro a mostrar dureza NP, mas Louis e eu tivemos uma ideia diferente, que achei que poderia delinear aqui, pois funciona de maneira um pouco diferente. Reduzimos diretamente do CNF-SAT, o problema de satisfação booleana dos CNFs . Em troca disso, a linguagem regular que usamos é mais complicada.L

A chave para mostrar dureza é projetar uma linguagem que permita adivinhar uma palavra e repeti-la várias vezes. Especificamente, para qualquer número k de variáveis ​​e número m de cláusulas, criaremos intervalos que garantam que todas as palavras w de L ' que possamos formar devem começar com uma palavra arbitrária u de comprimento k no alfabeto { 0 , 1 } (intuitivamente codificando um palpite da avaliação das variáveis) e, em seguida, essa palavra u é repetida mLkmwLuk{0,1}um times (que usaremos posteriormente para testar se cada cláusula é atendida pela avaliação adivinhada).

Para conseguir isso, corrigiremos o alfabeto e o idioma: L : = ( 0 | 1 ) ( # ( 00 | 11 ) ) # ( 0 | 1 ) . A reivindicação formal é um pouco mais complicada:A={0,1,#,0,1}L:=(0|1)(#(00|11))#(0|1)

Reivindicação: Para qualquer número , podemos construir em PTIME um conjunto de intervalos de modo que as palavras em L que podem ser formadas com esses intervalos sejam precisamente:k,mNL

{u(#(u~u~)#(uu))m#u~u{0,1}k}

onde indica o resultado da inversão da ordem de u e trocando 0 's e 1 ' s, em que L ' indica o resultado da adição de uma plica para todas as letras em U , e onde x y por duas palavras x de y de length p é a palavra do comprimento 2 p formada tomando, alternativamente, uma letra de x e uma letra de y .u~u01uuxyxyp2pxy

Aqui está uma explicação intuitiva da construção que usamos para provar isso. Começamos com intervalos que codificam o palpite inicial de . Aqui está o gadget para n = 4 (à esquerda) e uma possível solução (à direita):un=4

gadget de escolha

É fácil mostrar a seguinte observação (ignorando por enquanto): as possíveis palavras que podemos formar com esses intervalos são exatamente u # ˜ u para u { 0 , 1 } k . Isso é mostrado essencialmente como o Lema na resposta do @ MikhailRudoy, ​​por indução dos intervalos mais curtos aos mais longos: a posição central deve conter # , as duas posições vizinhas devem conter um 0 e um 1 , etc.Lu#u~u{0,1}k#01

Vimos como fazer um palpite, agora vamos ver como duplicá-lo. Para isso, contaremos com e adicionaremos mais intervalos. Aqui está uma ilustração para k = 3 :Lk=3

gadget de duplicação

Por enquanto, pegue . Observe como, após o primeiro # , devemos enumerar alternativamente uma letra não primitiva e uma primer. Assim, no triângulo sem intervalos, nossa observação acima ainda permanece: mesmo que pareça que esses intervalos tenham mais espaço à direita do primeiro #L:=(0|1)(#(00|11))#(0|1)##, apenas uma posição em cada duas pode ser usada. A mesma afirmação vale para os intervalos tracejados. Agora, reforça ainda mais que, quando enumeramos uma letra não primitiva, a letra inicial que segue deve ser a mesma. Portanto, é fácil ver que as palavras possíveis são exatamente: u # ( ˜ u˜ u ) # u para u { 0 , 1 } k .Lu#(u~u~)#uu{0,1}k

Agora, para mostrar a afirmação, simplesmente repetimos essa construção vezes. Aqui está um exemplo para k = 3 e m = 2 , usando agora a verdadeira definição de L ' acima da declaração do crédito:mk=3m=2L

gadget de duplicação, repetido

Como antes, poderíamos mostrar (por indução em ) que as palavras possíveis são exatamente o seguinte: u ( # ~ u~ u ' # u u ' ) 2 # ~ u para u { 0 , 1 } k . Portanto, essa construção atinge o que foi prometido pela reivindicação.mu(#u~u~#uu)2#u~u{0,1}k

Graças à reivindicação, sabemos que podemos codificar uma estimativa de uma avaliação para as variáveis ​​e repetir a avaliação várias vezes. A única coisa que falta é explicar como verificar se a avaliação satisfaz a fórmula. Faremos isso verificando uma cláusula por ocorrência de . Para fazer isso, observamos que, sem perda de generalidade, podemos assumir que cada letra da palavra é anotada por algum símbolo fornecido como entrada. (Mais formalmente: podemos supor que no problema nós também fornecemos como entrada uma palavra w de comprimento n , e nós perguntar se os intervalos podem formar uma palavra u tal que w u está em LuwnuwuL.) A razão pela qual podemos assumir isso é porque podemos dobrar o tamanho de cada intervalo e adicionar intervalos de unidades (na parte inferior da imagem) em posições ímpares para realizar a anotação da posição par correspondente:

anotações de unidade

Graças a essa observação, para verificar as cláusulas, definiremos nossa linguagem regular como a interseção de duas línguas. O primeiro idioma reforça que a sub-palavra em posições pares é uma palavra em L ' , ou seja, se ignorarmos as anotações, a palavra deve estar em L ' , para que possamos usar a construção da reivindicação e adicionar algumas anotações. O segundo idioma L verificará se as cláusulas são atendidas. Para fazer isso, adicionaremos três letras em nosso alfabeto, para serem usadas como anotações: + , - e ϵ . Na cláusula 1 i mLLLL+ϵ1im, adicionamos intervalos de unidades para anotar por as posições na i- ésima repetição de u correspondentes a variáveis ​​que ocorrem positivamente na cláusula i e anotamos por ~ - as posições correspondentes a variáveis ​​de ocorrência negativa. Anotamos tudo o mais por ~ ϵ . Agora está claro que L pode verificar se a avaliação calculada satisfaz a fórmula, verificando se, entre cada par de símbolos consecutivos # que contêm uma ocorrência de u (ou seja, um par de dois), existe algum literal que satisfaz a cláusula, ou seja, deve haver uma ocorrência da subpalavra + 1+iuiϵL#u+1ou da subpalavra .0

Isto conclui a redução do CNF-SAT e mostra NP-dureza do problema carta programação para a linguagem .L

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.