~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ A00E2C44795149C8CB21E75B6402AB6D__1717394640 ✰
Заголовок документа оригинал.:
✰ Depth-first search - Wikipedia ✰
Заголовок документа перевод.:
✰ Поиск в глубину — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Depth-first_search ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/a0/6d/a00e2c44795149c8cb21e75b6402ab6d.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/a0/6d/a00e2c44795149c8cb21e75b6402ab6d__translat.html ✰
Дата и время сохранения документа:
✰ 18.06.2024 23:20:56 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 3 June 2024, at 09:04 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Поиск в глубину — Википедия Jump to content

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

Из Википедии, бесплатной энциклопедии
Поиск в глубину
Порядок, в котором узлы расширяются
Order in which the nodes get expanded
Порядок посещения узлов
Сорт Алгоритм поиска
Структура данных График
Худшая производительность для явных графов, проходимых без повторений, для неявных графов с коэффициентом ветвления b, поиском на глубину d
Наихудшая пространственная сложность если весь граф пройден без повторений, O (самая длинная длина искомого пути) = для неявных графов без исключения повторяющихся узлов
Оптимальный нет (обычно не находит кратчайшие пути)

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

Версия поиска в глубину была исследована в 19 веке французским математиком Шарлем Пьером Тремо. [1] как стратегия решения лабиринтов . [2] [3]

Свойства [ править ]

Временной пространственный и . анализ DFS различается в зависимости от области его применения В теоретической информатике DFS обычно используется для обхода всего графа и требует времени. , [4] где количество вершин и количество ребер . Это линейно зависит от размера графика. В этих приложениях он также использует пространство в худшем случае — для хранения стека вершин на текущем пути поиска, а также набора уже посещенных вершин. Таким образом, в этой ситуации временные и пространственные ограничения такие же, как и для поиска в ширину, и выбор того, какой из этих двух алгоритмов использовать, зависит не столько от их сложности, сколько от различных свойств упорядочения вершин, которые создают эти два алгоритма. .

Для приложений DFS по отношению к конкретным областям, таким как поиск решений в области искусственного интеллекта или сканирование веб-страниц, граф, который необходимо пройти, часто либо слишком велик, чтобы его можно было посетить целиком, либо бесконечен (DFS может страдать от незавершенности ). В таких случаях поиск осуществляется только на ограниченную глубину ; из-за ограниченности ресурсов, таких как память или дисковое пространство, обычно не используются структуры данных для отслеживания набора всех ранее посещенных вершин. Когда поиск выполняется на ограниченную глубину, время по-прежнему линейно с точки зрения количества расширенных вершин и ребер (хотя это число не совпадает с размером всего графа, поскольку некоторые вершины можно искать более одного раза, а другие совсем нет), но пространственная сложность этого варианта DFS пропорциональна только пределу глубины и, как следствие, намного меньше, чем пространство, необходимое для поиска на ту же глубину с использованием поиска в ширину. Для таких приложений DFS также гораздо лучше подходит для эвристические методы выбора вероятно выглядящей ветви. Если соответствующий предел глубины априори не известен, итеративный поиск в глубину с углублением многократно применяет DFS с последовательностью увеличения пределов. В режиме анализа искусственного интеллекта, при коэффициенте ветвления больше единицы, итеративное углубление увеличивает время выполнения лишь в постоянный раз по сравнению со случаем, когда известен правильный предел глубины, за счет геометрического роста числа узлов на уровень. .

DFS также можно использовать для сбора выборки узлов графа. Однако неполный DFS, как и неполный BFS , смещен в сторону узлов высокой степени .

Пример [ править ]

Анимированный пример поиска в глубину

Для следующего графика:

Неориентированный граф с ребрами AB, BD, BF, FE, AC, CG, AE.

поиск в глубину, начинающийся с узла A, предполагая, что левые ребра в показанном графе выбраны раньше правых ребер, и предполагая, что поиск запоминает ранее посещенные узлы и не будет повторять их (поскольку это небольшой граф), посетит узлы в следующем порядке: A, B, D, F, E, C, G. Ребра, пройденные в этом поиске, образуют дерево Тремо — структуру, имеющую важные применения в теории графов . Выполнение того же поиска без запоминания ранее посещенных узлов приводит к посещению узлов в порядке A, B, D, F, E, A, B, D, F, E и т. д. навсегда, попадая в A, B, D, Цикл F, E и никогда не достигает C или G.

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

Результат поиска в глубину [ править ]

Четыре типа ребер, определяемых связующим деревом

Результат поиска графа в глубину удобно описать в виде остовного дерева вершин, достигнутых в ходе поиска. На основе этого связующего дерева ребра исходного графа можно разделить на три класса: передние ребра , которые указывают от узла дерева на одного из его потомков, задние ребра , которые указывают от узла на одного из его предков, и поперечные края , которые не делают ни того, ни другого. Иногда ребра дерева , ребра, принадлежащие самому связующему дереву, классифицируются отдельно от передних ребер. Если исходный граф неориентированный, то все его ребра являются ребрами дерева или задними ребрами.

