← Все вопросы

Чем поиск в ширину (BFS) отличается от поиска в глубину (DFS)?

Задан 17 месяцев назад702 просмотров4 ответа
16

Изучаю обходы графа. Есть BFS и DFS. Понимаю, что оба обходят все вершины, но не улавливаю разницу в порядке и в том, когда какой использовать. Поясните?

4 ответа

27

Разница — в порядке обхода и в структуре данных под капотом.

BFS (в ширину) идёт «кругами»: сначала все соседи стартовой вершины, потом соседи соседей и т.д. Использует очередь. Главный плюс — находит КРАТЧАЙШИЙ путь в невзвешенном графе (по числу рёбер).

DFS (в глубину) ныряет по одной ветке до упора, потом откатывается и идёт по следующей. Использует стек (или рекурсию). Удобен для проверки связности, поиска циклов, топологической сортировки.

from collections import deque

def bfs(graph, start):
    visited = {start}
    queue = deque([start])
    while queue:
        node = queue.popleft()      # очередь -> FIFO
        print(node)
        for nb in graph[node]:
            if nb not in visited:
                visited.add(nb)
                queue.append(nb)

Запомни связку: BFS = очередь = кратчайший путь; DFS = стек/рекурсия = обход вглубь.

Данил Григорьев BFS=очередь, DFS=стек — вот эта пара всё расставила по местам 🙏 · 17 месяцев назад
Снежана Фролова @да, тем же кодом но с обычным стеком (list) и pop() с конца вместо popleft · 17 месяцев назад
Матвей Воробьёв а DFS можно без рекурсии? · 17 месяцев назад
12

Короткая шпаргалка: нужен кратчайший путь в невзвешенном графе — BFS. Просто обойти всё / найти цикл / топосорт — DFS. Под капотом BFS = очередь, DFS = стек.

5

BFS — очередь, DFS — стек.

-6

BFS всегда находит кратчайший путь в любом графе, поэтому он лучше DFS.

Александр Мальчевский не в любом — только в невзвешенном. Во взвешенном нужен Дейкстра, BFS даст неверный путь · 17 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект