Tengo un autómata finito no determinista realmente grande y necesito convertirlo al DFA.
Por grande me refiero a más de 40 000 estados. Hasta ahora he realizado algunos experimentos y programado el algoritmo predeterminado que busca en la tabla (como se describe aquí ), pero incluso después de la optimización es bastante lento y consume mucha memoria. Soy consciente del hecho de que el número de estados puede crecer exponencialmente, pero después de la minimización, el DFA resultante tiene aproximadamente 9 000 estados y eso es soportable.
Entonces mi pregunta es, ¿hay algún algoritmo que sea más rápido o más amigable con la memoria?
Respuestas:
¿Has probado el algoritmo de Brzozowski ? El peor tiempo de ejecución es exponencial, pero veo algunas referencias que sugieren que a menudo funciona muy bien, especialmente al comenzar con un NFA que desea convertir a DFA y minimizar.
El siguiente artículo parece relevante:
Evalúa varios algoritmos diferentes para la minimización de DFA, incluida su aplicación a su situación en la que comenzamos con un NFA y queremos convertirlo en un DFA y minimizarlo.
¿Cómo se ve la descomposición de componentes fuertemente conectados (SCC) de su NFA (considerándolo como un gráfico dirigido)? ¿Tiene muchos componentes, donde ninguno de los componentes es demasiado grande? Si es así, me pregunto si sería posible idear un algoritmo de divide y vencerás, donde tomas un solo componente, lo conviertes de NFA a DFA y luego lo minimizas, y luego reemplazas el original con la nueva versión determinada. Esto debería ser posible para los componentes de entrada única (donde todos los bordes en ese componente conducen a un único vértice, el vértice de entrada). No veo de inmediato si sería posible hacer algo así para los NFA arbitrarios, pero si verifica la estructura del SCC, entonces podría determinar si vale la pena explorar este tipo de dirección o no. .
fuente
aparentemente este no es un problema muy bien estudiado en el sentido de algoritmos conocidos / disponibles que no sean la estrategia original / de hace mucho tiempo de "determinar a DFA / minimizar DFA". parece indicar que el paso de determinación es el problemático, pero esto es típico, por supuesto, dado que tiene un peor caso exponencial de espacio / tiempo. tenga en cuenta que hay varios algoritmos de minimización de DFA que pueden variar significativamente en rendimiento en promedio.
también se conoce más informalmente como "minimización de NFA sin determinación" . se sabe que es difícil en el sentido de que, básicamente, ni siquiera hay algoritmos de aproximación a menos que P = Pspace como se muestra en este documento:
sin embargo, este documento considera el caso generalmente poco explorado de algunos algoritmos que no se basan en encontrar el DFA 1 st determinado :
tenga en cuenta que un paquete / implementación disponible públicamente que puede manejar grandes conversiones / minimizaciones de NFA / DFA, etc. generalmente de la manera más eficiente posible es la biblioteca AT&T FSM .
Tiene una estrategia
fsmcompact
que a veces puede ser suficiente:fuente