Порядок вершин [ править ]

Также можно использовать поиск в глубину для линейного упорядочения вершин графа или дерева. Есть четыре возможных способа сделать это:

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

Для бинарных деревьев дополнительно существует упорядочение и обратное упорядочение .

Например, при поиске в ориентированном графе ниже, начиная с узла A, последовательность обходов будет либо ABDBACA, либо ACDCABA (выбор первого посещения B или C из A зависит от алгоритма). Обратите внимание, что сюда включены повторные посещения в форме возврата к узлу для проверки наличия у него еще непосещенных соседей (даже если обнаружено, что у него их нет). Таким образом, возможные предварительные упорядочения — это ABDC и ACDB, возможные постпорядки — DBCA и DCBA, а возможные обратные постпорядки — ACBD и ABC D.

Ориентированный граф с ребрами AB, BD, AC, CD

Обратный поступорядочение производит топологическую сортировку любого направленного ациклического графа . Такое упорядочение также полезно при анализе потоков управления, поскольку оно часто представляет собой естественную линеаризацию потоков управления. Приведенный выше график может представлять поток управления в приведенном ниже фрагменте кода, и естественно рассматривать этот код в порядке ABCD или ACBD, но неестественно использовать порядок ABDC или ACD B.

если (  А  ) то { 
      Б 
  } еще { 
      С 
  } 
  Д 

Псевдокод [ править ]

Рекурсивная реализация DFS: [5]

процедура  (  G  ,  v  )  DFS 
      пометить  v  как обнаруженное 
      для всех  направленных ребер от  v  до  w, находящихся   в   G  .adjacentEdges(  v  )  , 
         если  вершина  w  не помечена как обнаруженная  , то 
              рекурсивно вызвать DFS(  G  ,  w  ) 
 

Нерекурсивная реализация DFS с наихудшей пространственной сложностью. , с возможностью дублирования вершин в стеке: [6]

процедура  (  G  ,  v  )  DFS_iterative 
      пусть  S  — стек 
      S  .push(  v  ) 
      пока   S  не пусто,  do 
         v  =  S  .pop() 
          если   v  не помечен как обнаруженный  , то 
              пометить  v  как обнаруженное 
              для всех  ребер от  v  до  w   в   G  .adjacentEdges(  v  )  do  
                 S  .push(  w  ) 
 
Неориентированный граф с ребрами AB, BD, BF, FE, AC, CG, AE.
The example graph, copied from above

Эти два варианта DFS посещают соседей каждой вершины в порядке, противоположном друг другу: первый сосед v , который посещает рекурсивный вариант, является первым в списке соседних ребер, а в итеративном варианте первым посещенным соседом является последнее в списке соседних ребер. Рекурсивная реализация будет посещать узлы из примера графа в следующем порядке: A, B, D, F, E, C, G. Нерекурсивная реализация будет посещать узлы в следующем порядке: A, E, F, B, D. , С, Г.

Нерекурсивная реализация аналогична поиску в ширину, но отличается от него двумя моментами:

  1. он использует стек вместо очереди и
  2. он откладывает проверку того, была ли обнаружена вершина, до тех пор, пока вершина не будет извлечена из стека, вместо того, чтобы выполнять эту проверку перед добавлением вершины.

Если G дерево , замена очереди алгоритма поиска в ширину стеком даст алгоритм поиска в глубину. Для общих графов замена стека реализации итеративного поиска в глубину очередью также приведет к созданию алгоритма поиска в ширину, хотя и несколько нестандартного. [7]

Другая возможная реализация итеративного поиска в глубину использует стек итераторов списка соседей узла вместо стека узлов. Это дает тот же обход, что и рекурсивный DFS. [8]

процедура  (  G  ,  v  )  DFS_iterative 
      пусть  S  — стек 
      пометить  v  как обнаруженное 
      S  .push(итератор  G  .adjacentEdges(  v  )) 
      пока   S  не пусто,  сделайте 
         if   S  .peek().hasNext()  then 
             w  =  S  .peek().next() 
              если   w  не помечен как обнаруженный  , то 
                  этикетка  была  обнаружена 
                  S  .push(итератор  G  .adjacentEdges(  w  )) 
          иначе 
             S  .pop() 
 

Приложения [ править ]

Продолжительность: 1 минута и 1 секунда.
Рандомизированный алгоритм, аналогичный поиску в глубину, используемый при создании лабиринта.

Алгоритмы, которые используют поиск в глубину в качестве строительного блока, включают:

Сложность [ править ]

