www.wikidata.de-de.nina.az
Breitensuche englisch breadth first search BFS ist ein Verfahren in der Informatik zum Durchsuchen bzw Durchlaufen der Knoten eines Graphen Sie zahlt zu den uninformierten Suchalgorithmen Im Gegensatz zur Tiefensuche werden zunachst alle Knoten beschritten die vom Ausgangsknoten direkt erreichbar sind Erst danach werden Folgeknoten beschritten siehe Abbildung Animation der Breitensuche in einem Baum Inhaltsverzeichnis 1 Arbeitsweise 2 Algorithmus 3 Programmierung 4 Eigenschaften 4 1 Speicherplatzverbrauch 4 2 Laufzeit 4 3 Vollstandigkeit 4 4 Optimalitat 5 Anwendung 6 Siehe auch 7 Literatur 8 Weblinks 9 EinzelnachweiseArbeitsweise BearbeitenDie Breitensuche ist eine uninformierte Suche welche durch Expansion der einzelnen Level der Graphen ausgehend vom Startknoten den Graph in die Breite nach einem Element durchsucht Zuerst wird ein Startknoten u displaystyle u nbsp ausgewahlt Von diesem Knoten aus wird nun jede Kante u v displaystyle u v nbsp betrachtet und getestet ob der gegenuberliegende Knoten v displaystyle v nbsp schon entdeckt wurde bzw das gesuchte Element ist Ist dies noch nicht der Fall so wird der entsprechende Knoten in einer Warteschlange gespeichert und im nachsten Schritt bearbeitet Hierbei ist zu beachten dass Breitensuche immer zuerst alle Knoten der gleichen Ebene bearbeitet und nicht wie die Tiefensuche einem Pfad in die Tiefe folgt Nachdem alle Kanten des Ausgangsknotens betrachtet wurden wird der erste Knoten der Warteschlange entnommen und das Verfahren wiederholt nbsp Eine graphentheoretische Landkarte von Deutschland Osterreich und der Schweiz mit den Verbindungen zwischen einigen Stadten Dieses Beispiel ist ein ungerichteter Graph mit 10 Knoten nbsp Der Baum welcher entsteht wenn man Breitensuche auf die Landkarte anwendet und in Hannover startet Dieser Baum hat die Hohe 4 Daher hat die Breitensuche in diesem Fall 4 Iterationsschritte Der Index des Iterationsschritts in der while Schleife siehe unten entspricht dabei dem Knotenabstand des aktuell durchlaufenen Knotens vom Startknoten Dieser Index musste um zum Beispiel auf der Konsole ausgegeben zu werden in einer Variablen gespeichert werden Im Beispiel mit den Stadten siehe oben gibt es 4 Iterationsschritte Iterationsschritt 0 Hannover Knotenabstand 0 Iterationsschritt 1 Frankfurt Hamburg Berlin Knotenabstand 1 Iterationsschritt 2 Zurich Stuttgart Mannheim Wien Knotenabstand 2 Iterationsschritt 3 Munchen Dresden Knotenabstand 3 Der Knotenabstand bezieht sich immer auf den Startknoten Im links dargestellten ungerichteten Graphen ist es Hannover Bei gerichteten Graphen ist der Knotenabstand zwischen zwei verschiedenen Knoten nicht unbedingt symmetrisch In einem gerichteten Graphen konnte zum Beispiel der Knotenabstand von Hannover nach Mannheim ebenfalls 2 sein Der Knotenabstand von Mannheim nach Hannover jedoch konnte gleich 1 sein wenn es eine Kante direkte Verbindung von Mannheim nach Hannover gabe Er konnte auch gleich 2 gleich 3 oder grosser sein Der Knotenabstand und die Anzahl der Iterationsschritte ist nur fur zusammenhangende Graphen definiert und hangt vom Startknoten ab Fur nicht zusammenhangende Graphen ist der Knotenabstand und die Anzahl der Iterationsschritte nur innerhalb jeder Zusammenhangskomponente definiert Hinweis Der in der Abbildung links oben mit den Stadten gezeigte Graph ist ein ungerichteter Graph Die Reihenfolge der durchlaufenen Knoten kann sich andern wenn stattdessen ein anderer Startknoten oder ein gerichteter Graph genommen wird der nicht symmetrisch ist Algorithmus BearbeitenBestimme den Knoten an dem die Suche beginnen soll markiere ihn als gesehen und speichere ihn in einer Warteschlange ab Entnimm einen Knoten vom Beginn der Warteschlange Falls das gesuchte Element gefunden wurde brich die Suche ab und liefere gefunden zuruck Anderenfalls hange alle bisher unmarkierten Nachfolger dieses Knotens ans Ende der Warteschlange an und markiere sie als gesehen Wenn die Warteschlange leer ist dann wurde jeder Knoten bereits untersucht Beende die Suche und liefere nicht gefunden zuruck Wiederhole Schritt 2 Nachstehend formulierte Algorithmen sind als Pseudocode zu verstehen und geben aus Grunden der Lesbarkeit nur an ob der Zielknoten gefunden wurde Weitere in Anwendungsfallen wichtige Informationen wie z B die aktuelle Pfadtiefe oder der bisherige Suchweg konnten zusatzlich eingefugt werden Rekursiv formuliert BFS start node goal node return BFS start node goal node BFS fringe gesehen goal node if fringe Knoten nicht gefunden return false if goal node fringe return true return BFS child x fringe child nachfolger x gesehen gesehen fringe goal node Als Schleife formuliert BFS start node goal node erzeuge eine leere Warteschlange queue queue enqueue start node markiere start node als gesehen while queue ist nicht leer node queue dequeue if node goal node return true foreach child in nachfolger node if child ist nicht markiert als gesehen queue enqueue child markiere child als gesehen return false Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung der Breitensuche fur einen gerichteten Graphen Der gerichtete Graph wird als Klasse DirectedGraph deklariert Bei der Ausfuhrung des Programms wird die Methode Main verwendet die die Liste der markierten Knoten auf der Konsole ausgibt 1 using System using System Collections Generic Deklariert die Klasse fur die Knoten des Graphen class Node public int index public string value public List lt Node gt adjacentNodes new List lt Node gt Liste der Nachbarknoten Deklariert die Klasse fur den gerichteten Graphen class DirectedGraph Diese Methode verbindet die Knoten startNode und targetNode miteinander public void ConnectNodes Node startNode Node targetNode startNode adjacentNodes Add targetNode class Program Diese Methode gibt die Liste der Knoten in der Form A B C als Text zuruck public static string ToString List lt Node gt traversedNodes string text for int i 0 i lt traversedNodes Count i for Schleife die die Knoten durchlauft text traversedNodes i value text text Substring 0 text Length 2 return text Diese Methode durchlauft die Knoten des gerichteten Graphen mit einer Breitensuche public static List lt Node gt BreadthFirstSearch Node startNode List lt Node gt traversedNodes new List lt Node gt Liste der Knoten fur die Breitensuche traversedNodes Add startNode Fugt den Startenknoten der Liste hinzu HashSet lt Node gt visitedNodes new HashSet lt Node gt Menge der markierten Knoten visitedNodes Add startNode Fugt den Startenknoten der Menge der markierten Knoten hinzu Queue lt Node gt queue new Queue lt Node gt Warteschlange fur die Breitensuche queue Enqueue startNode Fugt den Startenknoten der Warteschlange hinzu while queue Count gt 0 So lange die Warteschlange nicht leer ist startNode queue Dequeue Entfernt den ersten Knoten aus der Warteschlange foreach Node node in startNode adjacentNodes foreach Schleife die alle benachbarten Knoten des Knotens durchlauft if visitedNodes Contains node Wenn der Knoten noch nicht markiert wurde traversedNodes Add node Fugt den Knoten der Liste hinzu visitedNodes Add node Markiert den Knoten queue Enqueue node Fugt den Knoten der Warteschlange fur die Breitensuche hinzu return traversedNodes Gibt die Liste der Knoten zuruck Hauptmethode die das Programm ausfuhrt public static void Main string args Deklariert und initialisiert 4 Knoten Node node1 new Node index 0 value A Node node2 new Node index 1 value B Node node3 new Node index 2 value C Node node4 new Node index 3 value D Erzeugt einen gerichteten Graphen DirectedGraph directedGraph new DirectedGraph Verbindet Knoten des Graphen miteinander directedGraph ConnectNodes node1 node2 directedGraph ConnectNodes node1 node3 directedGraph ConnectNodes node2 node3 directedGraph ConnectNodes node3 node1 directedGraph ConnectNodes node3 node4 directedGraph ConnectNodes node4 node4 List lt Node gt traversedNodes BreadthFirstSearch node3 Aufruf der Methode Console WriteLine ToString traversedNodes Ausgabe auf der Konsole Console ReadLine Hinweise Fur die Nachbarknoten wurde eine Liste als Datentyp verwendet damit die Reihenfolge der durchlaufenen Knoten eindeutig ist und die Knoten in allen Ebenen von links nach rechts durchlaufen werden Fur den Datentyp Menge zum Beispiel muss das nicht der der Fall sein Statt dem HashSet Menge visitedNodes kann auch eine Liste oder ein Array vom Typ bool Boolesche Variable verwendet werden wie im Einzelnachweis gezeigt 1 Der in der Abbildung links oben mit den Stadten gezeigte Graph ist ein ungerichteter Graph Die Reihenfolge der durchlaufenen Knoten kann sich andern wenn stattdessen ein anderer Startknoten oder ein gerichteter Graph genommen wird der nicht symmetrisch ist Eigenschaften BearbeitenBezeichne V displaystyle V nbsp die Anzahl der Knoten und E displaystyle E nbsp die Anzahl der Kanten im Graphen Speicherplatzverbrauch und Laufzeit des Algorithmus sind in Landau Notation angegeben Speicherplatzverbrauch Bearbeiten Da alle bisher entdeckten Knoten gespeichert werden betragt der Speicherplatzverbrauch von Breitensuche O V displaystyle mathcal O V nbsp Die Breitensuche ist fur Verfahren bei denen die Knoten erst wahrend der Breitensuche generiert werden z B das Branch amp Bound Verfahren aufgrund des grossen Platzverbrauches meist ungeeignet Ein der Breitensuche ahnliches Verfahren das jedoch meist mit deutlich weniger Speicher auskommt ist die iterative Tiefensuche Laufzeit Bearbeiten Da im ungunstigsten Fall alle moglichen Pfade zu allen moglichen Knoten betrachtet werden mussen betragt die Laufzeit der Breitensuche O V E displaystyle mathcal O V E nbsp 2 Beachte dass O E displaystyle mathcal O E nbsp zwischen O 1 displaystyle mathcal O 1 nbsp und O V 2 displaystyle mathcal O V 2 nbsp variieren kann abhangig davon wie dunn der Graph ist Wenn die Anzahl der Knoten im Graphen im Voraus bekannt ist und zusatzliche Datenstrukturen verwendet werden um zu bestimmen welche Knoten bereits zur Warteschlange hinzugefugt wurden kann die Platzkomplexitat als O V displaystyle mathcal O V nbsp ausgedruckt werden Dies gilt zusatzlich zu dem fur das Graphen selbst erforderlichen Speicherplatz der abhangig von der von einer Implementierung des Algorithmus verwendeten Graphendarstellung variieren kann Vollstandigkeit Bearbeiten Wenn in jedem Knoten nur endlich viele Alternativen existieren ist die Breitensuche vollstandig Dies bedeutet dass wenn eine Losung existiert diese auch gefunden wird Dies ist unabhangig davon ob der zugrunde liegende Graph endlich ist oder nicht Sollte jedoch keine Losung existieren so divergiert die Breitensuche bei einem unendlichen Graphen Bei der Analyse von Algorithmen wird angenommen dass die Eingabe fur die Breitensuche ein endlicher Graph ist der explizit als Adjazenzliste oder ahnliche dargestellt wird Bei der Anwendung von Graph Traversierungen in der kunstlichen Intelligenz kann die Eingabe jedoch eine implizite Darstellung eines unendlichen Graphen sein In diesem Zusammenhang wird ein Suchverfahren als vollstandig beschrieben wenn garantiert wird dass ein Zielzustand gefunden wird falls einer existiert Die Breitensuche ist abgeschlossen die Tiefensuche jedoch nicht Bei Anwendung auf unendlich viele Graphen die implizit dargestellt werden findet die Breitensuche schliesslich den Zielzustand aber die Tiefensuche kann in Teilen des Graphen verloren gehen die keinen Zielzustand haben und niemals zuruckkehren 3 Optimalitat Bearbeiten Jede durch Breitensuche gefundene Losung hat den kurzesten Abstand zum Wurzelknoten Fuhrt man Kantengewichte ein so muss das Ergebnis welches am nachsten zum Startknoten liegt nicht notwendigerweise auch das Ergebnis mit den geringsten Pfadkosten sein Dieses Problem umgeht man indem man die Breitensuche zur uniformen Kostensuche erweitert Sind jedoch alle Kantengewichte aquivalent so ist jede durch Breitensuche gefundene Losung optimal da in diesem Fall die Losung die am nachsten zum Ausgangsknoten liegt auch die Losung mit den geringsten Kosten ist Ob existierende Losungen uberhaupt gefunden werden hangt mit Endlichkeitseigenschaften des Suchbaums zusammen siehe Vollstandigkeit Die uniforme Kostensuche englisch uniform cost search ist eine Erweiterung der Breitensuche fur Graphen mit gewichteten Kanten Der Algorithmus besucht Knoten in Reihenfolge aufsteigender Pfadkosten vom Wurzelknoten und wird deshalb ublicherweise mit einer Vorrangwarteschlange implementiert in der alle noch nicht besuchten Nachbarn bereits besuchter Knoten mit der Pfadlange als Schlussel verwaltet werden Die Optimalitat ist nur fur nicht negative Kantengewichte garantiert Anwendung BearbeitenDie Breitensuche kann fur viele Fragestellungen in der Graphentheorie verwendet werden Einige sind Finde alle Knoten innerhalb einer Zusammenhangskomponente Prufe ob der gegebene Graph paar ist und finde ggf eine zulassige 2 Farbung seiner Knoten 4 Finde zwischen zwei Knoten u und w einen kurzesten Pfad ungewichtete Kanten Kurzeste Kreise ProblemSiehe auch BearbeitenBeschrankte Tiefensuche parallele BreitensucheLiteratur BearbeitenThomas H Cormen Charles Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms MIT Press 2nd edition 2001 ISBN 0 262 53196 8 Sven Oliver Krumke Hartmut Noltemeier Graphentheoretische Konzepte und Algorithmen 3 Auflage Springer Vieweg 2012 ISBN 978 3 8348 1849 2Weblinks Bearbeiten nbsp Commons Breitensuche Sammlung von Bildern Videos und Audiodateien nbsp Wikibooks Breitensuche Implementierungen in der Algorithmensammlung nbsp Dieser Artikel ist als Audiodatei verfugbar source source Speichern 06 03 min 8 6 MBMehr Informationen zur gesprochenen WikipediaEinzelnachweise Bearbeiten a b GeeksforGeeks Breadth First Search or BFS for a Graph Winfried Hochstattler Algorithmische Mathematik Springer Heidelberg u a 2010 ISBN 978 3 642 05421 1 S 56 58 Coppin B 2004 Artificial intelligence illuminated Jones amp Bartlett Learning pp 79 80 Dieter Jungnickel Graphen Netzwerke und Algorithmen BI Wissenschaftsverlag 3 Auflage 1994 ISBN 3 411 14263 4 S 95 100 Abgerufen von https de wikipedia org w index php title Breitensuche amp oldid 231313378