Wenn graphische Darstellungen der Suche gibt es zwei einfache Algorithmen: Breite erste und depth-first ( In der Regel erfolgt , indem all adjactent Graph Knoten zu einer Warteschlange hinzuzufügen (Breite-first) oder Stapel (depth-first)).
Gibt es Vorteile eines gegenüber dem anderen?
Die, an die ich denken konnte:
- Wenn Sie erwarten, dass Ihre Daten ziemlich weit unten im Diagramm sind, kann es sein, dass Depth-First sie früher findet, da Sie sehr schnell in die tieferen Teile des Diagramms vordringen.
- Wenn Sie dagegen davon ausgehen, dass Ihre Daten ziemlich weit oben im Diagramm sind, gibt width-first möglicherweise das Ergebnis früher wieder.
Gibt es etwas, das ich verpasst habe oder hängt es hauptsächlich von persönlichen Vorlieben ab?
Ein Punkt, der in unserer Multicore-Welt wichtig ist: BFS lässt sich viel einfacher parallelisieren. Dies ist intuitiv sinnvoll (senden Sie Threads für jedes Kind aus) und kann auch so nachgewiesen werden. Wenn Sie also ein Szenario haben, in dem Sie die Parallelität nutzen können, ist BFS der richtige Weg.
quelle
(Ich habe dies zu einem Community-Wiki gemacht. Bitte fühle dich frei, es zu bearbeiten.)
Wenn
Dann
Gründe zu wählen
IDDFS = iterative vertiefende Tiefensuche
quelle
h
der "Höhe des Baumes". Bedeutet das direkt die "Höhe des Graphen"?Ein Szenario (abgesehen vom Auffinden des kürzesten Pfades, der bereits erwähnt wurde), in dem Sie möglicherweise einen über den anderen wählen müssen, um ein korrektes Programm zu erhalten, wären unendliche Graphen:
Wenn wir zum Beispiel einen Baum betrachten, in dem jeder Knoten eine endliche Anzahl von untergeordneten Knoten hat, die Höhe des Baums jedoch unendlich ist, wird DFS möglicherweise nie den gesuchten Knoten finden - es wird nur das erste untergeordnete Knoten dieses Knotens besucht Wenn also das gesuchte Kind nicht das erste Kind seines Elternteils ist, wird es niemals dorthin gelangen. BFS wird es jedoch garantiert in endlicher Zeit finden.
Wenn wir einen Baum betrachten, in dem jeder Knoten eine unendliche Anzahl von untergeordneten Knoten hat, der Baum jedoch eine endliche Höhe hat, wird BFS möglicherweise nicht beendet. Es werden nur die untergeordneten Knoten des Stammknotens besucht. Wenn der gesuchte Knoten das untergeordnete Element eines anderen Knotens ist, wird er nicht erreicht. In diesem Fall wird DFS garantiert, um es in der endlichen Zeit zu finden.
quelle
Die Breite zuerst und die Tiefe zuerst weisen mit Sicherheit dasselbe Worst-Case-Verhalten auf (der gewünschte Knoten ist der zuletzt gefundene). Ich vermute, dass dies auch im Normalfall der Fall ist, wenn Sie keine Informationen zu Ihren Diagrammen haben.
Ein netter Vorteil der Breitensuche ist, dass sie kürzeste Pfade (im Sinne der kleinsten Kanten) findet, die möglicherweise von Interesse sind oder nicht.
Wenn Ihr durchschnittlicher Knotenrang (Anzahl der Nachbarn) im Verhältnis zur Anzahl der Knoten hoch ist (dh der Graph ist dicht), hat die Breite zuerst große Warteschlangen, während die Tiefe zuerst kleine Stapel hat. In spärlichen Diagrammen ist die Situation umgekehrt. Wenn der Speicher ein begrenzender Faktor ist, muss die Form des Diagramms möglicherweise Ihre Wahl der Suchstrategie beeinflussen.
quelle
Alles oben Genannte ist korrekt, aber es ist bemerkenswert, dass BFS und DFS ihre eigenen Bäume erstellen, basierend auf der Reihenfolge, in der sie den Baum durchlaufen. Jeder dieser Bäume hat seine eigene Eigenschaft, die bei einigen Problemen nützlich sein kann.
Beispielsweise sind alle Kanten im Originaldiagramm, die sich nicht im BFS-Baum befinden, Kreuzkanten. Kanten, die zwischen zwei Zweigen des BFS-Baums liegen. Alle Kanten im Originaldiagramm, die sich nicht im DFS-Baum befinden, sind hintere Kanten. Kanten, die zwei Eckpunkte in einem Zweig des DFS-Baums verbinden. Solche Eigenschaften können bei Problemen wie Sonderfarben usw. hilfreich sein.
quelle
DFS- und BFS-Baum haben jeweils eigene Eigenschaften, mit denen Sie nützliche Informationen zum Diagramm erhalten. Zum Beispiel können Sie mit einem einzelnen DFS Folgendes tun:
Mit BFS können Sie die kürzesten Pfade zwischen dem Quellknoten und anderen Knoten im Diagramm finden.
Das Kapitel Graph Algorithms in CLRS fasst diese Eigenschaften von DFS und BFS sehr gut zusammen.
quelle
Ich denke, es wäre interessant, beide so zu schreiben, dass Sie nur durch Umschalten einiger Codezeilen den einen oder anderen Algorithmus erhalten, sodass Sie feststellen, dass Ihr Dillem nicht so stark ist, wie es zunächst zu sein scheint .
Ich persönlich mag die Interpretation von BFS als Überschwemmung einer Landschaft: Die Gebiete mit geringer Höhe werden zuerst überschwemmt, und erst dann werden die Gebiete mit hoher Höhe folgen. Wenn Sie sich die Landschaftshöhen als Isolinien vorstellen, wie wir es in den Geografiebüchern sehen, ist es leicht zu sehen, dass BFS alle Bereiche unter derselben Isolinie gleichzeitig ausfüllt, genau wie dies bei der Physik der Fall wäre. Die Interpretation von Höhen als Entfernung oder skalierte Kosten liefert daher eine ziemlich intuitive Vorstellung des Algorithmus.
Vor diesem Hintergrund können Sie die Idee der Breitensuche leicht anpassen, um den minimalen Spannbaum, den kürzesten Pfad und viele andere Minimierungsalgorithmen zu finden.
Ich habe noch keine intuitive Interpretation von DFS gesehen (nur die Standardinterpretation über das Labyrinth, aber sie ist nicht so mächtig wie die BFS und das Fluten), daher scheint es für mich, dass BFS besser mit den oben beschriebenen physikalischen Phänomenen korreliert, während DFS korreliert besser mit Entscheidungen, die auf rationalen Systemen getroffen werden (dh Menschen oder Computer entscheiden, welche Schritte bei einem Schachspiel oder beim Verlassen eines Labyrinths unternommen werden).
Für mich liegt der Unterschied darin, welches Naturphänomen am besten zu ihrem Ausbreitungsmodell (Transversing) im wirklichen Leben passt.
quelle