При поиске графиков существует два простых алгоритма: ширина в ширину и глубина вначале (обычно это делается путем добавления всех соседних узлов графа в очередь (ширина в первую очередь) или в стек (глубина в первую очередь)).
Есть ли преимущества одного над другим?
Те, о которых я мог думать:
- Если вы ожидаете, что ваши данные будут находиться довольно глубоко внутри графика, сначала функция глубины может найти их раньше, так как вы очень быстро углубляетесь в более глубокие части графика.
- И наоборот, если вы ожидаете, что ваши данные будут довольно далеко на графике, то в ширину может дать результат раньше.
Я что-то пропустил или все сводится к личным предпочтениям?
Один момент, который важен в нашем многоядерном мире: BFS намного проще распараллелить. Это интуитивно разумно (отсылать темы для каждого ребенка) и может быть доказано так же. Так что если у вас есть сценарий, в котором вы можете использовать параллелизм, то BFS - это путь.
источник
(Я сделал это вики сообщества. Пожалуйста, не стесняйтесь редактировать.)
Если
затем
Причины выбрать
IDDFS = итеративное углубление поиска в глубину
источник
h
"высоты дерева". Это переводит непосредственно к "высоте графика"?Одним из сценариев (кроме поиска кратчайшего пути, который уже был упомянут), когда вам, возможно, придется выбирать один из других, чтобы получить правильную программу, были бы бесконечные графы:
Если мы рассмотрим, например, дерево, в котором каждый узел имеет конечное число дочерних элементов, но высота дерева бесконечна, DFS может никогда не найти искомый узел - он просто продолжит посещать первого дочернего элемента каждого его узла. видит, поэтому, если тот, кого вы ищете, не является первым дочерним элементом своего родителя, он никогда не попадет туда. Однако BFS гарантированно найдет его за конечное время.
Точно так же, если мы рассмотрим дерево, в котором каждый узел имеет бесконечное число дочерних элементов, но дерево имеет конечную высоту, BFS может не завершиться. Он будет посещать только дочерние узлы корневого узла, и если искомый узел является дочерним узлом какого-либо другого узла, он не будет достигнут. В этом случае DFS гарантированно найдет его за конечное время.
источник
Ширина в ширину и в глубину, безусловно, имеют одинаковое поведение в худшем случае (нужный узел является последним найденным). Я подозреваю, что это также верно для среднего случая, если у вас нет информации о ваших графиках.
Одним приятным бонусом поиска в ширину является то, что он находит кратчайшие пути (в смысле наименьших ребер), которые могут представлять интерес, а могут и не интересоваться.
Если ваш средний ранг узлов (количество соседей) высок по сравнению с количеством узлов (т. Е. График плотный), то в ширину сначала будут огромные очереди, а в глубине - небольшие стеки. На разреженных графиках ситуация обратная. Поэтому, если память является ограничивающим фактором, форма имеющегося графика может потребовать выбора стратегии поиска.
источник
Все вышеперечисленное является правильным, но следует отметить, что BFS и DFS создают свои собственные деревья, основываясь на порядке, который они используют для обхода дерева. Каждое из этих деревьев имеет свое собственное свойство, которое может быть полезно для решения каких-то проблем.
Например, все ребра в исходном графе, которых нет в дереве BFS, являются перекрестными ребрами; ребра, которые находятся между двумя ветвями дерева BFS. Все ребра в исходном графе, которых нет в дереве DFS, являются задними ребрами; ребра, которые соединяют две вершины в ветви дерева DFS. Такие свойства могут быть полезны для таких проблем, как специальные окраски и т. Д.
источник
Дерево DFS и BFS имеют свои уникальные свойства, которые могут дать вам более полезную информацию о графике. Например, с одной DFS вы можете сделать следующее:
С помощью BFS вы можете найти кратчайшие пути между исходным узлом и любыми другими узлами на графике.
Глава Graph Algorithms в CLRS очень хорошо суммирует эти свойства DFS и BFS.
источник
Я думаю, что было бы интересно написать их так, чтобы только переключение некоторых строк кода дало вам один или другой алгоритм, так что вы увидите, что ваша дилемма не так сильна, как кажется на первый взгляд. ,
Мне лично нравится интерпретация BFS как затопление ландшафта: сначала будут затоплены районы с низкой высотой, и только затем последуют районы с большой высотой. Если вы представляете высоты ландшафта как изолинии, как мы видим в книгах по географии, легко увидеть, что BFS заполняет все области одной и той же изолинии одновременно, как это было бы с физикой. Таким образом, интерпретация высоты как расстояния или масштабированной стоимости дает довольно интуитивное представление об алгоритме.
Имея это в виду, вы можете легко адаптировать идею, лежащую в основе поиска в ширину, чтобы легко найти минимальное связующее дерево, кратчайший путь, а также многие другие алгоритмы минимизации.
Я еще не видел какой-либо интуитивной интерпретации DFS (только стандартная для лабиринта, но она не такая мощная, как BFS и флуд), поэтому мне кажется, что BFS лучше соотносится с физическими явлениями, как описано выше, хотя DFS лучше коррелирует с выбором дилеммы в рациональных системах (т.е. люди или компьютеры решают, что делать в шахматной игре или выходить из лабиринта).
Таким образом, для меня разница между ложью, на которой природные явления лучше всего соответствуют их модели распространения (трансверсинга) в реальной жизни.
источник