Разница между BFS и DFS - PullRequest
       54

Разница между BFS и DFS

4 голосов
/ 25 октября 2011

Я читаю о DFS в Введение в алгоритмы от Кормена.Ниже приведен фрагмент текста.

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

В дополнение к вышеприведенным примечаниям упоминается следующее:

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

Мой вопрос

  1. Может ли кто-нибудь привести пример того, как BFS используется с несколькими источниками, а DFS используется с одним источником?

Ответы [ 2 ]

6 голосов
/ 25 октября 2011

Когда он говорит о нескольких источниках, он ссылается на начальный узел поиска.Вы заметите, что параметры алгоритмов BFS(G, s) и DFS(G).Это уже должно быть намеком на то, что BFS является одним источником, а DFS нет, поскольку DFS не принимает ни один начальный узел в качестве аргумента.

Основное различие между этими двумя, как указывают авторы,в том, что результатом BFS всегда является дерево, тогда как DFS может быть лесом (коллекцией деревьев).Это означает, что если BFS запускается с узла s, то она построит дерево только из тех узлов, которые достижимы из s, но если в графе есть другие узлы, они не будут касаться их.Однако DFS продолжит поиск по всему графу и построит лес всех этих связанных компонентов.Это, как они объясняют, является желаемым результатом каждого алгоритма в большинстве случаев использования.

Как уже упоминали авторы, ничто не мешает внести небольшие изменения в единый источник DFS.На самом деле это изменение легко.Мы просто принимаем другой параметр s, и в подпрограмме DFS (не DFS_VISIT) вместо строк 5-7, повторяющихся во всех узлах графа, мы просто выполняем DFS_VISIT(s).

АналогичноИзменение BFS возможно, чтобы он работал с несколькими источниками.Я нашел онлайн-реализацию: http://algs4.cs.princeton.edu/41undirected/BreadthFirstPaths.java.html, хотя она немного отличается от другой возможной реализации, которая автоматически создает отдельные деревья.Это означает, что этот алгоритм выглядит следующим образом BFS(G, S) (где S - набор узлов), тогда как вы можете реализовать BFS(G) и создавать отдельные деревья автоматически.Это небольшая модификация очереди, и я оставлю ее в качестве упражнения.

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

0 голосов
/ 25 октября 2011

Вы поняли определение?Вы видели какие-нибудь картинки в священной книге?

Когда в нем говорится, что DFS может состоять из нескольких деревьев, это потому, что он идет глубже, пока не достигает листа, а затем возвращается назад.Итак, представьте себе дерево, сначала вы ищите левое поддерево, а затем правое поддерево.левое поддерево может содержать несколько поддеревьев.Вот почему.

Когда вы думаете о BFS, он основан на уровне.Уровень первого поиска другими словами.Таким образом, у вас есть один источник (узел), чем вы ищете все подузлы этого уровня.

DFS с одним источником, если есть только один дочерний узел, поэтому у вас есть только 1 источник.Я думаю, что было бы более понятно, если вы берете источник в качестве родительского узла.

...