Вычислительную сложность DFS исследовал Джон Рейф . Точнее, учитывая график , позволять — порядок, вычисляемый стандартным рекурсивным алгоритмом DFS. Такое упорядочение называется лексикографическим упорядочением поиска в глубину. Джон Рейф рассмотрел сложность вычисления лексикографического порядка поиска в глубину с учетом графа и источника. Вариант решения проблемы (проверка того, встречается ли некоторая вершина u перед некоторой вершиной v в этом порядке) является P -полным , [12] это означает, что это «кошмар для параллельной обработки ». [13] : 189 

Порядок поиска в глубину (не обязательно лексикографический) может быть вычислен с помощью рандомизированного параллельного алгоритма в классе сложности RNC . [14] По состоянию на 1997 год оставалось неизвестным, можно ли построить обход в глубину с помощью детерминированного параллельного алгоритма в классе сложности NC . [15]

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

Примечания [ править ]

  1. ^ Шарль Пьер Тремо (1859–1882) Парижская политехническая школа (X: 1876), французский инженер телеграфа
    на публичной конференции, 2 декабря 2010 г. – профессор Жан Пеллетье-Тибер в Академии Макона (Бургундия, Франция) – (Тезисы опубликованы в журнале Annals Academic, март 2011 г. – ISSN   0980-6032 )
  2. ^ Эвен, Шимон (2011), Графовые алгоритмы (2-е изд.), Cambridge University Press, стр. 46–48, ISBN  978-0-521-73653-4 .
  3. ^ Седжвик, Роберт (2002), Алгоритмы на C++: алгоритмы графов (3-е изд.), Pearson Education, ISBN  978-0-201-36118-6 .
  4. ^ Кормен, Томас Х., Чарльз Э. Лейзерсон и Рональд Л. Ривест. стр.606
  5. ^ Гудрич и Тамассия; Кормен, Лейзерсон, Ривест и Штейн
  6. ^ Страница 93, Разработка алгоритма, Кляйнберг и Тардос.
  7. ^ «Обход графа на основе стека ≠ поиск в глубину» . 11011110.github.io . Проверено 10 июня 2020 г.
  8. ^ Седжвик, Роберт (2010). Алгоритмы на Java . Аддисон-Уэсли. ISBN  978-0-201-36121-6 . OCLC   837386973 .
  9. ^ Хопкрофт, Джон ; Тарьян, Роберт Э. (1974), «Эффективное тестирование планарности» (PDF) , Журнал Ассоциации вычислительной техники , 21 (4): 549–568, doi : 10.1145/321850.321852 , hdl : 1813/6011 , S2CID   6279825 .
  10. ^ де Фрейссе, Х.; Оссона де Мендес, П. ; Розенштиль, П. (2006), «Деревья Тремо и плоскостность», Международный журнал основ компьютерных наук , 17 (5): 1017–1030, arXiv : math/0610935 , Bibcode : 2006math.....10935D , doi : 10.1142/S0129054106004248 , S2CID   40107560 .
  11. ^ Бачелли, Франсуа; Гаджи-Мирсадеги, Мир-Омид; Хезели, Али (2018), «Вечные генеалогические деревья и динамика на унимодулярных случайных графах», Собечки, Флориан (ред.), Унимодулярность в случайно сгенерированных графах: специальная сессия AMS, 8–9 октября 2016 г., Денвер, Колорадо , Contemporary Математика, вып. 719, Провиденс, Род-Айленд: Американское математическое общество, стр. 85–127, arXiv : 1608.05940 , doi : 10.1090/conm/719/14471 , MR   3880014 , S2CID   119173820 ; см . пример 3.7, с. 93
  12. ^ Рейф, Джон Х. (1985). «Поиск в глубину по своей сути последователен». Письма об обработке информации . 20 (5): 229–234. дои : 10.1016/0020-0190(85)90024-9 .
  13. ^ Мельхорн, Курт ; Сандерс, Питер (2008). Алгоритмы и структуры данных: базовый набор инструментов (PDF) . Спрингер. Архивировано (PDF) из оригинала 8 сентября 2015 г.
  14. ^ Аггарвал, А.; Андерсон, Р.Дж. (1988), «Случайный алгоритм ЧПУ для поиска в глубину», Combinatorica , 8 (1): 1–12, doi : 10.1007/BF02122548 , MR   0951989 , S2CID   29440871 .
  15. ^ Каргер, Дэвид Р .; Мотвани, Раджив (1997), « Алгоритм ЧПУ для минимальных разрезов», SIAM Journal on Computing , 26 (1): 255–272, CiteSeerX   10.1.1.33.1701 , doi : 10.1137/S0097539794273083 , MR   1431256 .

Ссылки [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: A00E2C44795149C8CB21E75B6402AB6D__1717394640
URL1:https://en.wikipedia.org/wiki/Depth-first_search
Заголовок, (Title) документа по адресу, URL1:
Depth-first search - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)