Я узнавал о широте первого поиска и вопрос пришел в голову , что , почему BFS называется так. В книге Введение в алгоритмы по КСПС , я прочитал следующую причину этого:
Поиск в ширину так назван потому, что он расширяет границы между открывшимся и неоткрытых вершин равномерно по всей ширине границы.
Тем не менее, я не в состоянии понять смысл этого утверждения. Я смущен этим словом "граница" и широтой этой границы.
Так, может кто-то пожалуйста, ответить на этот вопрос таким образом, что легко понять, для новичка, как я?
graphs
graph-theory
shortest-path
graph-traversal
TheHungryCoder
источник
источник
Ответы:
Рассмотрим структуру данных, используемую для представления поиска. В BFS вы используете очередь. Если вы встретите невидимый узел, вы добавите его в очередь.
«Граница» - это совокупность всех узлов в структуре данных поиска. Очередь будет будет перебором всех узлов на границе последовательно, таким образом , итерации по всей ширине границы. DFS всегда выталкивает самое последнее обнаруженное состояние из стека, таким образом всегда перебирая самую глубокую часть границы.
Посмотрите на изображение ниже. Обратите внимание, как DFS идет прямо к самым глубоким частям дерева, тогда как BFS выполняет итерацию по ширине каждого уровня.
Изображение здесь
источник
a
, граница естьa
. Когда вы обнаружилиa
,b
,c
, граница являетсяb
,c
. Когда вы обнаружилиa
,b
,c
,d
,e
,f
,g
, граница являетсяd
,e
,f
,g
. Другими словами, узлы, которые были обнаружены и которые мы еще не искали.Цитата, которую вы приводите, говорит: «Граница между обнаруженными и неоткрытыми вершинами». Так вот граница, о которой говорит автор: граница между обнаруженными и неоткрытыми вершинами. У вас есть вершины, которые вы еще ничего не видели. У вас также есть несколько вершин, для которых вы видели все. И тогда у вас есть вершины между ними. Это вершины, на которые вы смотрели, но вы еще не загрузили всех их детей. Это граница.
В обсуждении это далее:
Таким образом, все вершины начинаются белыми (неоткрытыми). Когда узел обнаружен, он окрашивается в серый цвет (граница). Когда все, на что он указывает, было обнаружено, оно окрашивается в черный цвет (полностью обнаружено). Граница - это набор точек, которые были обнаружены, но у которых еще не обнаружены дети.
Предположим, вы ищете что-то на сайте. Вы сначала идете на главную страницу. Предположим, что это с надписью "животные". Граница в настоящее время {"животные"}. Вы просматриваете главную страницу и не видите того, что ищете. Но вы заметили, что он имеет ссылки на еще две страницы, «четвероногие» и «черви». Таким образом, вы нажимаете на ссылку "четвероногих". Теперь граница - это "животные", "четвероногие"}. Вы просматриваете «четвероногие» и не находите того, что ищете. Что ты будешь делать дальше? Вы можете либо искать ссылки на «четвероногих» и переходить по ним, либо вернуться к «животным» и нажать на ссылку «черви». Первый - это поиск в глубину, а второй - поиск в ширину.
«глубина» относится к тому, сколько ссылок от корневого узла требуется, чтобы добраться до узла, в то время как «ширина» относится к узлам как к одной глубине. В приведенном выше примере BFS начинается с «животных» и сначала просматривает все узлы глубины один, поэтому сначала она смотрит на «четвероногих» и «червей». После того, как он просмотрел все узлы глубины 1, он расширяет границу по всем этим узлам; то есть он просматривает дочерние элементы всех узлов глубины 1, а затем просматривает дочерние элементы узлов глубины 2. Так, например, если одна из ссылок на странице «четвероногих» является «приматами», она будет просматривать все ссылки на странице «червей», прежде чем просматривает какие-либо ссылки на странице «приматов».
источник
Предположим, что алгоритм BFS выполняется, начиная с вершины . Представьте себе волну , которая отправляется из (например , водяной волны или цунами). После одного временного шага волна достигла бы всех соседей . После двух временных шагов волна достигла (или «посетила») всех вершин, которые находятся на расстоянии не более от . И так далее.a a a 2 a
В любой момент времени границей волны являются именно те вершины, которые хранятся в структуре данных очереди (эти вершины были посещены, но еще не исследованы).
Таким образом, волна первоначально достигает всей "ширины" всех вершин, которые находятся на расстоянии 1 от . Через несколько временных шагов волна охватила бы всю ширину до некоторого расстояния от начальной точки .a a
Множество вершин на расстоянии от называется - й слой на расстоянии разбиения графа по отношению к вершине . Множество вершин является несвязным объединением этих слоев . - й слой , первый слой представляет собой набор соседей , второй слой представляет собой множество вершин которого расстояние до равно двум, и так далее. РСПЛС алгоритм посещает вершину графа в определенном порядке - слой за слоем. Каждый слой покрывает всю ширину, но разные слои находятся на разной глубине.k a k a (k≥0) 0 {a} a a
С другой стороны, алгоритм DFS будет исследовать как можно глубже в одном направлении (т.е. посетить «s первого соседа, то его сосед, то его сосед, и так далее) , прежде чем вернуться обратно в и посещение следующего неизведанный соседа . Этот алгоритм сначала углубляется, а не посещает соседей по ширине.a a a
Таким образом, DFS и BFS различаются в том порядке, в котором они посещают вершины.
источник