Breitensuche vs. Tiefensuche (BFS vs. DFS): Besuchsreihenfolge, Datenstruktur, kürzeste Wege, Speicher und Einsatz
Beide sind Verfahren, um alle Knoten eines Graphen oder Baums entlang seiner Kanten zu besuchen. Die Breitensuche (BFS) breitet sich nach Entfernung aus: Sie besucht alle Knoten, die eine Kante vom Start entfernt sind, dann die zwei Kanten entfernten und so weiter. Die Tiefensuche (DFS) folgt einem Weg so weit wie möglich, und wenn sie in eine Sackgasse gerät, geht sie zurück und probiert einen anderen Weg. Die Breitensuche wird mit einer Warteschlange (Queue) implementiert, die Tiefensuche mit einem Stack oder mit Rekursion; bei einem als Adjazenzlisten gespeicherten Graphen besuchen beide alles in einer Zeit proportional zur Anzahl der Knoten plus der Anzahl der Kanten. Die Breitensuche ist die übliche Wahl für kürzeste Wege in ungewichteten Graphen, die Tiefensuche für das erschöpfende Durchsuchen aller Wege oder das Erkennen von Zyklen.
| Merkmal | Breitensuche (BFS) | Tiefensuche (DFS) |
|---|---|---|
| Besuchsreihenfolge | Nächste zuerst (wenigste Kanten vom Start), Schicht für Schicht nach außen | Geht einem Weg in die Tiefe nach, kehrt an einer Sackgasse um und nimmt den nächsten Weg |
| Verwendete Datenstruktur | Warteschlange (Queue; First In, First Out) | Stack (Last In, First Out) oder rekursive Aufrufe |
| Kürzeste Wege | In einem ungewichteten Graphen ist die Kantenzahl beim ersten Erreichen eines Knotens seine kürzeste Entfernung vom Start | Nicht garantiert: Ein Knoten kann zuerst über einen Umweg erreicht werden |
| Zeitkomplexität (V Knoten, E Kanten) | O(V + E) mit Adjazenzlisten, O(V²) mit einer Adjazenzmatrix | Wie bei der Breitensuche: O(V + E) mit Adjazenzlisten, O(V²) mit einer Adjazenzmatrix |
| Speicherbedarf | Die als Nächstes zu besuchenden Knoten liegen in der Warteschlange; bei vielen Verzweigungen liegt eine ganze Schicht von Knoten gleichzeitig darin, sodass sie groß wird | Rekursiv geschrieben braucht sie nur die Knoten auf dem aktuellen Weg, der Speicher wächst also mit der Tiefe des Weges; sehr tiefe Suchen können den Aufrufstapel überlaufen lassen |
| Ob eine Lösung gefunden wird | Bei endlich vielen Knoten immer; selbst wenn der Suchraum unbegrenzt wächst, werden flache Lösungen zuerst gefunden | In einem endlichen Graphen immer, wenn besuchte Knoten vermerkt werden; können Wege unbegrenzt tief werden, läuft sie womöglich einen Weg immer weiter hinab und kehrt nie zurück |
| Reihenfolge beim Baumdurchlauf | Level-Order (Ebene für Ebene ab der Wurzel, von links nach rechts) | Pre-Order, In-Order und Post-Order |
| Typischer Einsatz | Kürzeste Wege in ungewichteten Graphen, minimale Zugzahl in einem Labyrinth, wie viele Hops ein Netzwerk weit reicht | Erschöpfende Suche in Labyrinthen und Rätseln (Backtracking), Finden von Zusammenhangskomponenten und Zyklen, topologische Sortierung |
Die Zahlenwerte sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.