В этом посте рассматривается обход графов, я рассмотрел основы работы с графами и их реализацию в части 1 - Структуры данных графа в JavaScript - Часть 1: основы работы с графами
Существует два алгоритма, которые можно использовать для обхода графа: поиск в глубину (DFS) и поиск в ширину (BFS). С помощью обхода можно найти определенную вершину, путь между двумя вершинами или проверить, связан ли граф, содержит ли он цикл и т. д.
Поиск в глубину
В алгоритме поиска в глубину мы сначала посещаем начальную вершину, затем следуем по пути, пока не будет посещена последняя вершина пути, а затем мы возвращаемся и следуем по следующему пути. т.е. если начальная вершина - A, мы сначала посещаем A, а затем соседа A, а затем соседа соседа A и так далее. Достигнув последней вершины пути (тупика), мы возвращаемся по пути и следуем по следующему пути.
Здесь, допустим, начальная вершина равна 1, мы сначала посещаем 1, а затем 2, а затем 4 (тупик), теперь возвращаемся к 2, а затем к 5 (тупик), а затем возвращаемся к 1, а затем к последним 3 (тупик) .
Заказ DFS будет -
1 → 2 → 4 → 5 → 3
Реализация DFS
Для реализации поиска в глубину мы используем stack
в качестве вспомогательной структуры данных для хранения вершин для будущей обработки и object
для хранения посещенных вершин, чтобы избежать повторного посещения.
Здесь мы инициализировали stack
с начальной вершиной по первому индексу object
, называемой visited
, и пустым array
с именем result
для хранения порядка.
Мы будем повторять stack
, пока он не станет пустым, и на каждой итерации мы будем извлекать last vertex
из stack
и проверять, посещена ли вершина или нет. Если вершина не посещена, мы добавим ее в visited object
и в result array
. И наконец, мы добавим всех соседей этой вершины в stack
для будущей обработки.
Поиск в ширину
В алгоритме поиска в ширину мы сначала посещаем начальную вершину, затем ее соседей, затем их соседей и так далее. т.е. если начальная вершина - A, то мы посещаем всех соседей A, а затем посещаем всех соседей соседей A и так далее.
Здесь, скажем, начальная вершина 1, мы сначала посещаем 1, затем 2 и 3, а затем 4 и 5.
Порядок BFS будет -
1 → 2 → 3 → 4 → 5
Реализация BFS
Для реализации поиска в ширину мы используем queue
в качестве вспомогательной структуры данных для хранения вершин для будущей обработки и object
для хранения посещенных вершин, чтобы избежать повторного посещения.
Здесь мы инициализировали queue
с начальной вершиной по первому индексу object
, называемой visited
, и пустым array
с именем result
для сохранения порядка.
Мы будем повторять queue
, пока он не станет пустым, и на каждой итерации мы будем извлекать first vertex
из queue
и проверять, посещена ли вершина или нет. Если вершина не посещена, мы добавим ее в visited object
и в result array
. И наконец, мы добавим всех соседей этой вершины в queue
для будущей обработки.
Ссылка Github для списка смежности с методами обхода DFS и BFS.
Не пропустите - Структуры графических данных в JavaScript - Часть 1: Основы работы с графами