Jump to content

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

(Перенаправлено с поиска в ширину )
Поиск в ширину
Порядок, в котором узлы расширяются
Order in which the nodes get expanded
Порядок раскрытия узлов
Сорт Алгоритм поиска
Структура данных График
Худшая производительность
Наихудшая пространственная сложность
Оптимальный да (для невзвешенных графиков)
Анимированный пример поиска в ширину. Черный: изучен, серый: поставлен в очередь для дальнейшего изучения.
BFS по алгоритму решения лабиринтов
Верхняя часть «Крестики-нолики» дерева игры

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

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

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

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

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

Псевдокод

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

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

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

 1  procedure BFS(G, root) is
 2      let Q be a queue
 3      label root as explored
 4      Q.enqueue(root)
 5      while Q is not empty do
 6          v := Q.dequeue()
 7          if v is the goal then
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10              if w is not labeled as explored then
11                  label w as explored
12                  w.parent := v
13                  Q.enqueue(w)

Подробнее

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

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

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

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

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

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

Обратите внимание, что слово node обычно взаимозаменяемо со словом vertex .

атрибут Родительский каждого узла полезен для доступа к узлам по кратчайшему пути, например, путем возврата от узла назначения к начальному узлу после запуска BFS и установки узлов-предшественников.

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

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

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

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

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

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

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

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

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

Заказ БФС

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

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

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

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

Приложения

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

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

См. также

[ редактировать ]
  1. ^ то есть узел, удовлетворяющий указанному свойству
  2. ^ Кормен Томас Х.; и др. (2009). «22,3». Введение в алгоритмы . МТИ Пресс.
  3. ^ Корф, Ричард Э. (1985). «Итеративное углубление в глубину: поиск оптимального допустимого дерева» . Искусственный интеллект (27): 99–100. дои : 10.7916/D8HQ46X1 .
  4. ^ «Спецификация теста Graph500 (оценка производительности суперкомпьютера)» . Graph500.org, 2010. Архивировано из оригинала 26 марта 2015 г. Проверено 15 марта 2015 г.
  5. ^ Цузе, Конрад (1972), The Plankalkül (на немецком языке), Интернет-архив Конрада Цузе . См. стр. 96–105 связанного PDF-файла (внутренняя нумерация 2.47–2.56).
  6. ^ Мур, Эдвард Ф. (1959). «Кратчайший путь через лабиринт». Труды международного симпозиума по теории коммутации . Издательство Гарвардского университета. стр. 285–292. Цитируется Корменом, Лейзерсоном, Ривестом и Штейном.
  7. ^ Скиена, Стивен (2008). «Сортировка и поиск». Руководство по проектированию алгоритмов . Спрингер. п. 480. Бибкод : 2008адм..книга.....С . дои : 10.1007/978-1-84800-070-4_4 . ISBN  978-1-84800-069-8 .
  8. ^ Ли, Калифорния (1961). «Алгоритм соединения путей и его приложения». Транзакции IRE на электронных компьютерах (3): 346–365. дои : 10.1109/TEC.1961.5219222 . S2CID   40700386 .
  9. ^ Кормен, Томас Х. «22.2 Поиск в ширину». Введение в алгоритмы . ISBN  978-81-203-4007-7 . OCLC   1006880283 .
  10. ^ «Обход графа на основе стека ≠ поиск в глубину» . 11011110.github.io . Проверено 10 июня 2020 г.
  11. ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001) [1990]. «22.2 Поиск в ширину». Введение в алгоритмы (2-е изд.). MIT Press и McGraw-Hill. стр. 531–539. ISBN  0-262-03293-7 .
  12. ^ Рассел, Стюарт ; Норвиг, Питер (2003) [1995]. Искусственный интеллект: современный подход (2-е изд.). Прентис Холл. ISBN  978-0137903955 .
  13. ^ Коппин, Б. (2004). Искусственный интеллект освещен. Джонс и Бартлетт Обучение. стр. 79–80.
  14. ^ Азиз, Аднан; Пракаш, Амит (2010). «4. Алгоритмы на графах». Алгоритмы проведения собеседований . п. 144. ИСБН  978-1453792995 .
  15. ^ Дхулипала, Лаксман; Блеллок, Гай Э.; Шун, Джулиан (21 августа 2019 г.). Теоретически эффективные алгоритмы параллельных графов могут быть быстрыми и масштабируемыми . п. 17. arXiv : 1805.05208 . дои : 10.1145/3210377.3210414 . ISBN  9781450357999 . S2CID   44126609 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f4c961e7ca3e74c72324ea1323dbc704__1715671320
URL1:https://arc.ask3.ru/arc/aa/f4/04/f4c961e7ca3e74c72324ea1323dbc704.html
Заголовок, (Title) документа по адресу, URL1:
Breadth-first search - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)