6

Wiem, że sam BFS może znaleźć najkrótszą ścieżkę na nieważonym wykresie, ale czytam także na kilku stronach, na których ludzie twierdzili, że albo BFS, albo DFS może to zrobić. Chciałem tylko potwierdzić, że były to prawdopodobnie błędy i że tylko BFS może to zrobić (nie byłem całkowicie pewny, nawet po wykonaniu szybkiego wyszukiwania w Google). Jeśli jestem niepoprawny, czy ktoś może wyjaśnić, w jaki sposób DFS może podać najkrótszą ścieżkę.Najkrótsza ścieżka: DFS, BFS lub obie?

+0

To nie jest tutaj, także, jest duplikatem wpisu na stronie, który należy do http://cs.stackexchange.com/questions/4914/why-cant-dfs-be-used- to-find-shortest-paths-in-unweighted-graphs –

Odpowiedz

10

DFS niekoniecznie musi podawać najkrótsze ścieżki na nieukierunkowanym wykresie. BFS będzie właściwym wyborem tutaj.

Jako przykład rozważmy wykres utworzony przez zajęcie rogów trójkąta i połączenie ich. Jeśli spróbujesz znaleźć najkrótszą ścieżkę z jednego węzła do drugiego za pomocą DFS, otrzymasz błędną odpowiedź, chyba że podążasz za krawędzią bezpośrednio łączącą węzły początkowe i docelowe.

Mam nadzieję, że to pomoże!

3

Iteracyjne wyszukiwanie pogłębione (IDS), które składa się z wielu rund wyszukiwania ograniczonego do głębi (w zasadzie DFS, ale przestaje wyszukiwać, jeśli osiągnięto ograniczenie głębokości d), które stopniowo zwiększa głębokość od 1, znajdzie najkrótszą ścieżkę na nieważonym wykresie.

// 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 
} 

To działa, ponieważ stopniowo zwiększać dystans dozwolony od węzła start: węzeł, który ma zdystansować a + 1 nie zostanie zbadana przed węzeł, który ma odległość A, z powodu limitu głębokości.

Powszechną obawą jest to, że węzły z odległością a zostaną ponownie odwiedzone (d - a + 1) razy, gdzie d jest głębokością najkrótszej ścieżki do celu. Zależy od wykresu lub drzewa wyszukiwania, jeśli chcemy mówić o wydajności. W drzewie wyszukiwania o dużym współczynniku rozgałęzienia, węzły generowane na głębokości d stają się dominującym terminem, więc nie ma większego problemu z ponownym przeglądaniem. BFS nie nadaje się do użytku w takim przypadku ze względu na zapotrzebowanie na wykładniczą powierzchnię, ale IDS użyje tylko przestrzeni wielomianowej.

0

Zarówno BFS, jak i DFS podają najkrótszą ścieżkę od A do B, jeśli została wprowadzona prawidłowa.

Pomyślmy cały wykres jako drzewo. Zasadniczo BFS uruchomi każdy poziom drzewa i odkryje ścieżkę, przechodząc przez wszystkie poziomy. W przeciwieństwie do tego, DFS będzie działał do każdego węzła liści i znajdzie ścieżkę, gdy węzeł przemieszcza się wzdłuż tej ścieżki. Oba korzystają z wyszukiwania ścieżek spalin, więc obie z nich zagwarantują znalezienie najkrótszej ścieżki, jeśli poprawnie zaimplementujesz te algorytmy.

Plusy i minusy korzystania BFS i DFS jest następujący:

BFS, wykorzystuje więcej pamięci, przechodzą wszystkie węzły

DFS, zużywa mniej pamięci, może być nieco szybciej, jeśli masz szczęście, aby wybrać ścieżka węzła liść zawiera węzeł, który cię interesuje. (Nie koniecznie musisz przechodzić przez wszystkie węzły).

+0

Ale musisz się upewnić, że ścieżka do tego liścia jest najkrótsza, prawda? – GniruT

+0

Mówisz tylko o drzewach, prawda? Coz twojego rozumowania nie pasuje do wykresów –

1

Perspektywa zrozumienia: BFS na wykresie bez masy i kierunku jest taki sam jak Dijkstra (waga = 1, jeden kierunek), więc zrozumienie, dlaczego Dijkstra ma rację, może pomóc. Więcej szczegółów zostanie dodanych, jeśli się udało.

Powiązane problemy