Sei
- Weiß - Knoten wurde noch nicht erfasst
- Grau - Knoten wurde gesehen, aber noch nicht verarbeitet
- Schwarz - Knoten ist verarbeitet
Implementierung
Pseudocode
- Algorithmus
Breitensuche(, ): Initialisierung
- Für jeden Knoten
.farbe = weiß .dist = .pred = NULL
.color = grau .dist = .pred = NULL
Durchlaufen
- Schlange
.enque( ) - Solange
= .dequeue() - Für jeden Knoten
AdjList[ ] - Falls
.color == weiß .color = grau .dist = .dist + 1 .pred = .enqueue( )
- Falls
.color = schwarz
- Für jeden Knoten
JavaScript
function bfs(graph, startNode) {
let visited = new Set(); // Set um besuchte Knoten zu speichern
let queue = [startNode]; // Queue für BFS
// Solange die Queue nicht leer ist
while (queue.length > 0) {
let node = queue.shift(); // Entfernt das erste Element aus der Queue
if (!visited.has(node)) {
visited.add(node); // Markiere den Knoten als besucht
console.log(node); // Bearbeitet den Knoten (hier einfach Ausgabe)
// Füge alle Nachbarn des Knotens, die
// noch nicht besucht wurden, zur Queue hinzu
graph[node].forEach(neighbor => {
if (!visited.has(neighbor)) {
queue.push(neighbor);
}
});
}
}
}Beobachtungen
- Die Werte in den Knoten entsprechen der Länge eines kürzesten Pfades vom Anfangsknoten zum jeweiligen Knoten
- Die angegangenen Kanten lassen sich zum Breitensuchbaum verbinden
Laufzeit
- Aufwand für die Initialisierung:
- Ein Knoten wird maximal einmal in die Schlange eingefügt und maximal einmal wieder entnommen:
- Aufwand für alle Knoten:
- Jede Adjazenzliste eines Knoten wird maximal ein mal durchlaufen, insgesamt gibt es
Einträge in allen Listen - Insgesamt ergibt sich damit die Laufzeit: