Eu tenho um autômato finito não determinístico muito grande e preciso convertê-lo no DFA.
Em geral, quero dizer 40.000 estados. Até agora, fiz alguns experimentos e programei o algoritmo padrão que pesquisa na tabela (como descrito aqui ), mas mesmo após a otimização é muito lento e consome muita memória. Estou ciente do fato de que o número de estados pode crescer exponencialmente, mas após a minimização, o DFA resultante tem cerca de 9.000 estados e isso é suportável.
Então, minha pergunta é: existe algum algoritmo que seria mais rápido ou mais amigável à memória?
Respostas:
Você já experimentou o algoritmo de Brzozowski ? No pior dos casos, o tempo de execução é exponencial, mas vejo algumas referências sugerindo que ele costuma ter um desempenho muito bom, especialmente ao iniciar com um NFA que você deseja converter em um DFA e minimizar.
O documento a seguir parece relevante:
Ele avalia vários algoritmos diferentes para a minimização do DFA, incluindo a aplicação deles à sua situação em que começamos com um NFA e queremos convertê-lo em um DFA e minimizá-lo.
Como é a decomposição dos componentes fortemente conectados (SCC) do seu NFA (considerando-o como um gráfico direcionado)? Possui muitos componentes, onde nenhum deles é muito grande? Nesse caso, gostaria de saber se seria possível criar um algoritmo de dividir e conquistar, no qual você pega um único componente, converte-o do NFA para o DFA, minimiza-o e depois o substitui pelo original pela nova versão determinada. Isso deve ser possível para componentes de entrada única (onde todas as arestas desse componente levam a um único vértice, o vértice de entrada). Não vejo imediatamente se seria possível fazer algo assim para NFAs arbitrárias, mas se você verificar como é a estrutura do SCC, poderá determinar se vale a pena explorar ou não esse tipo de direção .
fonte
aparentemente, esse não é um problema muito estudado no sentido de algoritmos conhecidos / disponíveis, além da estratégia original / de muito tempo atrás de "determinar o DFA / minimizar o DFA". você parece indicar que a etapa de determinação é a problemática, mas isso é típico, é claro, uma vez que possui uma situação exponencial de espaço / tempo. observe que existem vários algoritmos de minimização do DFA que podem variar significativamente em desempenho em média.
também é conhecido mais informalmente como "minimização de NFA sem determinação" . sabe-se que é difícil no sentido de que basicamente não existem algoritmos de aproximação, a menos que P = Pspace, como mostrado neste artigo:
no entanto, este papel não considerar o caso em geral pouco explorado de alguns algoritmos que não são baseadas em encontrar o determinized DFA 1 st :
observe que um pacote / implementação disponível ao público que pode lidar com grandes conversões / minimizações de NFA / DFA etc. geralmente de maneira mais eficiente possível é a biblioteca AT&T FSM .
tem uma estratégia
fsmcompact
que às vezes é suficiente:fonte