Поиск в глубину (DFS) — итеративная и рекурсивная реализация

Google Translate Icon

Поиск в глубину (DFS) — это алгоритм обхода или поиска древовидных или графовых структур данных. Начинают с корня (выбирая произвольный узел в качестве корня Graph) и исследуют как можно дальше каждую ветвь, прежде чем Backtracking.

На следующем Graphе показан порядок, в котором узлы обнаруживаются в DFS.

DFS Tree

Поиск в глубину по деревьям

Дерево — это неориентированный graph, в котором любые две вершины соединены ровно одним путем. Другими словами, любой ациклический связный graph является деревом. Для дерева у нас есть следующие методы обхода:

Они уже подробно описаны в отдельных постах.

Поиск в глубину в Graph

А Поиск в глубину (DFS) это способ обхода graphs, тесно связанный с обходом дерева в прямом порядке. Ниже приведена рекурсивная реализация обхода предварительного порядка:

procedure preorder(treeNode v)
{
    visit(v);
    for each child u of v
        preorder(u);
}

Чтобы превратить это в алгоритм обхода Graph, замените “дочерний” на “соседний”. Но чтобы предотвратить бесконечные циклы, следите за уже обнаруженными вершинами и не посещайте их повторно.

procedure dfs(vertex v)
{
    visit(v);
    for each neighbor u of v
        if u is undiscovered
            call dfs(u);
}

Рекурсивный алгоритм может быть реализован на C++, Java и Python следующим образом:

C++


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Java


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Python


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Временная сложность обхода DFS составляет O(V + E), куда V а также E - общее количество вершин и ребер в Graph соответственно. Обратите внимание, что O(E) может варьироваться между O(1) а также O(V2), в зависимости от того, насколько плотен graph.

Итеративная реализация DFS

Нерекурсивная реализация DFS похожа на нерекурсивная реализация BFS но отличается от него двумя способами:

  • Он использует stack вместо queue.
  • DFS должна помечать обнаружение только после извлечения вершины, а не перед ее нажатием.
  • Он использует обратный итератор вместо итератора для получения тех же результатов, что и рекурсивный DFS.

Ниже приведена программа на C++, Java и Python, которая демонстрирует это:

C++


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Java


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Python


Скачать  Выполнить код

результат:

0 1 2 3 4 5 6 7 8 9 10 11 12

Приложения ДФС

 
Также см:

Поиск в глубину (DFS) – вопросы интервью и практические задачи

 
Использованная литература: https://www.ics.uci.edu/~eppstein/161/960215.html

Оценить этот пост

Средний рейтинг 4.79/5. Подсчет голосов: 405

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?




Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования :)



Подписывайся
Уведомить о
guest
18 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
НЕ переходите по этой ссылке, иначе вы будете забанены на сайте!