tutoriales.com

Dominando los Algoritmos de Búsqueda en Grafos: BFS y DFS Desvelados

Este tutorial explora a fondo los algoritmos de búsqueda en grafos más fundamentales: Búsqueda en Amplitud (BFS) y Búsqueda en Profundidad (DFS). Aprenderás su funcionamiento, diferencias clave y aplicaciones prácticas, desde rutas en mapas hasta análisis de redes.

Intermedio15 min de lectura5 views10 de marzo de 2026Reportar error

Dominando los Algoritmos de Búsqueda en Grafos: BFS y DFS Desvelados ✨

Los grafos son estructuras de datos increíblemente versátiles que modelan relaciones entre entidades. Piensa en redes sociales, mapas de carreteras, circuitos eléctricos o incluso la estructura de una molécula. Para navegar por estas intrincadas redes, necesitamos herramientas poderosas: los algoritmos de búsqueda. En este tutorial, desentrañaremos dos de los más importantes y fundamentales: la Búsqueda en Amplitud (BFS) y la Búsqueda en Profundidad (DFS).

Preparado para explorar el fascinante mundo de los grafos? ¡Vamos a ello!


📖 ¿Qué es un Grafo? Una Breve Introducción

Antes de sumergirnos en los algoritmos, recordemos qué es un grafo. Un grafo G se define como un par (V, E), donde:

  • V es un conjunto de vértices (también llamados nodos).
  • E es un conjunto de aristas (también llamadas enlaces), que conectan pares de vértices.

Los grafos pueden ser:

  • Dirigidos (digrafos): Las aristas tienen una dirección. P.ej., un camino de A a B no implica un camino de B a A.
  • No dirigidos: Las aristas no tienen dirección. Si A está conectado a B, B también está conectado a A.
  • Ponderados: Las aristas tienen un 'peso' o 'costo' asociado. P.ej., la distancia entre dos ciudades.
  • No ponderados: Las aristas no tienen un costo asociado, simplemente indican conexión.

Para nuestros algoritmos BFS y DFS, nos centraremos principalmente en grafos no dirigidos y no ponderados, ya que son la base para entender conceptos más avanzados.

📌 Nota: Los grafos son la columna vertebral de muchos problemas de optimización y análisis en ciencias de la computación e ingeniería.

🎯 Búsqueda en Amplitud (BFS): Explorando Capa por Capa

¿Qué es BFS? El Algoritmo del Explorador Amplio

La Búsqueda en Amplitud (Breadth-First Search, BFS) es un algoritmo para recorrer o buscar elementos en un grafo o estructura de árbol. Su característica principal es que explora todos los vecinos de un nodo antes de pasar a los vecinos de sus vecinos. Imagina que estás arrojando una piedra en un estanque: las ondas se expanden concéntricamente. BFS funciona de manera similar, visitando todos los nodos a una distancia 'k' de la fuente antes de visitar los nodos a una distancia 'k+1'.

BFS se implementa típicamente usando una cola (queue). Es ideal para encontrar la ruta más corta en grafos no ponderados, ya que visita los nodos por niveles.

🛠️ ¿Cómo funciona BFS? Paso a Paso

  1. Inicialización:

    • Elige un nodo de inicio S.
    • Marca S como visitado y agrégalo a la cola.
    • Inicializa la distancia de S a 0 y la de todos los demás a infinito.
  2. Proceso:

    • Mientras la cola no esté vacía:
      • Desencola un nodo U.
      • Para cada vecino V de U:
        • Si V no ha sido visitado:
          • Marca V como visitado.
          • Establece la distancia de V como distancia(U) + 1.
          • Agrega V a la cola.

Este proceso garantiza que los nodos se visiten en orden de su distancia mínima desde el nodo fuente.

📊 Visualización de BFS

Consideremos el siguiente grafo no dirigido:

A B C D E F G

Si empezamos BFS desde el nodo A:

Paso 1: Cola = [A]. Visitados = {A}
Paso 2: Desencola A. Vecinos de A: B, C, D. Encola B, C, D. Visitados = {A, B, C, D}. Cola = [B, C, D]
Paso 3: Desencola B. Vecinos de B: A (visitado), E, F. Encola E, F. Visitados = {A, B, C, D, E, F}. Cola = [C, D, E, F]
Paso 4: Desencola C. Vecinos de C: A (visitado), F, G. Encola G. Visitados = {A, B, C, D, E, F, G}. Cola = [D, E, F, G]
Paso 5: Desencola D. Vecinos de D: A (visitado), G. No se encolan nuevos. Cola = [E, F, G]
Paso 6: Desencola E. Vecinos de E: B (visitado), F. No se encolan nuevos. Cola = [F, G]
Paso 7: Desencola F. Vecinos de F: B (visitado), C (visitado), E (visitado), G. No se encolan nuevos. Cola = [G]
Paso 8: Desencola G. Vecinos de G: C (visitado), D (visitado), F (visitado). No se encolan nuevos. Cola = []
Final: Cola vacía. Todos los nodos visitados en el orden de amplitud.

El orden de visita sería A -> B -> C -> D -> E -> F -> G (puede variar si los vecinos se exploran en diferente orden, pero los niveles se mantienen).

