Menu
Coddy logo textTech

Busca em largura (BFS)

Última atualização

A busca em largura explora um grafo nível por nível. Partindo de um nó de origem, ela visita primeiro todos os seus vizinhos imediatos, depois todos os vizinhos não visitados destes, e assim por diante - expandindo-se para fora em anéis de distância crescente. Pressione reproduzir acima para vê-la se abrir a partir do nó inicial uma camada de cada vez.

A BFS usa uma fila do tipo primeiro a entrar, primeiro a sair, que é o que impõe a ordem nível por nível. Como alcança os nós em ordem de distância em saltos, a BFS encontra o caminho mais curto (menos arestas) em um grafo não ponderado. Ela visita cada nó e aresta uma vez, então roda em tempo O(V + E).

Complexidade de tempo e espaço

MedidaComplexidadeObservações
TempoO(V + E)Cada vértice e aresta visitado uma vez
EspaçoO(V)Fila + conjunto de visitados, no pior caso todos os nós
TravessiaNível por nívelOs nós mais próximos primeiro, em anéis
Caminho mais curtoSim (não ponderado)Alcança cada nó com menos arestas

Passo a passo

PassoO que acontece
1Enfileira o nó de origem.
2Desenfileira o nó da frente e marca-o como visitado.
3Examina cada um dos seus vizinhos.
4Enfileira qualquer vizinho que ainda não esteja visitado ou na fila.
5Repete até a fila ficar vazia.

Exemplo resolvido

Percorrendo este grafo a partir do nó 0, onde 0-1, 0-2, 1-3, 2-3, 2-4 são arestas:

PassoVisitadosFila (fronteira)
Início{}[0]
Desenfileira 0{0}[1, 2]
Desenfileira 1{0, 1}[2, 3]
Desenfileira 2{0, 1, 2}[3, 4]
Desenfileira 3{0, 1, 2, 3}[4]
Desenfileira 4{0, 1, 2, 3, 4}[] (fim)

Quando usar a BFS

Use quandoEvite quando
Você precisa do caminho mais curto em um grafo não ponderadoAs arestas têm pesos - use Dijkstra em vez disso
O alvo provavelmente está perto da origemO grafo é muito largo - a fila pode conter uma fronteira enorme
Você quer explorar um grafo em ordem por níveisVocê só precisa alcançar qualquer nó, onde a DFS usa menos memória
Você busca componentes conexos ou uma rota de mínimos saltosVocê precisa de ordenação topológica ou detecção de ciclos - a DFS encaixa melhor

Uma implementação limpa e executável de Breadth-First Search em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Breadth-First Search em 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")))
Execute este código no Playground de Python

Perguntas frequentes sobre a busca em largura

Qual é a complexidade de tempo da BFS?
A BFS roda em tempo O(V + E), onde V é o número de vértices e E o de arestas, pois visita cada vértice uma vez e examina cada aresta uma vez. Ela usa O(V) de espaço para a fila e o conjunto de visitados.
A BFS encontra o caminho mais curto?
Sim, em um grafo não ponderado. Como a BFS alcança os nós em ordem de distância em saltos a partir da origem, a primeira vez que chega a um nó é por um caminho com menos arestas. Para grafos ponderados você precisa do algoritmo de Dijkstra.
Qual é a diferença entre BFS e DFS?
A BFS usa uma fila e explora nível por nível (os mais próximos primeiro), enquanto a DFS usa uma pilha e mergulha por um ramo antes de retroceder. A BFS encontra os caminhos mais curtos não ponderados; a DFS usa menos memória em grafos largos e serve para detecção de ciclos e ordenação topológica.
Quando devo usar a BFS em vez do algoritmo de Dijkstra?
Use a BFS quando todas as arestas têm o mesmo custo, pois ela encontra o caminho com menos arestas em tempo O(V + E) sem uma fila de prioridade. O algoritmo de Dijkstra é necessário quando as arestas têm pesos diferentes; rodar BFS pura em um grafo ponderado dá o caminho de menos saltos, não o de menor custo.
Por que a BFS precisa de um conjunto de visitados?
Grafos podem conter ciclos, então sem um conjunto de visitados a BFS enfileiraria o mesmo nó repetidamente e entraria em um laço infinito. Marcar um nó quando você o enfileira pela primeira vez (não ao desenfileirá-lo) também evita que o mesmo nó seja adicionado à fila duas vezes por vizinhos diferentes.
Devo marcar um nó como visitado ao enfileirar ou ao desenfileirar?
Marque-o ao enfileirar. Se você esperar até desenfileirá-lo, um nó pode ser adicionado à fila várias vezes por vizinhos diferentes antes de ser processado, desperdiçando memória e tempo. Marcar ao enfileirar garante que cada nó entra na fila exatamente uma vez.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR