Я знаю, что только BFS может найти кратчайший путь на невзвешенном графике, но я также читал на нескольких сайтах, где люди утверждали, что BFS или DFS могут это сделать. Я просто хотел подтвердить, что это, вероятно, ошибки и что только BFS может это сделать (я не был полностью уверен даже после быстрого поиска Google). Если я ошибаюсь, может кто-то объяснить, как DFS может дать кратчайший путь.Самый короткий путь: DFS, BFS или оба?
ответ
DFS не обязательно дает кратчайшие пути в неориентированном графе. BFS будет правильным выбором здесь.
В качестве примера рассмотрим график, образованный путем взятия углов треугольника и их соединения. Если вы попытаетесь найти кратчайший путь от одного узла к другому с помощью DFS, тогда вы получите неправильный ответ, если не будете следовать краю, напрямую связанному с начальным и целевым узлами.
Надеюсь, это поможет!
Итеративный поиск углубления (IDS), который состоит из множества раундов поиска по глубине (в основном DFS, но прекратите поиск, если вы достигли предела глубины d), которые постепенно увеличивают глубину от 1, найдут кратчайший путь в невзвешенном графике.
// Iterative deepening search
// isGoal is a function that checks whether the current node is the goal
function ids(graph, start, isGoal) {
maxDepth = 1
do {
found = dls(graph, start, isGoal, maxDepth, 0)
// Clear the status whether a node has been visited
graph.clearVisitedMarker();
// Increase maximum depth
depth = depth + 1
// You can slightly modify the dls() function to return whether there is a
// node beyond max depth, in case the graph doesn't have goal node.
} while (found == null)
return found
}
// Depth-limited search
// isGoal is a function that checks whether the current node is the goal
function dls(graph, currentNode, isGoal, maxDepth, currentDepth) {
if (graph.visited(currentNode)) {
return null
}
graph.setVisited(currentNode)
if (isGoal(currentNode)) {
return currentNode
}
// Stop searching when exceed max depth
// This is the only difference from DFS
if (currentDepth >= maxDepth) {
return null
}
for (adjNode in graph.getAdjacent(currentNode)) {
found = dls(graph, adjNode, goal, maxDepth, currentDepth + 1)
if (found != null) {
return found
}
}
return null
}
Это работает, так как вы постепенно увеличивать допустимую длину от начального узла: узел, который имеет расстояние а + 1 не будет изучаться перед узлом, который имеет расстояние а, из-за лимита на глубину.
Общая проблема заключается в том, что узлы с расстоянием a будут повторно посещены (d - a + 1) раз, где d - глубина кратчайшего пути к цели. Это зависит от графика или дерева поиска, если мы хотим поговорить о производительности. В дереве поиска с большим коэффициентом ветвления узлы, сгенерированные на глубине d, становятся доминирующим, поэтому проблемы с переходом не так уж много. BFS непригодна для такого случая из-за требования к экспоненциальному пространству, но IDS будет использовать только полиномиальное пространство.
Оба BFS и DFS будут давать кратчайший путь от A до B, если вы внесли правильный.
Давайте рассмотрим весь график как дерево. В основном, BFS будет запускать каждый уровень дерева и определять путь, пройдя все уровни. В отличие от этого, DFS будет работать с каждым узлом листа и узнать путь, когда пересекает узел по этому пути. Оба они используют поиск путей поиска выходов, поэтому оба они гарантируют поиск кратчайшего пути, если вы правильно выполнили эти алгоритмы.
Плюсы и минусы использования BFS и DFS является следующее:
BFS, использует больше памяти, пройти все узлы
DFS, использует меньше памяти, может быть немного быстрее, если вам повезет, чтобы выбрать путь узла листа содержит интересующий вас узел. (Не обязательно проходить все узлы).
Но вы должны убедиться, что путь к этому листу является самым коротким, не так ли? – GniruT
Ты говоришь только о деревьях, да? Потому что ваши рассуждения не подходят для графиков –
Перспектива для понимания: BFS на графике без веса и направления совпадает с Dijkstra (вес = 1, в одном направлении), поэтому понимание того, почему Dijkstra прав, может помочь. Более подробная информация будет добавлена, если я ее пропустил.
- 1. Выходы DFS и BFS?
- 2. Самый короткий путь с глубиной первого поиска
- 3. Применение BFS или DFS
- 4. Самый дешевый путь в двунаправленном взвешенном графе DFS/Greedy BFS
- 5. Найти самый короткий путь или самый быстрый путь
- 6. Самый короткий путь между двумя вершинами с BFS
- 7. Python networkx DFS или BFS отсутствует?
- 8. Самый короткий путь Алгоритм
- 9. Самый короткий путь между двумя узлами Trie
- 10. Модификации BFS/DFS, чтобы проверить простые пути
- 11. печать перестановки с использованием bfs или dfs
- 12. Самый короткий путь с препятствиями
- 13. Самый короткий путь к цели?
- 14. R, определить самый короткий путь
- 15. Пользовательская карта Самый короткий путь
- 16. Выполнение DFS и BFS на ориентированном графе
- 17. Сколько разных DFS и BFS можно сделать из графика? показать DFS больше разнообразия или BFS?
- 18. DFS vs BFS .2 отличия
- 19. Найти самый длинный путь с BFS
- 20. Разница между BFS и DFS
- 21. Когда использовать DFS и BFS
- 22. Создание кода DFS из BFS
- 23. Пролог Самый короткий путь, используя список списков
- 24. Самый короткий путь, алгоритм наименьших поворотов
- 25. Самый короткий путь для изучения некоторых точек
- 26. Самый короткий путь и алгоритм Дейкстры
- 27. Самый короткий путь алгоритма Floyd-Warshall
- 28. Решение проблемы разрешено с использованием DFS или Greedy BFS?
- 29. Самый короткий путь для гигантского лабиринта (ОГРОМНЫЙ)
- 30. Объяснить BFS и DFS с точки зрения возвратов
Это не принадлежит здесь, также, это дубликат записи на сайте, который он принадлежит http://cs.stackexchange.com/questions/4914/why-cant-dfs-be-used- to-find-shortest-paths-in-unweighted-graphs –