Informatik

Breitensuche (BFS): Ablauf und kürzeste Wege

Breitensuche (BFS): Ablauf und kürzeste Wege
Breitensuche (BFS): Ablauf und kürzeste Wege
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Die Breitensuche, kurz BFS für Breadth-first search, durchsucht einen Graphen vom Startknoten aus Schicht für Schicht. Eine FIFO-Warteschlange sorgt dafür, dass zuerst nahe und danach weiter entfernte Knoten bearbeitet werden.

Auf dieser Seite lernst du, eine Breitensuche auszuführen, ihre Besuchsreihenfolge zu dokumentieren und kürzeste Wege in ungewichteten Graphen zu bestimmen.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Wie entstehen die BFS-Schichten?

Stell dir ein Netzwerk aus Orten und Verbindungen vor. Du startest an einem Ort und möchtest systematisch alle erreichbaren Orte untersuchen. Die Breitensuche betrachtet zuerst alle direkten Nachbarn, dann deren noch unbesuchte Nachbarn und so weiter.

Definition

Graph

Ein Graph besteht aus Knoten und Kanten. Knoten stellen Objekte dar; Kanten beschreiben Verbindungen zwischen ihnen. Bei einem gerichteten Graphen darfst du eine Kante nur in Pfeilrichtung durchlaufen.

Der Startknoten liegt auf Ebene 0. Seine noch unentdeckten Nachbarn liegen auf Ebene 1. Knoten, die erstmals von Ebene 1 aus erreicht werden, liegen auf Ebene 2. So entstehen Schichten mit wachsendem Abstand zum Start.

Die genaue Reihenfolge innerhalb einer Ebene kann von der Reihenfolge der Nachbarn abhängen. Die Ebenennummern ändern sich dadurch nicht.

Merke

BFS bearbeitet alle Knoten einer Ebene, bevor sie zur nächsten Ebene übergeht.

Teste dich
Frage 1 von 1LeichtWelche Aussage beschreibt die Breitensuche richtig?
Lösung: Sie untersucht zuerst die Knoten mit der kleinsten Kantenzahl zum Start. — Eine einzelne Breitensuche beginnt an einem gewählten Startknoten und arbeitet sich von dort schichtweise vor.
Wie arbeitet die Warteschlange?

Angenommen, mehrere entdeckte Knoten warten noch auf ihre Bearbeitung. BFS verwaltet sie mit einer FIFO-Warteschlange: Wer zuerst eingefügt wurde, wird zuerst entnommen. FIFO bedeutet „First in, first out“.

Ein Knoten durchläuft drei Zustände:

  1. unentdeckt: Er wurde noch nicht gefunden.
  2. entdeckt: Er ist markiert und wartet in der Warteschlange.
  3. abgearbeitet: Er wurde entnommen; seine Nachbarn wurden untersucht.

Der Ablauf lautet:

  1. Markiere den Startknoten und füge ihn in die Warteschlange ein.
  2. Entnimm den vordersten Knoten u.
  3. Untersuche nacheinander seine Nachfolger.
  4. Markiere jeden noch unentdeckten Nachfolger v sofort und füge ihn hinten ein.
  5. Speichere bei Bedarf d[v] = d[u] + 1 und den Vorgänger π[v] = u.
  6. Wiederhole den Ablauf, bis das Ziel gefunden oder die Warteschlange leer ist.

Das sofortige Markieren beim Einfügen ist entscheidend. Es verhindert, dass mehrere Kanten denselben Knoten mehrfach in die Warteschlange bringen. Auch Rückkanten, Kreise und Selbstschleifen führen dann nicht zu endlosen Wiederholungen.

Lückentext

Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.

Ein neu entdeckter Knoten wird sofort . Der nächste Knoten wird entnommen. Neue Knoten kommen an das der FIFO-Warteschlange.

Lösungen: Lücke 1: markiert; Lücke 2: vorn; Lücke 3: Ende. Durch diese Reihenfolge bleiben früher entdeckte und damit näher liegende Knoten vorn.
Wie sieht ein vollständiger Durchlauf aus?