💡 Aplicaciones de BFS

  • Ruta más corta en grafos no ponderados: Es la aplicación más directa. Si buscas la menor cantidad de 'saltos' entre dos puntos, BFS es tu algoritmo.
  • Rastreo web (Web Crawling): Los motores de búsqueda usan un enfoque similar a BFS para descubrir nuevas páginas web, explorando enlaces salientes.
  • Componentes conectados: Identificar todos los nodos accesibles desde un punto de partida.
  • Problemas de redes: Encontrar el camino más corto en una red de computadoras, por ejemplo.
  • Análisis de redes sociales: Encontrar el grado de separación entre personas.

⚖️ Complejidad de BFS

La complejidad temporal de BFS es O(V + E), donde V es el número de vértices y E es el número de aristas. Esto se debe a que cada vértice y cada arista se visitan a lo sumo una vez. La complejidad espacial también es O(V) en el peor de los casos, para almacenar la cola.


🔥 Búsqueda en Profundidad (DFS): Sumergiéndonos en el Grafo

¿Qué es DFS? El Algoritmo del Explorador Profundo

La Búsqueda en Profundidad (Depth-First Search, DFS) es otro algoritmo para recorrer o buscar elementos en un grafo o estructura de árbol. A diferencia de BFS, DFS explora tan profundamente como sea posible a lo largo de cada rama antes de retroceder. Piensa en un laberinto: vas por un camino hasta el final, y si no encuentras la salida, retrocedes y pruebas otro camino.

DFS se implementa típicamente usando una pila (stack) o, más comúnmente, a través de la recursión (que utiliza la pila de llamadas implícitamente).

🛠️ ¿Cómo funciona DFS? Paso a Paso

  1. Inicialización:

    • Elige un nodo de inicio S.
    • Marca S como visitado.
    • Agrega S a la pila (o llama a la función recursiva con S).
  2. Proceso (usando recursión):

    • Función DFS(nodo U):
      • Marca U como visitado.
      • Para cada vecino V de U:
        • Si V no ha sido visitado:
          • Llama recursivamente a DFS(V).

El algoritmo retrocede cuando no hay más nodos no visitados accesibles desde la rama actual.

📊 Visualización de DFS

Usando el mismo grafo anterior, si empezamos DFS desde el nodo A:

A B C D E F G

El orden de visita puede variar dependiendo del orden en que se exploren los vecinos. Asumamos que siempre exploramos de forma alfabética para ser consistentes:

Paso 1: Llamar `DFS(A)`. A visitado. Vecinos de A: B, C, D.
Paso 2: Llamar `DFS(B)`. B visitado. Vecinos de B: A (visitado), E, F.
Paso 3: Llamar `DFS(E)`. E visitado. Vecinos de E: B (visitado), F.
Paso 4: Llamar `DFS(F)`. F visitado. Vecinos de F: B (visitado), C, E (visitado), G.
Paso 5: Llamar `DFS(C)`. C visitado. Vecinos de C: A (visitado), F (visitado), G.
Paso 6: Llamar `DFS(G)`. G visitado. Vecinos de G: C (visitado), D, F (visitado).
Paso 7: Llamar `DFS(D)`. D visitado. Vecinos de D: A (visitado), G (visitado). No hay nuevos, retrocede.
Paso 8: Regresar de `DFS(G)`. No hay nuevos, retrocede.
Paso 9: Regresar de `DFS(C)`. No hay nuevos, retrocede.
Paso 10: Regresar de `DFS(F)`. No hay nuevos, retrocede.
Paso 11: Regresar de `DFS(E)`. No hay nuevos, retrocede.
Paso 12: Regresar de `DFS(B)`. No hay nuevos, retrocede.
Paso 13: Regresar de `DFS(A)`. Fin.

Un posible orden de visita sería A -> B -> E -> F -> C -> G -> D.

💡 Aplicaciones de DFS

  • Detección de ciclos en grafos: Si durante un DFS encuentras un nodo visitado que no es el padre directo, hay un ciclo.
  • Orden topológico: Para grafos dirigidos acíclicos (DAGs), DFS puede producir un orden topológico de los vértices, útil en planificación de tareas.
  • Componentes fuertemente conectados: Identificar subgrafos donde cada nodo es alcanzable desde cualquier otro nodo dentro del mismo subgrafo.
  • Resolución de laberintos: DFS es muy intuitivo para este tipo de problemas, buscando un camino hasta el final.
  • Búsqueda de caminos (pathfinding): Encontrar si existe un camino entre dos nodos (no necesariamente el más corto).

⚖️ Complejidad de DFS

Al igual que BFS, la complejidad temporal de DFS es O(V + E). Cada vértice y cada arista se procesan a lo sumo una vez. La complejidad espacial es O(V) en el peor de los casos, debido al uso de la pila de recursión (o una pila explícita) que puede almacenar hasta V vértices en una ruta larga.


🆚 BFS vs. DFS: Un Duelo de Estrategias

Aunque ambos algoritmos exploran grafos, su estrategia fundamental es muy diferente, lo que los hace adecuados para distintos problemas.

🔥 Importante: La elección entre BFS y DFS depende del problema específico que intentas resolver.

Aquí tienes una tabla comparativa clave:

CaracterísticaBúsqueda en Amplitud (BFS)Búsqueda en Profundidad (DFS)
Estructura de DatosCola (Queue)Pila (Stack) o Recursión
EstrategiaExplora nivel por nivel, capa por capaExplora lo más profundo posible por una rama
Objetivo ComúnEncontrar la ruta más corta en grafos no ponderadosDetección de ciclos, orden topológico, búsqueda de caminos
ComportamientoExpansivo,

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!