Поиск по графику: сначала ширина, либо глубина


79

При поиске графиков существует два простых алгоритма: ширина в ширину и глубина вначале (обычно это делается путем добавления всех соседних узлов графа в очередь (ширина в первую очередь) или в стек (глубина в первую очередь)).

Есть ли преимущества одного над другим?

Те, о которых я мог думать:

  • Если вы ожидаете, что ваши данные будут находиться довольно глубоко внутри графика, сначала функция глубины может найти их раньше, так как вы очень быстро углубляетесь в более глубокие части графика.
  • И наоборот, если вы ожидаете, что ваши данные будут довольно далеко на графике, то в ширину может дать результат раньше.

Я что-то пропустил или все сводится к личным предпочтениям?

Ответы:


43

Я хотел бы процитировать ответ от Stack Overflow от hstoerr, который хорошо освещает проблему:

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

Но это всего лишь эмпирические правила; вам, вероятно, нужно будет поэкспериментировать.

Рафал Доугирд также отмечает:

Некоторые алгоритмы зависят от конкретных свойств DFS (или BFS) для работы. Например, алгоритм Хопкрофта и Тарьяна для поиска 2-соединенных компонентов использует тот факт, что каждый уже посещенный узел, обнаруженный DFS, находится на пути от корневого до текущего исследуемого узла.


5
Я не могу понять, почему в этом ответе 27 голосов, и это как раз слияние двух других ответов, которые, кстати, просто общие мысли о ...
nbro

37

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


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

Этот ответ не заслуживает 20 голосов. Речь идет об общем использовании двух алгоритмов, а не о конкретном использовании.
nbro

31

(Я сделал это вики сообщества. Пожалуйста, не стесняйтесь редактировать.)

Если

  • b - фактор ветвления
  • d - глубина, на которой решение
  • h - высота дерева (поэтому )dh

затем

  • DFS занимает время и пространствоO(bh)O(h)
  • BFS занимает время и пространствоO(bd)O(bd)
  • IDDFS занимает время и пространствоO(bd)O(d)

Причины выбрать

  • ДФС
    • все равно должно видеть все дерево
    • вы знаете , уровень ответаd
    • не волнует, если ответ ближе к корню
  • BFS
    • ответ близок к корню
    • Вы хотите ответ, который ближе всего к корню
    • иметь несколько ядер / процессоров
  • IDDFS
    • Вы хотите BFS, не хватает памяти, но допустимо несколько медленнее

IDDFS = итеративное углубление поиска в глубину


1
Это отличный ответ. Однако я замечаю, что хотя вопрос о графиках задается, этот ответ относится к деревьям. Дерево - это, конечно, график, и это может быть слово, которое можно заменить ... но как насчет h"высоты дерева". Это переводит непосредственно к "высоте графика"?
user2023370

Другой причиной использования IDDFS является то, что в зависимости от того, как вы хотите его использовать, после каждой итерации у вас может быть возможный ответ (если вы ищете, скажем, максимум или минимум). Это означает, что вы можете выйти из алгоритма раньше, если ваш ответ «достаточно хорош», или вы можете выйти из него по пользовательскому вводу (например, шахматный движок, использующий IDDFS, чтобы найти оптимальное решение, но прерываемый игроком, перемещающим фигуру).
jedd.ahyoung

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

17

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

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

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


7
Следует отметить, что оба дают только алгоритмы полу-решения для бесконечных графов; Вы не можете решить за конечное время, что элемент не находится в дереве (очевидно). Что касается практических приложений, обратите внимание, что (концептуально) могут быть определены бесконечные структуры данных (см. Пункт 3.4)!
Рафаэль

15

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

Одним приятным бонусом поиска в ширину является то, что он находит кратчайшие пути (в смысле наименьших ребер), которые могут представлять интерес, а могут и не интересоваться.

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


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

3

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

Например, все ребра в исходном графе, которых нет в дереве BFS, являются перекрестными ребрами; ребра, которые находятся между двумя ветвями дерева BFS. Все ребра в исходном графе, которых нет в дереве DFS, являются задними ребрами; ребра, которые соединяют две вершины в ветви дерева DFS. Такие свойства могут быть полезны для таких проблем, как специальные окраски и т. Д.


1

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

  • Найти мосты и точки сочленения (для неориентированных графов)
  • Обнаружение цикла
  • Найти сильно связанные компоненты (алгоритм Тарьяна)

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

Глава Graph Algorithms в CLRS очень хорошо суммирует эти свойства DFS и BFS.


-2

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

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

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

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

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


2
Добро пожаловать на сайт! Тем не менее, я не вижу, как это отвечает на вопрос. Похоже, у вас общие чувства и интуиция к BFS и DFS, но вопрос не в чувствах и интуиции, а в преимуществах и недостатках. Ваш ответ, кажется, не касается этого вообще.
Дэвид Ричерби

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

1
Вопрос не в том, что связано с BFS и DFS. Это не вопрос о том, чтобы найти покрывающие деревья или кратчайшие пути или как "воспроизвести природные явления".
Дэвид Ричерби

Его просят о преимуществах. Если можно моделировать физические явления, в то время как другие не могут, то это преимущество, если вам нужно моделировать эти явления. Я думаю, что вы придерживаетесь стандартных концепций алгоритмов учебника при интерпретации слова «преимущество», а я нет
user5193682
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.