Wir verwenden den gerichteten Graphen mit diesen Kanten:

  • A → B
  • A → C
  • B → C
  • C → A
  • C → D
  • D → D

Die Nachbarn werden in der angegebenen Reihenfolge betrachtet. Startknoten ist C.

Beispiel
  1. Markiere C. Warteschlange: C. Distanz: d[C] = 0.
  2. Entnimm C. Entdecke A und D. Warteschlange: A, D. Beide erhalten Distanz 1 und Vorgänger C.
  3. Entnimm A. Entdecke B; C ist bereits markiert. Warteschlange: D, B. Für B gilt d[B] = 2 und π[B] = A.
  4. Entnimm D. Die Selbstschleife D → D wird ignoriert, weil D bereits markiert ist. Warteschlange: B.
  5. Entnimm B. C ist bereits markiert. Danach ist die Warteschlange leer.

Die Besuchsreihenfolge lautet C, A, D, B. Die Ebenen sind:

EbeneKnoten
0C
1A, D
2B
Teste dich
Frage 1 von 1MittelWarum wird D trotz der Kante D → D nicht erneut eingefügt?
Lösung: D wurde bereits beim ersten Entdecken markiert. — Nicht die Art der Kante, sondern die Markierung verhindert die Mehrfacheinfügung.
Wie findet BFS einen kürzesten Weg?

In einem ungewichteten Graphen zählt jede Kante als ein Schritt. Dasselbe gilt für die Wegeauswahl, wenn alle Kanten dasselbe positive Gewicht besitzen. Dann ist die BFS-Ebene eines Knotens genau seine kleinste erreichbare Kantenzahl vom Start.

Beim ersten Entdecken von v speichert BFS:

  • die Distanz d[v] = d[u] + 1;
  • den Vorgänger π[v] = u.

Um einen Weg zu rekonstruieren, folgst du den Vorgängern vom Ziel rückwärts bis zum Start. Anschließend kehrst du die Reihenfolge um.

Beispiel

Im Beispielgraphen gilt π[B] = A und π[A] = C. Rückwärts entsteht B ← A ← C. Umgekehrt gelesen lautet ein kürzester Weg C → A → B. Er besitzt zwei Kanten.

Zu D führt der Weg C → D mit einer Kante.

Mehrere gleich kurze Wege können existieren. Die Reihenfolge der Nachbarn bestimmt dann, welcher Vorgänger zuerst gespeichert und welcher dieser Wege rekonstruiert wird.

Teste dich
Frage 1 von 2MittelWelcher kürzeste Weg von C nach B folgt aus den gespeicherten Vorgängern?
Lösung: C → A → B — Folge von B aus den Vorgängern zu A und dann zu C; drehe diese Folge anschließend um.
Frage 2 von 2SchwerZwei verschiedene kürzeste Wege haben gleich viele Kanten. Was kann ihre Auswahl beeinflussen?
Lösung: Die Reihenfolge, in der Nachbarn untersucht werden. — Die Nachbarreihenfolge kann den Breitensuchbaum verändern, nicht aber die minimale Kantenzahl.
Wann ist BFS nicht das passende Wege-Verfahren?

BFS minimiert die Anzahl der Kanten. Bei unterschiedlichen Kantengewichten muss der Weg mit den wenigsten Kanten nicht die geringsten Kosten haben.

Beispiel

Eine direkte Kante S → Z habe Kosten 7. Der Weg S → A → Z bestehe aus zwei Kanten mit Kosten 2 und 2. BFS bevorzugt nach Kantenzahl die direkte Verbindung. Der längere Weg kostet jedoch nur 2 + 2 = 4 und ist damit günstiger.

Für verschieden gewichtete Kanten brauchst du ein Verfahren, das die bisherigen Pfadkosten berücksichtigt. Eine gewöhnliche FIFO-Warteschlange reicht dafür nicht aus.

BFS besucht außerdem nur Knoten, die vom Start aus erreichbar sind. Bei einem gerichteten Graphen kann X von Y aus erreichbar sein, ohne dass auch Y von X aus erreichbar ist.

