… введение
Поиск в глубину (DFS) - это алгоритм обхода или поиска структур данных в виде дерева или графа. Алгоритм начинается с корневого узла (выбирая некоторый произвольный узел в качестве корневого узла в случае графа) и исследует, насколько это возможно, вдоль каждой ветви перед обратным отслеживанием.
Прежде чем продолжить, давайте формально определим граф и некоторые из его компонентов;
Узел (также называемый вершиной): это фундаментальная часть всех графов. Он может иметь имя (ключ), а также может содержать дополнительную информацию (полезные данные).
Край ( также называемый дугой ): соединяет узлы вместе, показывая взаимосвязь между ними. Ребра могут быть односторонними (ориентированные графы) или двусторонними.
Следовательно, график может быть представлен как G, где G = (V, E) .
Для графа G, V - это набор вершин, а E - это набор ребер.
В информатике такие проблемы, как анализ сетей, отображение маршрутов, планирование и т. Д., Можно рассматривать в терминах графов и, следовательно, анализировать с помощью DFS. Дальнейшее использование DFS также можно найти в топологической сортировке, задачах планирования, обнаружении циклов графа, решении головоломок с одним решением, например судоку или лабиринте, и т. Д.
Ниже я привел примеры реализации DFS псевдокода и кода Python. В этом алгоритме стек используется для отслеживания посещенных узлов, поскольку последний замеченный узел является следующим, который будет посещен, а остальные сохраняются для последующего посещения.
Псевдокод;
1 Initialize an empty stack for storage of nodes, S.
2 For each vertex u, define u.visited to be false.
3 Push the root (first node to be visited) onto S.
4 While S is not empty:
5 Pop the first element in S, u.
6 If u.visited = false, then:
7 U.visited = true
8 for each unvisited neighbor w of u:
9 Push w into S.
10 End process when all nodes have been visited.
Реализация Python с использованием рекурсии.
1 def depth_first_search_recursive(graph, start, visited=None):
2 if visited is None:
3 visited = set()
4 visited.add(start)
5 for next in graph[start] - visited:
6 depth_first_search_recursive(graph, next, visited)
7 return visited
Поиск в глубину посещает каждый узел один раз и проверяет каждое ребро графа один раз. Следовательно, сложность DFS равна O (V + E). Это предполагает, что граф представлен как список смежности.
Прочтите более подробную информацию о поиске в глубину здесь.