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

Алгоритм поиска узлов графа
Анимированный пример поиска в ширину. Черный: исследовано, серый: поставлено в очередь на исследование позже
BFS на алгоритме решения лабиринта
Верхняя часть дерева игры «Крестики-нолики»

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

Например, в шахматном эндшпиле шахматный движок может построить дерево игры из текущей позиции, применяя все возможные ходы, и использовать поиск в ширину, чтобы найти выигрышную позицию для белых. Неявные деревья (такие как игровые деревья или другие деревья решения проблем) могут быть бесконечного размера; поиск в ширину гарантированно найдет узел решения [1], если он существует.

Напротив, (обычный) поиск в глубину (DFS), который исследует ветвь узла как можно дальше, прежде чем возвращаться и расширять другие узлы, [2] может потеряться в бесконечной ветви и никогда не добраться до узла решения. Итеративный поиск в глубину с углублением избегает последнего недостатка ценой повторного исследования верхних частей дерева. С другой стороны, оба алгоритма поиска в глубину обычно требуют гораздо меньше дополнительной памяти, чем поиск в ширину. [3]

Поиск в ширину можно обобщить как для неориентированных графов , так и для ориентированных графов с заданным начальным узлом (иногда называемым «ключом поиска»). [4] При поиске в пространстве состояний в искусственном интеллекте часто допускается повторный поиск вершин, в то время как при теоретическом анализе алгоритмов, основанных на поиске в ширину, обычно принимаются меры предосторожности для предотвращения повторений.

BFS и его применение для поиска связных компонент графов были изобретены в 1945 году Конрадом Цузе в его (отклоненной) докторской диссертации по языку программирования Plankalkül , но она не была опубликована до 1972 года. [5] Он был заново изобретен в 1959 году Эдвардом Ф. Муром , который использовал его для поиска кратчайшего пути из лабиринта, [6] [7] и позже развит CY Lee в алгоритм маршрутизации проводов (опубликован в 1961 году). [8]

Псевдокод

Входные данные : граф G и начальная вершина- корень графа G.

Выход : Целевое состояние. Родительские ссылки прослеживают кратчайший путь обратно к корню [9]

1 процедура BFS( G , root ) равна 2 пусть Q будет очередью 3 метка корень как исследованный 4 Q .enqueue( корень ) 5 пока  Q не пусто сделать 6 v  := Q .dequeue() 7 если  v является целью , то 8 вернуть  v 9 для всех ребер от v до w  в  G .adjacentEdges( v ) сделать
10 если  w не помечен как исследованный , то
11 пометить w как исследованный12 w .parent := v
13 Q .enqueue( w )

Подробнее

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

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

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

Очередь Q содержит границу, вдоль которой в данный момент выполняется поиск алгоритма.

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

Обратите внимание, что слово «узел» обычно взаимозаменяемо со словом «вершина» .

Атрибут parent каждого узла полезен для доступа к узлам по кратчайшему пути, например, путем возврата от конечного узла к начальному узлу после запуска BFS и установки предшествующих узлов.

Поиск в ширину создает так называемое дерево в ширину . Вы можете увидеть, как выглядит дерево в ширину, в следующем примере.

Пример

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

Пример карты Южной Германии с некоторыми связями между городами
Дерево поиска в ширину, полученное при запуске BFS на заданной карте и старте во Франкфурте

Анализ

Сложность времени и пространства

Временную сложность можно выразить как , поскольку каждая вершина и каждое ребро будут исследованы в худшем случае. — количество вершин, а — количество ребер в графе. Обратите внимание, что может варьироваться между и , в зависимости от того, насколько разрежен входной граф. [11] О ( | В | + | Э | ) {\displaystyle O(|V|+|E|)} | В | {\displaystyle |V|} | Э | {\displaystyle |E|} О ( | Э | ) {\displaystyle O(|E|)} О ( 1 ) {\displaystyle O(1)} О ( | В | 2 ) {\displaystyle O(|V|^{2})}

Когда количество вершин в графе известно заранее, и для определения того, какие вершины уже добавлены в очередь, используются дополнительные структуры данных, сложность пространства может быть выражена как , где — количество вершин. Это в дополнение к пространству, необходимому для самого графа, которое может варьироваться в зависимости от представления графа, используемого реализацией алгоритма. О ( | В | ) {\displaystyle O(|V|)} | В | {\displaystyle |V|}

При работе с графами, которые слишком велики для явного хранения (или бесконечны), более практично описывать сложность поиска в ширину в других терминах: чтобы найти узлы, которые находятся на расстоянии d от начального узла (измеряемом в количестве обходов ребер), BFS требует O ( b d + 1 ) времени и памяти, где b — « коэффициент ветвления » графа (средняя степень исхода). [12] : 81 

Полнота

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

BFS-заказ

Перечисление вершин графа называется упорядочением BFS, если оно является возможным результатом применения BFS к этому графу.

