Ich verstehe, dass die Verwendung von DFS "wie sie ist" keinen kürzesten Weg in einem ungewichteten Diagramm findet.
Aber warum ist das Optimieren von DFS, um kürzeste Wege in ungewichteten Diagrammen zu finden, eine so hoffnungslose Perspektive? Alle Texte zum Thema geben lediglich an, dass dies nicht möglich ist. Ich bin nicht überzeugt (ohne es selbst ausprobiert zu haben).
Kennen Sie Änderungen, mit denen DFS in ungewichteten Diagrammen die kürzesten Wege finden kann? Wenn nicht, was macht den Algorithmus so schwierig?
algorithms
graph-theory
shortest-path
Die unfun Katze
quelle
quelle
Antworten:
Das einzige Element der Tiefensuche, das Sie optimieren, ist die Reihenfolge, in der Kinder untersucht werden. Die normale Version läuft in beliebiger Reihenfolge ab, dh in der Reihenfolge, in der die Kinder gespeichert sind.
Die einzig mögliche Alternative (in Richtung kürzester Wege) ist ein gieriger Ansatz, bei dem Kinder in der Reihenfolge ihres Abstands vom aktuellen Knoten (von klein nach groß) betrachtet werden. Es ist einfach, ein Gegenbeispiel für diese Regel zu erstellen:
[ Quelle ]
Dies ist kein Beweis dafür, dass es keine Strategie für die Auswahl des nächsten zu untersuchenden Kindes gibt, die es der DFS ermöglicht, kürzeste Wege zu finden.
Unabhängig von der Regel¹ können Sie jedoch Diagramme erstellen, bei denen DFS gleich beim ersten Knoten einen langen Umweg einlegt, genau wie bei der gierigen Regel. Weisen Sie die Kantengewichte und ( s , a ) so zu, dass die Regel einen ersten Besuch wählt , und weisen Sie ( a , b ) ein Gewicht zu, das größer als das von ist(s,t) (s,a) a (a,b) (s,t)
quelle
Die Breitensuche ist der Algorithmus, der die kürzesten Wege in einem ungewichteten Graphen findet.
Es gibt eine einfache Optimierung, um von DFS zu einem Algorithmus zu gelangen, der die kürzesten Wege in einem ungewichteten Graphen findet. Im Wesentlichen ersetzen Sie den von DFS verwendeten Stapel durch eine Warteschlange. Der resultierende Algorithmus heißt jedoch nicht mehr DFS. Stattdessen haben Sie die Breitensuche implementiert.
Der obige Absatz gibt die richtige Intuition wieder, vereinfacht jedoch die Situation ein wenig. Es ist einfach, Code zu schreiben, für den der einfache Tausch eine Implementierung der Breitensuche ergibt, aber es ist auch einfach, Code zu schreiben, der auf den ersten Blick wie eine korrekte Implementierung aussieht, dies jedoch nicht ist. Eine verwandte cs.SE-Frage zu BFS vs DFS finden Sie hier . Sie können hier einen netten Pseudocode finden.
quelle
Du kannst!!!
Markieren Sie die Knoten als besucht, während Sie in die Tiefe gehen, und entfernen Sie die Markierung, während Sie zurückkehren.
Speichern Sie Kosten / Pfad für alle möglichen Suchen, bei denen Sie den Zielknoten gefunden haben, vergleichen Sie alle Kosten / Pfad und wählen Sie den kürzesten aus.
Das große (und ich meine GROSSE) Problem bei diesem Ansatz ist, dass Sie denselben Knoten mehrmals besuchen würden, was dfs zu einer offensichtlichen schlechten Wahl für den Algorithmus mit dem kürzesten Pfad macht.
quelle
BFS hat eine nette Eigenschaft, dass es alle Kanten von der Wurzel überprüft und den Abstand von der Wurzel zu den anderen Knoten so gering wie möglich hält, aber dfs springt einfach zum ersten benachbarten Knoten und geht in die Tiefe. Sie KÖNNEN DFS ändern, um den kürzesten Pfad zu ermitteln, aber Sie werden nur in einem Algorithmus mit höherer zeitlicher Komplexität landen oder dasselbe tun, was BFS tut
quelle
Mit DFS ist es möglich, den Pfad zwischen zwei Eckpunkten mit der Mindestanzahl von Kanten zu finden. Wir können Level-Ansatz anwenden
quelle
Du kannst
Durchqueren Sie den Graphen auf dfs-Weise und überprüfen Sie ihn
Hier ist der Link für die vollständige Lösung
quelle