2011-10-25 2 views
4

Я читаю около DFS в Введение в алгоритмы от Cormen. Ниже приведен фрагмент .Разница между BFS и DFS

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

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

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

Мой вопрос

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

ответ

6

Когда указано несколько источников, это относится к начальному узлу поиска. Вы заметите, что параметры алгоритмов: 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

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

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

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

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

Смежные вопросы