Порядок развертывания узлов | |
Класс | Алгоритм поиска |
---|---|
Структура данных | График |
Наихудший случай производительность | |
наихудший случай сложность пространства |
Поиск в ширину (BFS ) - это алгоритм для просмотра или поиска структур данных tree или graph. Он начинается с корня дерева (или некоторого произвольного узла графа, иногда называемого «ключом поиска»), и исследует все соседние узлы на текущей глубине, прежде чем перейти к узлам. на следующем уровне глубины.
Он использует стратегию, противоположную поиску в глубину, который вместо этого исследует ветвь узла как можно глубже, прежде чем будет вынужден вернуться назад и развернуть другие узлы.
BFS и его применение для нахождения связных компонентов графов было изобретено в 1945 году Конрадом Цузе, в его (отвергнутой) докторской степени. докторскую диссертацию по языку программирования Планкалкюль, но он не был опубликован до 1972 года. Он был заново изобретен в 1959 году Эдвардом Ф. Муром, который использовал его, чтобы найти кратчайший путь из лабиринта., а затем разработан CY Lee в алгоритм маршрутизации (опубликован в 1961 г.).
Вход : Граф G и начальная вершина корня G
Выход : состояние цели. Родительские ссылки отслеживают кратчайший путь обратно к корню
1 процедура BFS (G, root) is 2 пусть Q будет корнем метки очереди 3, как обнаружено 4 Q.enqueue (root) 5 пока Q не пусто do 6 v: = Q.dequeue () 7 если v является целью, то 8 return v 9 для всех ребер от v до w в G.adjacentEdges (v) do 10, если w не помечено как обнаружено затем 11 метка w как обнаружено 12 Q.enqueue (w)
Эта нерекурсивная реализация похожа на нерекурсивную реализацию поиск в глубину, но отличается от него двумя способами:
Если G является деревом, заменяя очередь этого алгоритм поиска в ширину со стеком даст поиск в глубину алгоритм поиска. Для общих графиков замена стека реализации итеративного поиска в глубину на очередь также приведет к созданию алгоритма поиска в ширину, хотя и несколько нестандартного.
Очередь Q содержит границу, вдоль которой алгоритм в настоящее время ищет.
Узлы могут быть помечены как обнаруженные путем сохранения их в наборе или с помощью атрибута на каждом узле, в зависимости от реализации.
Обратите внимание, что слово узел обычно взаимозаменяемо со словом вершина.
Родительский атрибут каждого узла полезен для доступа к узлам по кратчайшему пути, например, путем обратного отслеживания от целевого узла до начального узла, после того, как BFS была запущена, а узлы-предшественники были задавать.
Поиск в ширину создает так называемое дерево в ширину. Вы можете увидеть, как выглядит дерево в ширину, в следующем примере.
Ниже приведен пример дерева в ширину, полученного запуском BFS в немецких городах, начиная с Франкфурта:
Пример карты Южная Германия с некоторыми связями между городами Дерево в ширину, полученное при запуске BFS на данной карте и начало в Франкфуртвременная сложность может быть выражена как , так как каждая вершина и каждое ребро будут исследованы в худшем случае. - количество вершин, а - количество ребер в графе. Обратите внимание, что может варьироваться от и , в зависимости от того, насколько разрежен входной график.
Когда количество вершин в графе известно заранее, и дополнительные структуры данных используются для определения того, какие вершины уже были добавлены в очередь, сложность пространства может быть выражена как , где - количество вершин. Это в дополнение к пространству, необходимому для самого графа, которое может варьироваться в зависимости от представления графа, используемого реализацией алгоритма.
При работе с графами, которые слишком велики для явного хранения (или бесконечны), более практично описывать сложность поиска в ширину другими терминами: найти узлы, которые находятся на расстоянии d от начальный узел (измеряется числом обходов ребер), BFS занимает O (b) времени и памяти, где b - «коэффициент ветвления » графа (средний исходящий градус).
При анализе алгоритмов предполагается, что входом для поиска в ширину является конечный граф, явно представленный как список смежности, матрица смежности, или подобное представление. Однако при применении методов обхода графа в искусственном интеллекте входные данные могут быть неявным представлением бесконечного графа. В этом контексте метод поиска описывается как завершенный, если гарантируется нахождение целевого состояния, если оно существует. Поиск в ширину завершен, а поиск в глубину - нет. При применении к бесконечным графам, представленным неявно, поиск в ширину в конечном итоге найдет состояние цели, но поиск в глубину может потеряться в тех частях графа, которые не имеют целевого состояния, и никогда не вернуться.
Перечисление вершин графа называется упорядочением BFS, если это возможный результат применения BFS к этому графу.
Пусть будет графиком с вершин. Напомним, что - это набор соседей . Для быть списком отдельных элементов , для , пусть будет наименьшим такой, что является соседом , если такой существует, и быть в противном случае.
Пусть будет перечислением вершин . Перечисление называется упорядочением BFS (с источником ), если, для всех
поиск в ширину может использоваться для решения многих проблем в теории графов, например:
На Викискладе есть медиафайлы, связанные с поиском в ширину. |