¿BFS es más rápido y más eficiente que DFS?

Por supuesto no. Estos algoritmos son exactamente equivalentes.

Como saben, la única diferencia efectiva entre DFS y BFS es el tipo de estructura de datos que utilizamos para realizar un seguimiento de los nodos que se encuentran en nuestra “ruta de descubrimiento”.

En BFS, utilizamos un principio de Primero en entrar, primero en salir, porque vamos “primero en amplitud”. Es decir, cuando estoy procesando un nodo, quiero procesar a todos sus vecinos, antes de pasar a otros nodos más profundos. Por lo tanto, utilizamos una cola, y eso nos permite pelar una capa de profundidad a la vez, explorando todo el ancho de una capa más superficial de nodos antes de pasar a los más profundos.

Por otro lado, DFS, al ser “primero en profundidad”, requiere que hagamos todo lo contrario: profundizar antes de ir a lo ancho. Entonces, dado que lo más profundo debería venir antes , empleamos un enfoque de último en entrar , primero en salir, mediante el uso de una pila.

Sin esa diferencia, el algoritmo se reduce a “elegir un nodo de un almacén de nodos, procesarlo de alguna manera y luego agregar sus vecinos al almacén de nodos

Entonces, ¿se trata de si es “más rápido o más eficiente” usar una cola o una pila? Estoy seguro de que puede ver cómo se pueden implementar ambos para tener O (1) operaciones push y pop con las mismas estructuras de datos subyacentes, por lo que su rendimiento es bastante similar.

Desde el punto de vista de los algoritmos, ambos algoritmos funcionan en el peor momento del tiempo O (V + E) pero realmente depende de la tarea en cuestión. Si el problema es encontrar una ruta desde una ubicación a otra, BFS sería más eficiente, ya que le brinda la ruta más rápida desde un punto de partida hasta un punto final en un gráfico. No se garantiza que DFS le brinde la ruta más corta porque procesa nodos basados ​​en una pila y no en una cola.

En la imagen mostrada arriba, si consideramos que la esquina suroeste es el nodo final y la esquina noroeste es el punto de partida, BFS termina en solo 5 pasos mientras DFS atraviesa todo el tablero solo para llegar a la meta. Hacer un escaneo completo de la placa llevará la misma cantidad de tiempo para ambos algoritmos.

El tiempo de ejecución será el mismo para buscar en todo el gráfico. En un gráfico muy grande, BFS tiene una desventaja, ya que debe contener un número exponencial de elementos en la cola en relación con la profundidad de la búsqueda, mientras que la pila DFS solo tendrá un número lineal de elementos equivalente a la profundidad de la ruta de búsqueda .

Debido a esto, hay una variante llamada “búsqueda limitada en profundidad” que tiene las propiedades de memoria de DFS y posiblemente tiene la propiedad “óptima” de BFS dependiendo de cómo se implemente. Si tiene una buena idea de la profundidad de su objetivo desde el punto de partida, esta es una buena opción.

Aquí hay un código de muestra en Python para BFS / DFS:

búsqueda de definición (inicio):
visto = {inicio}
pendiente = DataStructure ()
pendiente.push (inicio)
mientras está pendiente:
actual = pendiente.pop ()
para vecino en vecinos actuales:
si vecino no en visto:
seen.add (vecino)
pendiente.push (vecino)

Si DataStructure es una pila, es un DFS. Si DataStructure es una cola, es un BFS. Esa es la única diferencia. Entonces, si va a buscar en todo, el tiempo de ejecución será el mismo para cualquier opción. La única diferencia real es cuán grande se pone pendiente. Tiende a agrandarse para BFS, por lo que podemos decir que un DFS es más eficiente. Esto puede hacer que el DFS se ejecute un poco más rápido para muchas implementaciones comunes de pila / cola.

Si no está buscando en todo el gráfico, uno u otro puede ser más rápido según sus criterios de detención. Si está buscando en un gráfico de red social, encontrará amigos de amigos mucho más rápido con BFS, pero extraños al azar pueden aparecer antes con DFS.

La mayoría de los algoritmos BFS hacen un DFS abreviado antes de recorrer la amplitud de cada lista de adyacencia, colocando este resultado en una cola que luego se recorre. Por esta razón, es el doble de lento que DFS como mínimo.

Sin embargo, la ventaja es que si está buscando vecinos cercanos, este sistema es más rápido que DFS. Si desea verificar qué tan cerca, compáreme con Stan Hanks en Quora buscando en mi gráfico de seguidor a través de DFS.

Para encontrarlo, necesitará muchos pases, potencialmente tantos como los usuarios existentes de Quora menos 1 (yo mismo). Pero, si hicieras un BFS, lo encontrarías en no más de 1,244 pases (el número de mis seguidores).

Depende de

  1. Caso de uso y
  2. Buscar jerarquía espacial y dominio.