Menu
Coddy logo textTech

Breitensuche (BFS)

Zuletzt aktualisiert

Die Breitensuche erkundet einen Graphen Ebene für Ebene. Ausgehend von einem Quellknoten besucht sie zuerst alle seine direkten Nachbarn, dann alle noch nicht besuchten Nachbarn davon und so weiter - sie breitet sich in Ringen wachsender Distanz nach außen aus. Drücke oben auf Abspielen, um zu sehen, wie sie sich vom Startknoten aus Ebene für Ebene ausbreitet.

BFS verwendet eine First-in-First-out-Warteschlange, die die Reihenfolge Ebene für Ebene erzwingt. Da sie Knoten in der Reihenfolge der Sprungdistanz erreicht, findet BFS in einem ungewichteten Graphen den kürzesten Weg (die wenigsten Kanten). Sie besucht jeden Knoten und jede Kante einmal und läuft daher in O(V + E) Zeit.

Zeit- und Speicherkomplexität

MaßKomplexitätAnmerkungen
ZeitO(V + E)Jeder Knoten und jede Kante wird einmal besucht
SpeicherO(V)Warteschlange + Besucht-Menge, im schlimmsten Fall alle Knoten
DurchlaufEbene für EbeneNächstgelegene Knoten zuerst, in Ringen
Kürzester WegJa (ungewichtet)Erreicht jeden Knoten über die wenigsten Kanten

Schritt für Schritt

SchrittWas passiert
1Füge den Quellknoten in die Warteschlange ein.
2Entnimm den vordersten Knoten und markiere ihn als besucht.
3Betrachte jeden seiner Nachbarn.
4Füge jeden Nachbarn ein, der nicht bereits besucht oder in der Warteschlange ist.
5Wiederhole, bis die Warteschlange leer ist.

Durchgerechnetes Beispiel

Durchlauf dieses Graphen ab Knoten 0, wobei 0-1, 0-2, 1-3, 2-3, 2-4 Kanten sind:

SchrittBesuchtWarteschlange (Front)
Start{}[0]
Entnimm 0{0}[1, 2]
Entnimm 1{0, 1}[2, 3]
Entnimm 2{0, 1, 2}[3, 4]
Entnimm 3{0, 1, 2, 3}[4]
Entnimm 4{0, 1, 2, 3, 4}[] (fertig)

Wann BFS verwenden

Verwende es, wennVermeide es, wenn
Du den kürzesten Weg in einem ungewichteten Graphen brauchstKanten Gewichte haben - verwende stattdessen Dijkstra
Das Ziel wahrscheinlich nahe an der Quelle liegtDer Graph sehr breit ist - die Warteschlange kann eine riesige Front halten
Du einen Graphen in Ebenenreihenfolge erkunden willstDu nur irgendeinen Knoten erreichen musst, wo DFS weniger Speicher braucht
Du Zusammenhangskomponenten oder eine Route mit minimalen Sprüngen suchstDu topologische Sortierung oder Zyklenerkennung brauchst - DFS passt besser

Breadth-First Search-Code

Eine saubere, lauffähige Breadth-First Search-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Breadth-First Search-Code in Python

Python
1from collections import deque2
3
4def bfs(graph, start):5    visited = {start}6    queue = deque([start])7    order = []8    while queue:9        node = queue.popleft()10        order.append(node)11        for neighbor in graph[node]:12            if neighbor not in visited:13                visited.add(neighbor)  # mark on enqueue, not dequeue14                queue.append(neighbor)15    return order16
17
18graph = {19    "A": ["B", "C"],20    "B": ["D", "E"],21    "C": ["F"],22    "D": [],23    "E": ["F"],24    "F": [],25}26
27print("BFS order:", " -> ".join(bfs(graph, "A")))
Führe diesen Code im Python-Playground aus

Breitensuche FAQ

Wie ist die Zeitkomplexität von BFS?
BFS läuft in O(V + E) Zeit, wobei V die Anzahl der Knoten und E die der Kanten ist, da es jeden Knoten einmal besucht und jede Kante einmal betrachtet. Es benötigt O(V) Speicher für die Warteschlange und die Besucht-Menge.
Findet BFS den kürzesten Weg?
Ja, in einem ungewichteten Graphen. Da BFS die Knoten in der Reihenfolge der Sprungdistanz von der Quelle erreicht, erfolgt das erste Erreichen eines Knotens über einen Weg mit den wenigsten Kanten. Für gewichtete Graphen brauchst du stattdessen den Algorithmus von Dijkstra.
Was ist der Unterschied zwischen BFS und DFS?
BFS verwendet eine Warteschlange und erkundet Ebene für Ebene (die nächsten zuerst), während DFS einen Stapel verwendet und entlang eines Zweigs in die Tiefe geht, bevor es zurückkehrt. BFS findet die kürzesten ungewichteten Wege; DFS braucht bei breiten Graphen weniger Speicher und eignet sich für Zyklenerkennung und topologische Sortierung.
Wann sollte ich BFS statt des Algorithmus von Dijkstra verwenden?
Verwende BFS, wenn jede Kante die gleichen Kosten hat, denn es findet den Weg mit den wenigsten Kanten in O(V + E) Zeit ohne Prioritätswarteschlange. Der Algorithmus von Dijkstra ist nötig, wenn Kanten unterschiedliche Gewichte tragen; reines BFS auf einem gewichteten Graphen liefert den Weg mit den wenigsten Sprüngen, nicht den mit den geringsten Kosten.
Warum braucht BFS eine Besucht-Menge?
Graphen können Zyklen enthalten, sodass BFS ohne eine Besucht-Menge denselben Knoten wiederholt einreihen und endlos schleifen würde. Einen Knoten beim ersten Einreihen zu markieren (nicht beim Entnehmen) verhindert außerdem, dass derselbe Knoten von verschiedenen Nachbarn zweimal in die Warteschlange gelegt wird.
Soll ich einen Knoten beim Einreihen oder beim Entnehmen als besucht markieren?
Markiere ihn beim Einreihen. Wenn du bis zum Entnehmen wartest, kann ein Knoten vor seiner Verarbeitung von verschiedenen Nachbarn mehrfach in die Warteschlange gelegt werden, was Speicher und Zeit verschwendet. Das Markieren beim Einreihen garantiert, dass jeder Knoten genau einmal in die Warteschlange gelangt.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S