algoritmos de grafos - sólo "cinco pasos" para obtener todas las rutas entre dos nodos (no recursiva)
En la ejecución del "mapa" estructura de datos, la experiencia " obtener todas las rutas entre dos puntos es " Los problemas algorítmicos, la mayor parte de la información en línea se logran (ver referencia al final del artículo) algoritmo recursivo.
Sabemos que es fácil de hacer que el desbordamiento de pila de llamadas en JS usando el algoritmo recursivo, con el fin de ser capaz de utilizar en un entorno de producción, debe utilizar para lograr una forma no recursiva.
Después de un poco de exploración, las ideas se dieron cuenta principalmente del artículo " buscan entre dos puntos de recorrido algoritmo de todos los caminos ", pero el periódico no dio una detalles de implementación específica, por lo que necesita para alcanzar, y en última instancia de este trabajo, similar a los " Algoritmos - Programación algoritmo de campo (algoritmos Estación de clasificación Mathimatics-numéricos) "mencionado en de doble pila para completar.
1, el proceso de algoritmo
En la figura calculado por el siguiente ejemplo, los nodos 3 a 6-nodo todos los caminos de todos los caminos posibles a 8:
allpath
En concreto, hablamos de cómo conseguir este proceso de ocho vías.
Primero preparó dos pilas, se llama la pila principal y la pila auxiliar :
- Principal de apilado : Cada elemento es un único nodo (Vertex) , para almacenar el nodo en la ruta actual;
- Auxiliar Pila : Cada elemento para el almacenamiento de un elemento correspondiente de la principal de apilado lista de nodos vecino (la matriz de Vertex) ; pila se utiliza para ayudar a la pila principal tiene una longitud y una pila principal de la misma;
1 PASO : construida Pila
El v3
( Nodo 3 ) en la pila principal, mientras que el v3
nodo adyacente de la lista de nodos [v1, v7]
en la pila auxiliar:
El primero fue construido en la pila
La pila principal y la pila auxiliar empujadas por lo que el aumento de longitud de la pila, me llamó personalmente para construir la pila (acumulación de pilas)
2 PASO : para continuar la construcción de la pila
Después de la construcción de la pila, vemos la pila auxiliar, la pila es su lista de nodos [v1, v7]
:
Vista superior de la pila
Se extrajeron el primer elemento de la lista de nodos v1
, que se presiona en la pila principal, mientras que la lista restante de nodos [v7]
de nuevo presionado posterior de pila auxiliar:
Mientras tanto consulta lista de nodos adyacentes V1 está [v3, v0], debido nodo v3 ya está en la pila principal, la necesidad de esta lista excluido (este paso es muy importante), serán excluidos lista de nodos después de [v0] presionado en la pila auxiliar :
Este paso también permite que la pila principal y la longitud de la pila auxiliar aumentaron pilas, que también se construye (acumulación de pilas) proceso
Paso 3: cortar la pila
Continuar con el paso 2 del proceso de construcción de la pila hasta que nuestro principal v7 pila pila, esta vez superior de la pila auxiliar de la pila está lista vacía []:
Desde la parte superior pila auxiliar de la pila está lista vacía [], así que no puedo continuar construyendo la pila - esto indica que este camino llegará a su fin no han encontrado el v6 nodo de destino.
La situación fue a ese ser el caso, tenemos que empezar de nuevo a la espalda, la mirada en el otro tenedor en la carretera había llegado.
Nosotros V7 pila pila principal de oposición, pero también la pila auxiliar lista vacía [] aparecerá:
Esta acción hace que la pila auxiliar y la chimenea principal para reducir la longitud del proceso de corte I pila personalmente llamada (pila cutdown).
Paso 4: Obtener una primera trayectoria
Repetir lo anterior Paso 2, Paso 3, tomar la estrategia:
- Mientras la pila pila auxiliar está lista no vacía, edificaremos pila
- Mientras la parte superior pila auxiliar de la pila es una lista vacía, vamos a cortar la pila
El nodo superior hasta que la pila principal es la v6 nodo de destino:
Estábamos aquí, dejamos de verlo por ustedes mismos, encontramos que los principales contenidos de la pila ya es una ruta completa de V3 a V6 de:
Nos salida del conjunto de pila actual: [ 'V3', 'V1', 'V0', 'V2', 'v5', 'V6'], la matriz representará v3 -> V1 -> v 0 -> V2 -> v5 -> v6 este camino.
Llevado a cabo hasta ahora, por fin tenemos un camino de V3 a V6 de.
Debemos tambor por sus esfuerzos de una palma, ha visto el amanecer de la victoria; el próximo añadir un simple bucle será capaz de obtener todos los caminos.
Paso 5: Obtener todos los caminos
Repita el paso 2 - Paso 4 pasos, tome las siguientes estrategias:
- Mientras la pila pila auxiliar está lista no vacía, edificaremos pila
- Mientras la parte superior pila auxiliar de la pila es una lista vacía, vamos a cortar la pila
- Mientras la parte superior pila principal de la pila es el nodo de destino, que la ruta de salida, en la pila de corte mismo tiempo
El proceso se repite hasta que la pila principal está vacía.
A medida que la construcción de la pila (stack acumulación) y la pila de corte (pila cutdown) Proceso, pila pila primaria y secundaria en constante cambio, en este proceso de cambio que podemos seguir para obtener la ruta de V3 a V6, y en última instancia Puede obtener todos los caminos.
2, la ejecución de código
2.1, pseudocódigo
De acuerdo con el procedimiento descrito anteriormente, es el aspecto del texto en pseudo-código:
BEGIN
初始化主栈
初始化辅栈
首次建栈
WHILE 主栈不为空 THEN
获取辅栈栈顶,为邻接节点列表
IF 邻接节点列表不为空 THEN
获取邻接节点列表首个元素
将该元素压入主栈,剩下列表压入辅栈
建栈
ELSE
削栈
CONTINUE
END IF
IF 主栈栈顶元素 === 目标节点 THEN
获取一条路径,保存起来
削栈
END IF
END WHILE
END
No tomamos el ejemplo anterior es un grafo dirigido, de hecho, este algoritmo es adecuado también para un grafo dirigido.
resumen
En el reciente "mapa" esta estructura de datos, y tratar de forma gradual a escribir código en el proceso para lograr un algoritmo. La experiencia puede obtener un conocimiento sólo después de su propio pensamiento y que se resumen a fin de sentar las bases para el dominio posterior.
En el estudio se resume en este artículo, hay dos experiencia de una impresión más profunda:
- Utilice problema recursivo puede ser resuelto, puede ser generalmente + pila (Stack) manera de resolver circulante.
- Cuando no sabe cómo algoritmo, más adecuado para inductiva Resumen de métodos de aprendizaje, que es empezar poco a poco de la escena de demostración simple, y así sucesivamente y luego se propuso lograr tientas después de lo cual la ley.