Teste dich
Frage 1 von 1MittelWann garantiert BFS einen Weg mit minimalen Kosten?
Lösung: Wenn alle Kanten dasselbe positive Gewicht besitzen. — Bei gleichen positiven Gewichten entspricht die kleinste Kantenzahl zugleich den kleinsten Gesamtkosten.
Was kosten Breitensuche und Zusammenhangstest?

Bei einer Adjazenzliste wird jeder erreichbare Knoten höchstens einmal verarbeitet. Seine ausgehenden Kanten werden einmal untersucht. Für einen vollständig betrachteten endlichen Graphen ergibt sich deshalb die Laufzeit

$$O(|V| + |E|)$$

Dabei bezeichnet |V| die Anzahl der Knoten und |E| die Anzahl der Kanten. Diese Laufzeitaussage bezieht sich auf eine Adjazenzlistendarstellung.

Markierungen, Distanzen, Vorgänger und Warteschlange benötigen zusätzlich bis zu

$$O(|V|)$$

Speicher. Bei sehr breiten Suchräumen können viele Knoten gleichzeitig in der Warteschlange liegen.

BFS eignet sich auch für einen Zusammenhangstest in einem ungerichteten Graphen:

  1. Starte bei einem beliebigen Knoten.
  2. Führe BFS vollständig aus.
  3. Prüfe, ob alle Knoten markiert wurden.

Sind alle Knoten erreicht, ist der Graph zusammenhängend. Bleiben unmarkierte Knoten übrig, liegen sie in anderen Zusammenhangskomponenten.

Teste dich
Frage 1 von 3MittelWelche Laufzeit hat BFS mit Adjazenzlisten für einen vollständig betrachteten endlichen Graphen?
Lösung: O(|V| + |E|) — Jeder Knoten wird höchstens einmal verarbeitet, und die Adjazenzlisten enthalten zusammen alle zu prüfenden Kanten.
Frage 2 von 3MittelEine BFS in einem ungerichteten Graphen endet, aber drei Knoten sind unmarkiert. Was folgt daraus?
Lösung: Der Graph ist nicht zusammenhängend. — BFS erreicht genau die Zusammenhangskomponente des Startknotens.
Frage 3 von 3SchwerWarum kann BFS bei einem sehr breiten Suchraum viel Speicher benötigen?
Lösung: Viele entdeckte Knoten können gleichzeitig in der Warteschlange liegen. — Die Warteschlange hält die bereits entdeckten, aber noch nicht abgearbeiteten Knoten; eine breite Ebene kann daher viel Platz beanspruchen.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Breitensuche
    • ordnet erreichbare Knoten in Schichten
    • steuert die Bearbeitung mit einer FIFO-Warteschlange
    • markiert Knoten sofort beim Entdecken
    • speichert Distanzen und Vorgänger
    • findet kürzeste Wege bei gleichen positiven Kantengewichten
    • prüft die Erreichbarkeit vom Start
    • benötigt mit Adjazenzlisten `O(|V| + |E|)` Zeit
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelche Datenstruktur erzeugt die schichtweise Reihenfolge der BFS?
Lösung: Eine FIFO-Warteschlange — Die FIFO-Regel verarbeitet früher entdeckte Knoten zuerst.
Frage 2 von 3MittelIm Beispielgraphen startet BFS bei C. Welche Distanz erhält B?
Lösung: 2C liegt auf Ebene 0, A auf Ebene 1 und B auf Ebene 2.
Frage 3 von 3SchwerEin Weg besitzt eine Kante mit Kosten 9; ein anderer besitzt drei Kanten mit Gesamtkosten 6. Welches Ergebnis garantiert gewöhnliche BFS?
Lösung: Einen Weg mit möglichst wenigen Kanten, nicht zwingend mit minimalen Kosten — BFS ordnet nach Kantenzahl. Für minimale Kosten bei unterschiedlichen Gewichten ist ein kostenorientiertes Verfahren nötig.

Du beherrschst die Breitensuche, wenn du Warteschlange, Markierungen, Ebenen und Vorgänger für einen kleinen Graphen selbst dokumentieren und die Voraussetzung für einen kürzesten Weg begründen kannst.

Passend dazu