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]).
- ¿Cuál es la mejor manera de aprender la estructura de datos y el algoritmo para un programador promedio?
- ¿Cuál es un mejor enfoque al aprender algoritmos y estructuras de datos, primero la implementación o el primer análisis?
- ¿Cómo funciona 'Un algoritmo neuronal de estilo artístico'?
- ¿De qué sirve el hashing en C?
- Cómo escribir algoritmos de programación eficientes
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!