¿Cómo se rastrea la ruta de una búsqueda en amplitud, tal que en el siguiente ejemplo:
Si busca una clave 11
, devuelva la lista más corta conectando 1 a 11.
[1, 4, 7, 11]
python
algorithm
graph
breadth-first-search
Christopher Markieta
fuente
fuente
Respuestas:
Primero debería echar un vistazo a http://en.wikipedia.org/wiki/Breadth-first_search .
A continuación se muestra una implementación rápida, en la que utilicé una lista de listas para representar la cola de rutas.
Otro enfoque sería mantener un mapeo de cada nodo a su padre y, al inspeccionar el nodo adyacente, registrar su padre. Cuando termine la búsqueda, simplemente retroceda según el mapeo principal.
Los códigos anteriores se basan en el supuesto de que no hay ciclos.
fuente
¡Me gustó mucho la primera respuesta de qiao! Lo único que falta aquí es marcar los vértices como visitados.
¿Por qué tenemos que hacerlo?
Imaginemos que hay otro nodo número 13 conectado desde el nodo 11. Ahora nuestro objetivo es encontrar el nodo 13.
Después de un poco de ejecución, la cola se verá así:
Tenga en cuenta que hay DOS rutas con el número de nodo 10 al final.
Lo que significa que las rutas desde el nodo número 10 se comprobarán dos veces. En este caso, no se ve tan mal porque el nodo número 10 no tiene hijos ... Pero podría ser realmente malo (incluso aquí comprobaremos ese nodo dos veces sin ninguna razón ...) El
nodo número 13 no está en esas rutas para que el programa no regrese antes de llegar a la segunda ruta con el nodo número 10 al final ... y lo volveremos a verificar ...
Lo único que nos falta es un conjunto para marcar los nodos visitados y no volver a comprobarlos.
Este es el código de qiao después de la modificación:
La salida del programa será:
Sin las comprobaciones innecesarias.
fuente
collections.deque
forqueue
as list.pop (0) incurrir enO(n)
movimientos de memoria. Además, por el bien de la posteridad, si desea hacer DFS, simplemente configure,path = queue.pop()
en cuyo caso la variablequeue
realmente actúa como un archivostack
.Codigo muy facil. Sigues agregando la ruta cada vez que descubres un nodo.
fuente
Pensé en intentar codificar esto por diversión:
Si desea ciclos, puede agregar esto:
fuente
Me gusta la primera respuesta de @Qiao y la adición de @ Or. En aras de un poco menos de procesamiento, me gustaría agregar a la respuesta de Or.
En la respuesta de @ Or, hacer un seguimiento del nodo visitado es genial. También podemos permitir que el programa se cierre antes de lo que está actualmente. En algún punto del bucle for
current_neighbour
, tendrá que ser elend
, y una vez que eso suceda, se encontrará la ruta más corta y el programa podrá regresar.Modificaría el método de la siguiente manera, preste mucha atención al bucle for
La salida y todo lo demás será igual. Sin embargo, el código tardará menos en procesarse. Esto es especialmente útil en gráficos más grandes. Espero que esto ayude a alguien en el futuro.
fuente