2011-02-14 16 views
6

Estoy trabajando en un programa para convertir autómatas de estados finitos no deterministas (NFA) a autómatas de estados finitos determinísticos (DFA). Para hacer esto, tengo que calcular el cierre épsilon de cada estado en el NFA que tiene una transición épsilon. Ya he descubierto una manera de hacerlo, pero siempre asumo que lo primero que pienso es la forma menos eficiente de hacer algo.¿Cuál es la forma más rápida de calcular un cierre épsilon?

Aquí es un ejemplo de cómo iba a calcular un cierre simple épsilon: cadenas

de entrada para la función de transición: formato se startState, símbolo = estado final

EPS es una transición épsilon

1, EPS = 2

resultados en el nuevo estado {12}

Ahora, obviamente esto es un ejemplo muy sencillo. Necesitaría poder calcular cualquier número de transiciones épsilon desde cualquier número de estados. Con este fin, mi solución es una función recursiva que calcula el cierre épsilon en el estado dado al observar el estado en el que tiene una transición épsilon. Si ese estado tiene (an) transición épsilon, entonces la función se llama recursivamente dentro de un bucle for para tantas transiciones épsilon como tenga. Esto hará el trabajo, pero probablemente no sea la manera más rápida. Así que mi pregunta es esta: ¿cuál es la forma más rápida de calcular un cierre épsilon en Java?

+0

Solo para aclarar: ¿El cierre épsilon de un Epsilon-NFA N es solo un NFA sin transiciones épsilon? – tkr

+0

@tkr un cierre épsilon no se aplica a un NFA. Se aplica a un estado que tiene 1 o más transiciones epsilon a otro (s) estado (s) y devuelve un único estado. Se utiliza para deshacerse de las transiciones épsilon cuando se convierte a un DFA, porque un DFA no puede tener transiciones épsilon. – Darkhydro

+1

@Darkhydro, no se puede simplemente colapsar todos los estados épsilon-alcanzables juntos. Considere s1 - a -> s2, s1 - b -> s3, s2 - eps-> s3, s2 - c -> s4, comenzando el estado s1, aceptando el estado s4. Si contrae s2 y s3 ​​en un solo estado, entonces acepta la cadena bc, que no es aceptada por el NDFA original. –

Respuesta

2

JFLAP hace esto. Puede ver su source - específicamente ClosureTaker.java. Es una búsqueda en profundidad (que es lo que sugirió Peter Taylor), y como JFLAP la usa, supongo que es la solución casi óptima.

+0

Gracias, eche un vistazo – Darkhydro

+0

esta resultó ser la mejor solución. Muy explícito porque puedo ver el código fuente. ¡Gracias! – Darkhydro

4

Profundidad de la primera búsqueda (o la primera búsqueda de amplitud - realmente no importa) sobre el gráfico cuyos bordes son sus transiciones epilson. En otras palabras, su solución es óptima siempre que realice un seguimiento eficiente de los estados que ya ha agregado al cierre.

+0

@Peter búsquedas no son exactamente lo que estoy buscando. Esto es más de un cruce condicional.Sin embargo, mi patrón es muy similar a la búsqueda en profundidad. – Darkhydro

+0

@Darkhydro, ya que entiendo el problema que está buscando para todos los estados épsilon accesibles desde un estado determinado. –

+0

@ Peter que es una forma razonable de ver las cosas. Sin embargo, si una búsqueda solo devuelve un estado, tendría que buscar varias veces para obtener todos los estados, lo que sería más lento que mi implementación porque cada búsqueda comienza de nuevo. – Darkhydro

0

¿Miraste un libro de algoritmos? Pero dudo que encuentres un enfoque significativamente mejor. Pero el rendimiento real de este algoritmo puede depender de la estructura de datos concretos que utilice para implementar su gráfico. Y puedes compartir el trabajo, dependiendo del orden, simplificas tu gráfico. Piense en subgrafos que están conectados epsilon y se hace referencia desde dos nodos diferentes. No estoy seguro de si esto se puede hacer de manera óptima, o si debe recurrir a algunas heurísticas.

Escanee la literatura sobre algoritmos.

+0

Acepto, el rendimiento se basará en la estructura de datos que uso. Si pudieras sugerir una estructura de datos óptima más un algoritmo de recorrido, eso tomaría la torta para la mejor respuesta. Mi estructura de datos actual es simplemente una lista/árbol. – Darkhydro

Cuestiones relacionadas