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

Мне это кажется противоположным тому, чего я ожидал. BFS необходимо сохранить только последний посещенный узел. Например, если мы ищем цифру 7 в дереве ниже:

enter image description here

Он будет искать узел со значением 8, затем 3, 10, 1, 6, 14, 4, затем, наконец, 7. Для DFS он будет искать узел со значением 8, затем 3, 1, 6, 4, затем, наконец, 7. .

Если каждый узел хранится в памяти с информацией о его значении, его дочерних элементах и ​​его положении в дереве, тогда программе BFS потребуется только сохранить информацию о положении последнего посещенного узла, после чего она сможет проверить tree и найдите следующий узел в дереве. Программа DFS должна хранить последний узел, на котором она была, а также все узлы, которые она уже посетила, поэтому она не проверяет их снова, а просто циклически перебирает все листовые узлы, выходящие из одного из узлов второго-последнего поколения.

Так почему же BFS на самом деле использует меньше памяти?

15
Blue7 5 Май 2014 в 20:58

3 ответа

Лучший ответ

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

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

8-3-1-3-6-4-6-7-6-3-8-10-14-13-14-10-8

BFS должен перемещаться вверх и вниз по дереву до самого верха всякий раз, когда он переходит к другой половине дерева. Он будет перемещаться по узлам в следующем порядке:

8-3-8-10-8-3-1-3-6-3-8-10-14-10-8-3-1-6-4-6-7-6-3-8-10-14-13-14-10-8

(Я не уверен, что это все, возможно, ему даже придется пройти еще несколько раз, чтобы узнать, что на последнем уровне больше нет узлов.)

Как видите, BFS намного менее эффективна, если вы хотите реализовать алгоритм, использующий минимум памяти.

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

Например, в (сбалансированном) дереве с 1023 узлами DFS должна отслеживать 10 узлов, а BFS должна отслеживать 512 узлов.

22
Guffa 5 Май 2014 в 17:39

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

Рассмотрим это дерево: (источник)

С BFS на каком-то этапе все узлы с 8-15 будут в памяти.

С DFS у вас никогда не будет больше 4 узлов в памяти (равной высоте дерева).

Разница становится намного хуже по мере того, как дерево становится больше (пока оно остается довольно полным).

В частности, BFS использует память O(branchingFactor^maxDepth) или O(maxWidth), тогда как DFS использует только O(maxDepth).

Если maxWidth < maxDepth, BFS следует использовать меньше памяти (при условии, что вы используете одинаковые представления для обоих), но это редко бывает правдой.

30
Bernhard Barker 5 Май 2014 в 17:23

В общем, это может или не может в зависимости от конкретного графика.

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

При поиске в ширину используется очередь, которая содержит узлы в начале поиска. Так что максимум все узлы на расстоянии d .

В общем графике все, что вы можете сказать, это то, что в любом случае это не больше всех узлов дерева.

Но если у вас сбалансированное (или почти такое) k -арное дерево, его глубина, то есть радиус, будет только O (log ( n )), а наименьшее слой будет содержать O ( n ) узлов ( n / 2 для двоичного дерева и даже больше для более высоких степеней).

Таким образом, поиск в глубину будет использовать только O (log ( n )) памяти, а поиск в ширину будет использовать O ( n ). Для сбалансированных k -арных деревьев; для других случаев возможны другие результаты (но для большинства обычных графиков диаметр все равно будет значительно меньше окружности).

5
Jan Hudec 5 Май 2014 в 17:21