Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Interaktiver Breitensuche-Visualisierer
Erforscht den Graphen Ebene für Ebene und besucht alle Nachbarn, bevor es tiefer geht
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Die Breitensuche (BFS) ist ein grundlegender Graph-Durchlaufalgorithmus, der einen Graphen Ebene für Ebene erkundet. Ausgehend von einem Startknoten besucht sie zuerst jeden Nachbarn im Abstand eins, dann jeden Knoten im Abstand zwei und so weiter, wobei eine Warteschlange die Grenze verwaltet. Weil sie stets die nächstgelegenen unbesuchten Knoten zuerst ausdehnt, findet BFS den kürzesten Weg in jedem ungewichteten Graphen.
BFS legt den Startknoten in eine Warteschlange und markiert ihn als besucht. Dann entnimmt sie wiederholt den vordersten Knoten, prüft dessen Nachbarn und hängt jeden noch nicht besuchten Nachbarn hinten an. Dieses First-in-first-out-Prinzip garantiert, dass Knoten in aufsteigender Entfernung zur Quelle verarbeitet werden. Der Algorithmus läuft in O(V + E) Zeit und O(V) Speicher, wobei V die Zahl der Knoten und E die der Kanten ist.
BFS treibt Kürzeste-Wege-Anfragen in ungewichteten Netzen, Webcrawler, Freundschaftsvorschläge in sozialen Netzwerken, GPS-Rundsuchen und die ebenenweise Traversierung von Bäumen an. Sie ist zudem das Rückgrat fortgeschrittener Verfahren wie Edmonds-Karp für den maximalen Fluss. BFS gehört zu den häufigsten Themen in Programmier-Interviews und taucht in Gitter-, Labyrinth- und Wortleiter-Aufgaben auf.
Der gesamte Algorithmus besteht aus einer Warteschlange und einer Besuchtmenge. Alles Weitere, wofür BFS bekannt ist, folgt aus der Reihenfolge, in der die Warteschlange die Knoten zurückgibt.
BFS(graph, quelle):
besucht = {quelle}
dist[quelle] = 0
schlange = [quelle]
solange die Schlange nicht leer ist:
u = schlange.entferneErstes()
für jeden Nachbarn v von u:
wenn v nicht in besucht:
besucht.hinzufügen(v)
dist[v] = dist[u] + 1
vorgänger[v] = u
schlange.hängeAn(v)Die Invariante lautet, dass die Warteschlange stets Knoten aus höchstens zwei aufeinanderfolgenden Distanzebenen enthält, in nicht fallender Reihenfolge. Genau diese Eigenschaft macht dist korrekt: Ein Knoten erhält seine Distanz beim ersten Sehen, und später kann er nicht mehr günstiger erreicht werden.
Führe BFS von A aus auf dem Graphen, den der Visualisierer standardmäßig lädt, damit sich jeder Schritt oben im Panel mitverfolgen lässt.
Beispielgraph: Ungerichtete Kanten A-B (2), A-C (3), B-C (1) und C-D (4). BFS ignoriert die Gewichte vollständig und zählt Schritte, jede Kante zählt also eins.
Die Enddistanzen sind A 0, B 1, C 1, D 2, und die Vorgängerzeiger ergeben den Kürzeste-Wege-Baum A zu B, A zu C und C zu D. Beachte, dass BFS D über C erreicht, obwohl die gewichteten Kosten dieses Weges 7 betragen gegenüber 3 für A zu B zu C: Optimiert wird ausschließlich die Zahl der Schritte, und genau deshalb brauchen gewichtete Graphen Dijkstra.
Zeit: O(V + E) · Speicher: O(V)
Jeder Knoten betritt die Warteschlange höchstens einmal, weil er beim Einfügen als besucht markiert wird und nicht erst beim Entnehmen. Das begrenzt die äußere Schleife auf V Durchläufe. Innerhalb der Schleife ist der Aufwand proportional zum Grad des aktuellen Knotens, und die Summe aller Grade beträgt 2E in einem ungerichteten Graphen, sodass das Durchmustern der Nachbarn insgesamt O(E) kostet. Der Speicher wird von Besuchtmenge, Distanzfeld und Warteschlange bestimmt, jeweils O(V). Mit einer Adjazenzmatrix kostet das Durchmustern der Nachbarn O(V) je Knoten und der gesamte Lauf verschlechtert sich auf O(V hoch 2).
BFS ist die richtige Voreinstellung, solange die Kanten ungewichtet sind. Sobald Gewichte auftreten oder das Ziel von Distanz auf Struktur wechselt, gewinnt etwas anderes.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| DFS | Du brauchst strukturelle Aussagen statt Distanz: Zyklen, topologische Ordnung, Komponenten, Brücken. DFS braucht zudem weniger Speicher bei breiten Graphen. | O(V + E) |
| Dijkstra-Algorithmus | Die Kanten tragen nichtnegative Gewichte, sodass die Schrittzahl nicht mehr der Distanz entspricht. | O((V + E) log V) |
| 0-1-BFS | Jedes Gewicht ist 0 oder 1. Eine Deque ersetzt die Warteschlange und schlägt eine vollwertige Prioritätswarteschlange. | O(V + E) |
| Bidirektionale BFS | Du willst die Distanz zwischen einem bestimmten Paar in einem großen Graphen und kannst rückwärts vom Ziel suchen. | O(b^(d/2)) |
Den ganzen Artikel lesen: BFS vs DFS: When to Use Each Traversal
Verwandte Algorithmen: Tiefensuche, Dijkstra-Algorithmus, Bipartit-Prüfung