Al modelar un autómata determinista de estado finito, ¿qué algoritmo de recorrido gráfico debe usarse?

Por lo general, una restricción-DFS en un gráfico dirigido estaría bien (bueno, no exactamente, pero así es como funcionaría).

Recuerde que deberá procesar la entrada [math] w = w_ {1} w_ {2} … w_ {n} [/ math] carácter por carácter.
Aquí, supongo que [math] w_ {i} [/ math] está en algún alfabeto (llamado [math] \ Sigma [/ math]).

Entonces, básicamente, construirá una Matriz de adyacencia (donde, por supuesto, el número de vértices adyacentes para un estado [matemático] q (i) \ en Q [/ matemático] para un DFA sería [matemático] | \ Sigma | – 1 [/ matemáticas]). Técnicamente, obtendrá una gráfica de edges [matemáticas] = O ((| \ Sigma | – 1) | Q | / 2) [/ matemáticas]. Procesará una entrada w utilizando la definición de la función de transición Delta (y marque cada edge [matemático] A_ {i, j} [/ matemático] de su matriz con el alfabeto de transición correspondiente -> Use un mapa de hash ( key = string(ij) , Value = [matemática] a \ in \ Sigma [/ matemática]).

Algoritmo 1: atravesar la caminata dirigida para la entrada [math] w = w_ {1} .. w_ {n} [/ math]
– Vaya a cada nodo mientras w no está vacío, donde va de [matemática] q (i – 1) [/ matemática] a [matemática] \ delta (q (i – 1) [/ matemática], [matemática] w_ {i} [/ math]) (Use una matriz para almacenar estas transiciones Delta), y luego cuando termine en un estado, puede ver si ese estado [math] q (i) \ en F [/ math], donde [math] F \ subconjunto Q [/ math]. Puede verificar eso en tiempo constante si construye un mapa hash de la key(f) -> value(1) , [matemática] \ para toda f \ en F [/ matemática].
– En esencia, la matriz de función de transición ([matemática] O (| Q || \ Sigma |) [/ matemática]) es todo lo que necesita. Y coloca un ciclo while fuera de él, para que se detenga una vez que haya hecho la transición para todas [matemáticas] w_ {i} [/ matemáticas].
Entonces, el algoritmo sería un DFS ‘guiado’ (básicamente una caminata en el Gráfico Dirigido) en esa entrada, y dado que pasará por una caminata, esa longitud de esa ruta sería [matemática] O (| Q | – 1) [/ math] {si no hay bucles). El límite más ajustado en el tiempo de ejecución de este Algoritmo sería la longitud de la cadena de entrada en sí, que es lo mejor que puede esperar hacer (en este caso, hay bucles, y [matemáticas] | w |> = | Q | [/ matemáticas]).
Para almacenar simplemente el DFA como un gráfico dirigido, la Adjacency Matrix A = Transition function look-up table sería su mejor opción, como se mencionó anteriormente.

Algoritmo 2: enumera el número de rutas entre todos los pares de estados
– Para enumerar simplemente todas las rutas posibles en el DFA, construya la matriz de adyacencia [matemática] A [/ matemática] y repita matrix multiplication para [matemática] log (| Q |) [/ matemática] veces.

while (| _log (Q) _ |! = 0):
A ‘= A * A
A = A ‘
volver A ‘

Esto devolverá una matriz A que contiene el número de rutas desde un estado [matemática] q (i) -> q (j) [/ matemática] en el DFA en cada entrada [matemática] A_ {i, j} [/ matemática ] Recuerde que esta multiplicación debe hacerse significativa. Entonces, por ejemplo, una transición de [matemáticas] A_ {i, j} -> A_ {j, j ^ {‘}} [/ matemáticas] debe concatenarse juntas (suponiendo que compartan un estado de transición común). Del mismo modo, multiplicando una fila y una columna, producirá un cierto número de caminos. Al final de la multiplicación, tendrá un conjunto de los siguientes [matemática] S = \ {(q (i) .. q (i ‘)), (q (j) … q (j’)) \ }[/mates]. Además, tenga en cuenta que el enlace [math] log (| Q |) [/ math] solo le dará las rutas. Como los bucles están permitidos en un DFA, no debe contarlos como rutas, y simplemente agregar una expresión regular cada vez que vea un bucle utilizando la concatenación de Kleene de ese alfabeto. 🙂

¡Espero que esto ayude!

¿Por qué modelarlo, si el modelo se está volviendo más complejo que el real? Simplemente programe una declaración de cambio grande y listo. O trabaje con tablas que le den el siguiente estado y la salida.

More Interesting

¿Cuáles son algunas formas diferentes de calcular la mediana de una matriz en Java?

¿Qué significa importar en Python? ¿Puedo hacer mi propio algoritmo sin usar importar?

¿La programación se trata de definiciones de variables, para bucles, ifs y estructuras de datos?

¿Cuál es la complejidad temporal del montón y el tipo de montón?

Cómo dividir una matriz en 2 nuevas variables de matriz y encontrar el promedio de ellas

¿Cómo ayuda la selección de estructuras de datos apropiadas para diseñar mejores algoritmos?

¿Puede una máquina Turing aceptar una cadena de longitud 2014? ¿Por qué este problema es indecidible?

¿Qué tan rápido irá un bote de semi desplazamiento de 24.5 m LWL x 6.4 m con una viga de 80 t con 1200 hp? ¿Tiene actualmente 2700 hp y pesa 85 t y va a 34 kts?

¿Existe evidencia de que el algoritmo de sugerencia de música basada en el genoma de Pandora es mejor que los algoritmos de recomendación estándar?

¿Cómo 'entiende' el hardware de la computadora los dígitos binarios?

¿Los ingenieros de software de Google, Amazon, etc. utilizan estructuras de datos y algoritmos en el desarrollo de aplicaciones en tiempo real?

¿La programación genética y los algoritmos genéticos son iguales?

¿Se puede demostrar que es imposible volver a un entero inicial mayor que uno si aplica un algoritmo de multiplicar por tres y agregar uno cuando es impar y dividir por dos si es par?

Si saco el bucle for más interno de un bucle for anidado y lo ejecuto solo, ¿cambiará la complejidad del tiempo?

Cómo hacer un motor de búsqueda usando un algoritmo