Encuentra toda la posible hoja de ruta

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:

  1. Utilice problema recursivo puede ser resuelto, puede ser generalmente + pila (Stack) manera de resolver circulante.
  2. 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.

 

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/rednodel/p/12504837.html
Recomendado
Clasificación