Menu
Coddy logo textTech

Búsqueda en anchura (BFS)

Última actualización

La búsqueda en anchura explora un grafo nivel por nivel. Partiendo de un nodo origen, visita primero todos sus vecinos inmediatos, luego todos los vecinos no visitados de estos, y así sucesivamente - expandiéndose hacia afuera en anillos de distancia creciente. Pulsa reproducir arriba para verla abrirse desde el nodo inicial una capa a la vez.

BFS usa una cola de tipo primero en entrar, primero en salir, que es lo que impone el orden nivel por nivel. Como alcanza los nodos en orden de distancia en saltos, BFS encuentra el camino más corto (menos aristas) en un grafo no ponderado. Visita cada nodo y arista una vez, por lo que se ejecuta en tiempo O(V + E).

Complejidad temporal y espacial

MedidaComplejidadNotas
TiempoO(V + E)Cada vértice y arista se visita una vez
EspacioO(V)Cola + conjunto de visitados, en el peor caso todos los nodos
RecorridoNivel por nivelLos nodos más cercanos primero, en anillos
Camino más cortoSí (no ponderado)Alcanza cada nodo con menos aristas

Paso a paso

PasoQué ocurre
1Encola el nodo origen.
2Desencola el nodo del frente y márcalo como visitado.
3Examina cada uno de sus vecinos.
4Encola cualquier vecino que no esté ya visitado o en cola.
5Repite hasta que la cola esté vacía.

Ejemplo resuelto

Recorriendo este grafo desde el nodo 0, donde 0-1, 0-2, 1-3, 2-3, 2-4 son aristas:

PasoVisitadosCola (frontera)
Inicio{}[0]
Desencola 0{0}[1, 2]
Desencola 1{0, 1}[2, 3]
Desencola 2{0, 1, 2}[3, 4]
Desencola 3{0, 1, 2, 3}[4]
Desencola 4{0, 1, 2, 3, 4}[] (fin)

Cuándo usar BFS

Úsalo cuandoEvítalo cuando
Necesitas el camino más corto en un grafo no ponderadoLas aristas tienen pesos - usa Dijkstra en su lugar
Es probable que el objetivo esté cerca del origenEl grafo es muy ancho - la cola puede contener una frontera enorme
Quieres explorar un grafo en orden por nivelesSolo necesitas alcanzar cualquier nodo, donde DFS usa menos memoria
Buscas componentes conexas o una ruta de mínimos saltosNecesitas ordenamiento topológico o detección de ciclos - DFS encaja mejor

Una implementación limpia y ejecutable de Breadth-First Search en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Breadth-First Search en Python

Python
1from collections import deque2
3
4def bfs(graph, start):5    visited = {start}6    queue = deque([start])7    order = []8    while queue:9        node = queue.popleft()10        order.append(node)11        for neighbor in graph[node]:12            if neighbor not in visited:13                visited.add(neighbor)  # mark on enqueue, not dequeue14                queue.append(neighbor)15    return order16
17
18graph = {19    "A": ["B", "C"],20    "B": ["D", "E"],21    "C": ["F"],22    "D": [],23    "E": ["F"],24    "F": [],25}26
27print("BFS order:", " -> ".join(bfs(graph, "A")))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre la búsqueda en anchura

¿Cuál es la complejidad temporal de BFS?
BFS se ejecuta en tiempo O(V + E), donde V es el número de vértices y E el de aristas, ya que visita cada vértice una vez y examina cada arista una vez. Usa O(V) de espacio para la cola y el conjunto de visitados.
¿Encuentra BFS el camino más corto?
Sí, en un grafo no ponderado. Como BFS alcanza los nodos en orden de distancia en saltos desde el origen, la primera vez que llega a un nodo es por un camino con menos aristas. Para grafos ponderados necesitas el algoritmo de Dijkstra.
¿Cuál es la diferencia entre BFS y DFS?
BFS usa una cola y explora nivel por nivel (los más cercanos primero), mientras que DFS usa una pila y se adentra por una rama antes de retroceder. BFS encuentra los caminos más cortos no ponderados; DFS usa menos memoria en grafos anchos y sirve para detección de ciclos y ordenamiento topológico.
¿Cuándo debo usar BFS en lugar del algoritmo de Dijkstra?
Usa BFS cuando todas las aristas tienen el mismo costo, porque encuentra el camino con menos aristas en tiempo O(V + E) sin una cola de prioridad. El algoritmo de Dijkstra es necesario cuando las aristas tienen pesos distintos; ejecutar BFS puro en un grafo ponderado da el camino de menos saltos, no el de menor costo.
¿Por qué BFS necesita un conjunto de visitados?
Los grafos pueden contener ciclos, así que sin un conjunto de visitados BFS encolaría el mismo nodo repetidamente y entraría en un bucle infinito. Marcar un nodo cuando lo encolas por primera vez (no al desencolarlo) también evita que el mismo nodo se añada a la cola dos veces por vecinos distintos.
¿Debo marcar un nodo como visitado al encolarlo o al desencolarlo?
Márcalo al encolarlo. Si esperas hasta desencolarlo, un nodo puede ser añadido a la cola varias veces por vecinos distintos antes de procesarse, desperdiciando memoria y tiempo. Marcarlo al encolar garantiza que cada nodo entra a la cola exactamente una vez.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR