Вы находитесь на странице: 1из 7

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

(англ. Depth-first search, DFS) — один из методов обхода графа.


Стратегия поиска в глубину, как и следует из названия, состоит в том, чтобы идти
«вглубь» графа, насколько это возможно. Алгоритм поиска описывается
рекурсивно: перебираем все исходящие из рассматриваемой вершины рёбра.
Если ребро ведёт в вершину, которая не была рассмотрена ранее, то запускаем
алгоритм от этой нерассмотренной вершины, а после возвращаемся и
продолжаем перебирать рёбра. Возврат происходит в том случае, если в
рассматриваемой вершине не осталось рёбер, которые ведут в нерассмотренную
вершину. Если после завершения алгоритма не все вершины были рассмотрены,
то необходимо запустить алгоритм от одной из нерассмотренных вершин[1].

Содержание

 1Алгоритм поиска в глубину


o 1.1Нерекурсивные варианты
 2Поиск в глубину с метками времени. Классификация рёбер
 3Применение
 4См. также
 5Примечания
 6Литература
 7Ссылки

Алгоритм поиска в глубину[править | править код]


Пусть задан граф , где  — множество вершин графа,  — множество ребер графа.
Предположим, что в начальный момент времени все вершины графа окрашены
в белый цвет. Выполним следующие действия:
1. Пройдём по всем вершинам .
o Если вершина  белая, выполним для неё  DFS(v) .
Процедура DFS (параметр — вершина )
1. Перекрашиваем вершину  в серый цвет.
2. Для всякой вершины , смежной с вершиной  и
окрашенной в белый цвет, рекурсивно выполняем
процедуру  DFS(w) [2].
3. Перекрашиваем вершину  в чёрный цвет.
Часто используют двухцветные метки — без серого, на 1-м шаге красят сразу в
чёрный цвет.
Нерекурсивные варианты[править | править код]
На больших графах поиск в глубину серьёзно нагружает стек вызовов. Если есть
риск переполнения стека, используют нерекурсивные варианты поиска.
Первый вариант, простейший, но дающий немалый объём стека — до |E|.

1. Кладём на стек первую вершину.


2. Пока стек не пуст, берём верхнюю вершину, не
извлекая.
1. Если вершина белая…
1. Красим в серый цвет.
2. Кладём в стек всех её белых соседок в
порядке, обратном порядку обхода
(если таковой важен).
2. Если вершина серая, красим в чёрный и
извлекаем.
3. Если вершина чёрная, просто извлекаем.
Если хватает двухцветных меток…

1. Кладём на стек первую вершину.


2. Пока стек не пуст, извлекаем верхнюю вершину.
Если она белая…
1. Красим в чёрный цвет.
2. Кладём в стек всех её белых соседок в
порядке, обратном порядку обхода.
Второй вариант: можно симулировать стек вызова программно: для каждой из
серых вершин в стеке будет храниться её номер  и номер текущей смежной
вершины .
Процедура DFS (параметр — вершина )
1. Кладём на стек пару . Перекрашиваем
вершину  в серый цвет.
2. Пока стек не пуст…
1. Берём верхнюю пару , не извлекая её из
стека.
2. Находим вершину , смежную с  и следующую
за .
1. Если таковой нет, извлекаем  из стека,
перекрашиваем
вершину  в чёрный цвет.
2. В противном случае присваиваем ,
прямо в стеке.
 Если к тому же вершина  белая,
кладём на стек пару ,
перекрашиваем  в серый цвет.
Третий вариант: можно в каждой из «серых» вершин держать текущее  и
указатель на предыдущую (ту, из которой пришли).

Поиск в глубину с метками времени. Классификация


рёбер[править | править код]
Поиск в глубину с метками времени. Порядок выбора рёбер — слева направо.

Для каждой из вершин установим два числа — «время» входа  и «время» выхода .
Модифицируем процедуру DFS так.
1. Увеличиваем «текущее время» на 1. .
2. Перекрашиваем вершину  в серый цвет.
3. Для всякой вершины , смежной с вершиной  и
окрашенной в белый цвет, выполняем
процедуру  DFS(v) .
4. Перекрашиваем вершину  в чёрный цвет.
5. Увеличиваем «текущее время» на 1. .
Считаем, что граф ориентированный. Очевидно, для любой вершины, из которой
мы не вышли в момент t, . Также невозможно скрёстное неравенство: .
Просматриваемые на шаге 3 дуги u→v могут быть:
 . В момент выполнения шага 3 (обозначенный как t)
вершина v белая. В таком случае мы для
вершины v исполняем DFS, а дуга называется дугой
дерева поиска.
 . В момент t вершина v чёрная,
сравнение entry говорит, что в v попали из u. Такая дуга
называется прямой.
 . В момент t вершина v также чёрная, но
сравнение entry говорит, что в v попали в обход u.
Такая дуга называется перекрёстной.
 . В момент t вершина v серая, то есть в u попали из v.
Имеем дело с обратной дугой.
Рёбра неориентированного графа могут быть рёбрами дерева и обратными, но не
прямыми и перекрёстными.[3] Чтобы различать рёбра неориентированного графа,
достаточно указанных выше трёх- или двухцветных отметок. Ребро, идущее в
белую вершину,— ребро дерева. В серую (чёрную в двухцветном варианте) —
обратное. В чёрную — такого не бывает.[4]
Алгоритм Косарайю требует сортировки вершин в обратном порядке по времени
выхода. Метка входа и типы рёбер нужны в алгоритмах поиска точек
сочленения и мостов. Метки выхода в обратном порядке — топологический
порядок вершин.

Применение[править | править код]
Поиск в глубину ограниченно применяется как собственно поиск, чаще всего на
древовидных структурах: когда расстояние между точками малó, поиск в глубину
может «плутать» где-то далеко.
Зато поиск в глубину — хороший инструмент для исследования топологических
свойств графов. Например:

 В качестве подпрограммы в алгоритмах поиска одно-


и двусвязных компонент.
 В топологической сортировке.
 Для поиска точек сочленения, мостов.
 В различных расчётах на графах. Например, как
часть алгоритма Диница поиска максимального потока.
Поиск в глубину — естественный выбор, когда агент (человек или робот) лично
ходит по лабиринту и видит то, что непосредственно рядом с ним. «Правило
левой руки» (идти, ведя левой рукой по стенке) будет поиском в глубину, если
лабиринт древовидный (нет кружных путей).

См. также[править | править код]


 Поиск в ширину

Примечания[править | править код]
1. ↑ Cormen, 2005, p. 622.
2. ↑ Обход в глубину, цвета вершин — Викиконспекты
3. ↑ Если в сторону u→v оно прямое, то ранее его прошли в сторону
v→u как обратное. Если в сторону u→v оно перекрёстное, его
должны были пройти v→u как ребро дерева.
4. ↑ Cormen, 2005, с. 628—629.

Литература[править | править код]
 Левитин  А.  В. Глава 5. Метод уменьшения размера
задачи: Поиск в глубину // Алгоритмы. Введение в
разработку и анализ — М.: Вильямс, 2006. — С. 212—
215. — 576 с. — ISBN 978-5-8459-0987-9
 Кормен Т., Лейзерсон Ч., Ривест Р. Глава 22.
Элементарные алгоритмы для работы с графами //
Алгоритмы: построение и анализ(второе
издание). — М.: «Вильямс», 2005. — С. 622—632.

Ссылки[править | править код]
Имеется викиучебник по теме «Примеры
реализации поиска в глубину»

 ВКИ НГУ: Методы программирования. Обходы графа.


 СпбГУ ИТМО, Факультет информационных технологий
и программирования: Дискретная математика.
Алгоритмы. Обход графа в глубину.
 Реализация поиска в глубину и различные задачи,
решаемые с его помощью (сайт e-maxx.ru)
 Поиск в глубину
 Обход в глубину, цвета вершин — Викиконспекты
ИТМО
Для улучшения этой статьи желательно:

 Проставив сноски, внести более точные указания на источники.


Пожалуйста, после исправления проблемы исключите её из списка
параметров. После устранения всех недостатков этот шаблон может быть
удалён любым участником.

[скрыть]
Алгоритмы поиска на графах
ый поиск
n]

еский поиск в ширину


у
рию стоимости
у
ом
ением к вершине
чением глубины
у с итеративным углублением

ечение
границ
му наилучшему совпадению

h[en]

итм
мана — Форда
стры
нсона
та
да — Уоршелла

вки
ма
кала

анского музея
ндса

айшего соседа в задаче коммивояжёра


Категории: 
 Алгоритмы на графах
 Алгоритмы поиска
 Алгоритмы поиска на графах
Навигация
 Вы не представились системе
 Обсуждение
 Вклад
 Создать учётную запись
 Войти
 Статья
 Обсуждение
 Читать
 Править
 Править код
 История
Поиск
Найти Перейти

 Заглавная страница
 Рубрикация
 Указатель А — Я
 Избранные статьи
 Случайная страница
 Текущие события
Участие
 Сообщить об ошибке
 Сообщество
 Форум
 Свежие правки
 Новые страницы
 Справка
 Пожертвовать
Инструменты
 Ссылки сюда
 Связанные правки
 Служебные страницы
 Постоянная ссылка
 Сведения о странице
 Цитировать страницу
Печать/экспорт
 Создать книгу
 Скачать как PDF
 Версия для печати
В других проектах
 Викисклад
 Элемент Викиданных
На других языках
 ‫العربية‬
 Deutsch
 English
 Español
 Français
 हिन्दी
 日本語
 Português
 中文
Ещё 29
Править ссылки
 Эта страница в последний раз была отредактирована 13 марта 2021 в 07:50.
 Текст доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать
дополнительные условия. Подробнее см. Условия использования.
Wikipedia® — зарегистрированный товарный знак некоммерческой организации Wikimedia Foundation, Inc.