Encontrando o menor DFA que separa duas palavras sem usar a pesquisa de força bruta?

23

Dadas duas seqüências xey, eu quero criar um DFA de tamanho mínimo que aceite xe rejeite y. Uma maneira de fazer isso é a busca por força bruta. Você enumera o DFA começando pelo menor. Você tenta cada DFA até encontrar um que aceite xe rejeite y.

Quero saber se existe outra maneira conhecida de encontrar ou criar um DFA de tamanho mínimo que aceite xe rejeite y. Em outras palavras, podemos vencer a busca por força bruta?

Mais detalhes:

(1) Eu realmente quero que um algoritmo encontre um DFA de tamanho mínimo, não um DFA de tamanho mínimo.

(2) Não quero apenas saber quão grande ou pequeno é o DFA mínimo.

(3) Bem aqui, estou focado apenas no caso de você ter duas cadeias x e y.


Editar :

Informações adicionais para o leitor interessado:

Suponhamos que e y são as cadeias binárias de comprimento no máximo n . É um resultado conhecido que existe um DFA que aceita x e rejeita y com no máximo xynxy estados. Observe que existem cerca denn DFAs com um alfabeto binário e no máximonn estados. Portanto, a abordagem da força bruta não exigiria que enumerássemos mais denn DFA's. Daqui resulta que a abordagem da força bruta não pode demorar muito mais quennn tempo.nn

Slides que achei úteis: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf

Michael Wehar
fonte
2
@ AndrásSalamon Ainda é NP-completo se os conjuntos a serem distinguidos consistem em apenas uma sequência? Parece-me que isso deve ser razoavelmente tratável.
Mhum
6
@ humm, o problema é que existem muitos idiomas regulares diferentes que separam as duas strings - a minimização do DFA encontrará o melhor autômato para qualquer um desses idiomas, mas não fará nada para compará-lo aos autômatos dos outros idiomas de separação.
David Eppstein
4
Se e y tiverem comprimentos diferentes, com o maior comprimento n , é fácil encontrar rapidamente um DFA com os estados O ( log n ) que os separam: basta usar um ciclo de comprimento p , onde p não se divide | x | - | y | . Encontre p tentando 2 , 3 , 5 , em ordem até encontrar a p apropriada . Se x e y têm o mesmo comprimento, então OxynO(logn)pp|x||y|p2,3,5,pxyconstrução de Robson, em um artigo de 1996, fornece uma máquina simples que pode ser encontrada por uma pesquisa do tamanhoO(n). Nenhuma construção é garantida como o menor DFA. O(n)O(n)
Jeffrey Shallit
3
As anotações de Shallit, vinculadas acima, incluem a observação útil de que o pior caso para o problema de separação é quando o alfabeto é binário: sempre é possível particionar alfabetos maiores em dois subconjuntos que ainda distinguem as duas palavras de entrada e procurar um autômato binário que trate letras em um subconjunto como zeros e letras no outro subconjunto como zeros. Mas, para procurar o autômato de separação mínimo, isso não parece ajudar, porque você pode usar as informações extras do alfabeto original para obter um desempenho melhor do que com um mapeamento para um alfabeto binário.
David Eppstein
3
um caso especial dessa outra pergunta recente em que os tamanhos de entrada e saída são iguais a 1. autômatos finitos mínimos dados em palavras e palavras em saída . Essa resposta lista algumas literaturas de aprendizado, incluindo algumas heurísticas.
precisa saber é

Respostas:

9

Se eu tivesse que fazer isso na prática, usaria um solucionador SAT.

A questão de saber se existe um DFA com estados que aceita x e rejeita y pode ser facilmente expressa como uma instância SAT. Por exemplo, uma maneira é ter 2 k 2 variáveis ​​booleanas: z s , b , t é verdadeiro se o DFA fizer a transição do estado s para o estado t no bit de entrada b . Em seguida, adicione algumas cláusulas para impor que este é um DFA e algumas variáveis ​​e cláusulas para impor que ele aceitakxy2k2zs,b,tstb rejeita yxy .

Agora use a pesquisa binária em para encontrar o menor k, de modo que exista um DFA desse tipo. Com base no que li em artigos sobre problemas relacionados, eu esperaria que isso fosse razoavelmente eficaz na prática.kk


Outras codificações como SAT são possíveis. Por exemplo, podemos usar uma codificação de rastreamento:

  • Se é de comprimento m , você poderia adicionar m lg k variáveis booleanas: Let s 0 , s 1 , ... , s m ser a seqüência de estados atravessados na entrada x , e representam cada um s i usando lg k variáveis booleanas.xmmlgks0,s1,,smxsilgk

  • Agora, para cada , de modo que x i = x j , você tem a restrição de que s i - 1 = s j - 1i,jxi=xj .si1=sj1si=sj

  • Em seguida, estenda-o para manipular : seja t 0 , , t n a sequência de estados percorridos na entrada y e represente cada t j usando variáveis ​​booleanas lg k . Para cada i , j , de modo que y i = y j , adicione a restrição de que t i - 1 = t j - 1yt0,,tnytjlgki,jyi=yj .ti1=tj1ti=tj

  • Da mesma forma, para cada tal quei,j , adicione a restrição de que s i - 1 = t j - 1xi=yj .si1=tj1si=tj

  • Ambos os rastreios devem começar a partir do mesmo ponto inicial, portanto, adicione o requisito que (WLOG você pode solicitar s 0 = t 0 = 0 ).s0=t0s0=t0=0

  • Para garantir que o DFA usa apenas estados, exigem que 0 s i < k e 0 t j < k para todos i , j .k0si<k0tj<ki,j

  • Finalmente, para codificar o requisito de que é aceito e y é rejeitado, exija que s mt n .xysmtn

Todos esses requisitos podem ser codificados como cláusulas SAT.

Como antes, você usaria a pesquisa binária em para encontrar o menor k para o qual esse DFA existe.kk

DW
fonte
3
observe que, na verdade, isso será superior à pesquisa de força bruta se houver certas simetrias no problema e elas forem reconhecidas pelo solucionador, mas atualmente pode ser difícil identificar / isolar essas (seja humana ou máquina). há também alguma "tecnologia" mais recente / relacionada, de teorias de módulos de satisfação e programação de conjuntos de respostas, algumas das quais têm predicados de gráfico "embutidos" ou podem suportar suas definições.
vzn