Что означает «ширина» в поиске ширины?

11

Я узнавал о широте первого поиска и вопрос пришел в голову , что , почему BFS называется так. В книге Введение в алгоритмы по КСПС , я прочитал следующую причину этого:

Поиск в ширину так назван потому, что он расширяет границы между открывшимся и неоткрытых вершин равномерно по всей ширине границы.

Тем не менее, я не в состоянии понять смысл этого утверждения. Я смущен этим словом "граница" и широтой этой границы.

Так, может кто-то пожалуйста, ответить на этот вопрос таким образом, что легко понять, для новичка, как я?

TheHungryCoder
источник
4
В случае , если некоторые читатели не знакомы со значением английского слова ( за пределы его использования в рамках данного технического термина): merriam-webster.com/dictionary/breadth или dictionary.cambridge.org/dictionary/english/breadth . Это похоже на «ширину», другое измерение, чем «глубина», если вы говорите о размере / форме физического объекта. И в переносном смысле , как глубина знаний (эксперт по одному предмету) против широты знаний (много предметов).
Питер Кордес

Ответы:

22

Рассмотрим структуру данных, используемую для представления поиска. В BFS вы используете очередь. Если вы встретите невидимый узел, вы добавите его в очередь.

«Граница» - это совокупность всех узлов в структуре данных поиска. Очередь будет будет перебором всех узлов на границе последовательно, таким образом , итерации по всей ширине границы. DFS всегда выталкивает самое последнее обнаруженное состояние из стека, таким образом всегда перебирая самую глубокую часть границы.

Посмотрите на изображение ниже. Обратите внимание, как DFS идет прямо к самым глубоким частям дерева, тогда как BFS выполняет итерацию по ширине каждого уровня.

дфс бфс

Изображение здесь

Throckmorton
источник
2
Я думаю, что слово граница может относиться к краю обнаруженных узлов. Когда вы только обнаружили a, граница есть a. Когда вы обнаружили a, b, c, граница является b, c. Когда вы обнаружили a, b, c, d, e, f, g, граница является d, e, f, g. Другими словами, узлы, которые были обнаружены и которые мы еще не искали.
Теодорос Чатзигианнакис,
Я думаю, что это справедливо, но я думаю, что «границы» могут быть истолкованы несколькими способами, при этом общее объяснение выше все еще работает.
Трокмортон,
2

Цитата, которую вы приводите, говорит: «Граница между обнаруженными и неоткрытыми вершинами». Так вот граница, о которой говорит автор: граница между обнаруженными и неоткрытыми вершинами. У вас есть вершины, которые вы еще ничего не видели. У вас также есть несколько вершин, для которых вы видели все. И тогда у вас есть вершины между ними. Это вершины, на которые вы смотрели, но вы еще не загрузили всех их детей. Это граница.

В обсуждении это далее:

Чтобы отслеживать прогресс, BFS окрашивает каждую вершину в белый, серый или черный цвет. Все вершины начинаются с белого, а затем могут стать серыми, а затем черными. Вершина обнаруживается в первый раз, когда она встречается во время поиска, когда она становится небелой. Таким образом, серые и черные вершины были обнаружены, но BFS различает их, чтобы гарантировать, что поиск выполняется BF-способом.
...
каждая вершина изначально белая, она серого цвета, когда она обнаружена в поиске, и затемнена, когда она завершена, то есть, когда ее список смежности был полностью исследован.

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

Предположим, вы ищете что-то на сайте. Вы сначала идете на главную страницу. Предположим, что это с надписью "животные". Граница в настоящее время {"животные"}. Вы просматриваете главную страницу и не видите того, что ищете. Но вы заметили, что он имеет ссылки на еще две страницы, «четвероногие» и «черви». Таким образом, вы нажимаете на ссылку "четвероногих". Теперь граница - это "животные", "четвероногие"}. Вы просматриваете «четвероногие» и не находите того, что ищете. Что ты будешь делать дальше? Вы можете либо искать ссылки на «четвероногих» и переходить по ним, либо вернуться к «животным» и нажать на ссылку «черви». Первый - это поиск в глубину, а второй - поиск в ширину.

«глубина» относится к тому, сколько ссылок от корневого узла требуется, чтобы добраться до узла, в то время как «ширина» относится к узлам как к одной глубине. В приведенном выше примере BFS начинается с «животных» и сначала просматривает все узлы глубины один, поэтому сначала она смотрит на «четвероногих» и «червей». После того, как он просмотрел все узлы глубины 1, он расширяет границу по всем этим узлам; то есть он просматривает дочерние элементы всех узлов глубины 1, а затем просматривает дочерние элементы узлов глубины 2. Так, например, если одна из ссылок на странице «четвероногих» является «приматами», она будет просматривать все ссылки на странице «червей», прежде чем просматривает какие-либо ссылки на странице «приматов».

Acccumulation
источник
1

Предположим, что алгоритм BFS выполняется, начиная с вершины . Представьте себе волну , которая отправляется из (например , водяной волны или цунами). После одного временного шага волна достигла бы всех соседей . После двух временных шагов волна достигла (или «посетила») всех вершин, которые находятся на расстоянии не более от . И так далее. aaa2a

В любой момент времени границей волны являются именно те вершины, которые хранятся в структуре данных очереди (эти вершины были посещены, но еще не исследованы).

Таким образом, волна первоначально достигает всей "ширины" всех вершин, которые находятся на расстоянии 1 от . Через несколько временных шагов волна охватила бы всю ширину до некоторого расстояния от начальной точки . aa

Множество вершин на расстоянии от называется - й слой на расстоянии разбиения графа по отношению к вершине . Множество вершин является несвязным объединением этих слоев . - й слой , первый слой представляет собой набор соседей , второй слой представляет собой множество вершин которого расстояние до равно двум, и так далее. РСПЛС алгоритм посещает вершину графа в определенном порядке - слой за слоем. Каждый слой покрывает всю ширину, но разные слои находятся на разной глубине.kaka(k0)0{a}aa

С другой стороны, алгоритм DFS будет исследовать как можно глубже в одном направлении (т.е. посетить «s первого соседа, то его сосед, то его сосед, и так далее) , прежде чем вернуться обратно в и посещение следующего неизведанный соседа . Этот алгоритм сначала углубляется, а не посещает соседей по ширине. aaa

Таким образом, DFS и BFS различаются в том порядке, в котором они посещают вершины.

mo2019
источник