Пусть будет графом с вершинами. Напомним, что есть множество соседей . Пусть будет списком различных элементов , для , пусть будет наименьшим таким, который является соседом , если такой существует, и будет в противном случае. Г = ( В , Э ) {\displaystyle G=(V,E)} н {\displaystyle n} Н ( в ) {\displaystyle N(v)} в {\displaystyle v} σ = ( в 1 , , в м ) {\displaystyle \sigma =(v_{1},\dots,v_{m})} В {\displaystyle V} в В { в 1 , , в м } {\displaystyle v\in V\setminus \{v_{1},\dots,v_{m}\}} ν σ ( в ) {\displaystyle \nu _ {\sigma }(v)} я {\displaystyle я} в я {\displaystyle v_{i}} в {\displaystyle v} я {\displaystyle я} {\displaystyle \infty}

Пусть будет перечислением вершин . Перечисление называется упорядочением BFS (с источником ), если для всех есть вершина такая, что является минимальной. Эквивалентно, является упорядочением BFS, если для всех с существует сосед такой , что . σ = ( в 1 , , в н ) {\displaystyle \sigma =(v_{1},\dots,v_{n})} В {\displaystyle V} σ {\displaystyle \сигма} в 1 {\displaystyle v_{1}} 1 < я н {\displaystyle 1<i\leq n} в я {\displaystyle v_{i}} ж В { в 1 , , в я 1 } {\displaystyle w\in V\setminus \{v_{1},\dots,v_{i-1}\}} ν ( в 1 , , в я 1 ) ( ж ) {\ displaystyle \ nu _ {(v_ {1}, \ dots, v_ {i-1})} (w)} σ {\displaystyle \сигма} 1 я < дж < к н {\displaystyle 1\leq i<j<k\leq n} в я Н ( в к ) Н ( в дж ) {\ displaystyle v_ {i} \ in N (v_ {k}) \ setminus N (v_ {j})} в м {\displaystyle v_{м}} в дж {\displaystyle v_{j}} м < я {\displaystyle m<i}

Приложения

Поиск в ширину можно использовать для решения многих задач теории графов, например:

Смотрите также

Ссылки

  1. ^ то есть узел, удовлетворяющий указанному свойству
  2. ^ Кормен Томас Х.; и др. (2009). "22.3". Введение в алгоритмы . MIT Press.
  3. ^ Корф, Ричард Э. (1985). «Итеративное углубление в глубину: оптимальный допустимый поиск по дереву». Искусственный интеллект (27): 99– 100. doi :10.7916/D8HQ46X1.
  4. ^ "Спецификация бенчмарка Graph500 (оценка производительности суперкомпьютера)". Graph500.org, 2010. Архивировано из оригинала 2015-03-26 . Получено 2015-03-15 .
  5. ^ Цузе, Конрад (1972), Der Plankalkül (на немецком языке), Интернет-архив Конрада Цузе. См. стр. 96–105 связанного файла PDF (внутренняя нумерация 2.47–2.56).
  6. ^ Мур, Эдвард Ф. (1959). «Кратчайший путь через лабиринт». Труды Международного симпозиума по теории переключения . Издательство Гарвардского университета. С.  285–292 .Как цитируют Кормен, Лейзерсон, Ривест и Стайн.
  7. ^ Скиена, Стивен (2008). «Сортировка и поиск». Руководство по разработке алгоритмов . Springer. стр. 480. Bibcode :2008adm..book.....S. doi :10.1007/978-1-84800-070-4_4. ISBN 978-1-84800-069-8.
  8. ^ Ли, CY (1961). «Алгоритм для соединений путей и его приложения». Труды IRE по электронным компьютерам (3): 346– 365. doi :10.1109/TEC.1961.5219222. S2CID  40700386.
  9. ^ Кормен, Томас Х. "22.2 Поиск в ширину". Введение в алгоритмы. ISBN 978-81-203-4007-7. OCLC  1006880283.
  10. ^ "Обход графа на основе стека ≠ поиск в глубину". 11011110.github.io . Получено 2020-06-10 .
  11. ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л.; Стайн , Клиффорд (2001) [1990]. "22.2 Поиск в ширину". Введение в алгоритмы (2-е изд.). MIT Press и McGraw-Hill. стр.  531–539 . ISBN 0-262-03293-7.
  12. ^ Рассел, Стюарт ; Норвиг, Питер (2003) [1995]. Искусственный интеллект: современный подход (2-е изд.). Prentice Hall. ISBN 978-0137903955.
  13. ^ Коппин, Б. (2004). Освещение искусственного интеллекта. Jones & Bartlett Learning. С. 79–80.
  14. ^ Азиз, Аднан; Пракаш, Амит (2010). "4. Алгоритмы на графах". Алгоритмы для интервью . Algorithmsforinterviews.com. стр. 144. ISBN 978-1453792995.
  15. ^ Dhulipala, Laxman; Blelloch, Guy E.; Shun, Julian (21 августа 2019 г.). Теоретически эффективные параллельные графовые алгоритмы могут быть быстрыми и масштабируемыми . стр. 17. arXiv : 1805.05208 . doi :10.1145/3210377.3210414. ISBN 9781450357999. S2CID  44126609.
  • Кнут, Дональд Э. (1997), Искусство программирования, том 1. 3-е изд., Бостон: Addison-Wesley, ISBN 978-0-201-89683-1, архивировано из оригинала 2008-09-04 , извлечено 2008-02-09
  • Открытые структуры данных - Раздел 12.3.1 - Поиск в ширину, Пэт Морин
Получено с "https://en.wikipedia.org/w/index.php?title=Поиск_в_ширину&oldid=1253792977"