<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Breitensuche</id>
	<title>Breitensuche - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Breitensuche"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Breitensuche&amp;action=history"/>
	<updated>2026-06-05T18:28:23Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Breitensuche&amp;diff=79903&amp;oldid=prev</id>
		<title>imported&gt;Horst Gräbner: Änderungen von ~2025-40186-31 (Diskussion) auf die letzte Version von Invisigoth67 zurückgesetzt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Breitensuche&amp;diff=79903&amp;oldid=prev"/>
		<updated>2025-12-12T10:05:10Z</updated>

		<summary type="html">&lt;p&gt;Änderungen von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/~2025-40186-31&quot; title=&quot;Spezial:Beiträge/~2025-40186-31&quot;&gt;~2025-40186-31&lt;/a&gt; (&lt;a href=&quot;/index.php?title=Benutzer_Diskussion:~2025-40186-31&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer Diskussion:~2025-40186-31 (Seite nicht vorhanden)&quot;&gt;Diskussion&lt;/a&gt;) auf die letzte Version von &lt;a href=&quot;/index.php?title=Benutzer:Invisigoth67&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer:Invisigoth67 (Seite nicht vorhanden)&quot;&gt;Invisigoth67&lt;/a&gt; zurückgesetzt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Breadth-First-Search-Algorithm.gif|mini|300px|[[Animation]] der Breitensuche in einem [[Baum (Datenstruktur)|Baum]]]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Breitensuche&amp;#039;&amp;#039;&amp;#039; ({{enS|breadth-first search}}, &amp;#039;&amp;#039;BFS&amp;#039;&amp;#039;) ist ein Verfahren in der [[Informatik]] zum Durchsuchen bzw. Durchlaufen der [[Knoten (Graphentheorie)|Knoten]] eines [[Graph (Graphentheorie)|Graphen]]. Sie zählt zu den [[Suchalgorithmus#Heuristische (Informierte) Suchalgorithmen|uninformierten Suchalgorithmen]]. Im Gegensatz zur [[Tiefensuche]] werden zunächst alle Knoten beschritten, die vom Ausgangsknoten direkt erreichbar sind. Erst danach werden Folgeknoten beschritten (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
Die Breitensuche ist eine [[Suchalgorithmus#Heuristische (Informierte) Suchalgorithmen|uninformierte Suche]], welche durch Expansion der einzelnen &amp;#039;&amp;#039;Level&amp;#039;&amp;#039; der [[Graph (Graphentheorie)|Graphen]] ausgehend vom Startknoten den Graph &amp;#039;&amp;#039;in die Breite&amp;#039;&amp;#039; nach einem Element durchsucht.&lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein Startknoten &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; ausgewählt. Von diesem [[Knoten (Graphentheorie)|Knoten]] aus wird nun jede [[Kante (Graphentheorie)|Kante]] &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; betrachtet und getestet, ob der gegenüberliegende Knoten &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; schon entdeckt wurde bzw. das gesuchte Element ist. Ist dies noch nicht der Fall, so wird der entsprechende Knoten in einer [[Warteschlange (Datenstruktur)|Warteschlange]] gespeichert und im nächsten Schritt bearbeitet. Hierbei ist zu beachten, dass Breitensuche immer zuerst alle Knoten der gleichen Ebene bearbeitet, und nicht wie die [[Tiefensuche]] einem [[Pfad (Graphentheorie)|Pfad]] in die Tiefe folgt. Nachdem alle Kanten des Ausgangsknotens betrachtet wurden, wird der erste Knoten der Warteschlange entnommen und das Verfahren wiederholt.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Datei:DepthFirstSearch graph cities de.svg|links|mini|350x350px|Eine [[Graphentheoretisch|graphentheoretische]] Landkarte von [[Deutschland]], [[Österreich]] und der [[Schweiz]] mit den Verbindungen zwischen einigen Städten. Dieses Beispiel ist ein ungerichteter Graph mit 10 Knoten.]]&lt;br /&gt;
|[[Datei:BreadthFirstSearch tree cities de.svg|mini|350x350px|Der Baum, welcher entsteht, wenn man Breitensuche auf die Landkarte anwendet und in Hannover startet. Dieser Baum hat die Höhe 4. Daher hat die Breitensuche in diesem Fall 4 [[Iteration|Iterationsschritte]].]]&lt;br /&gt;
|}&lt;br /&gt;
Der Index des [[Iteration|Iterationsschritts]] in der [[while-Schleife]] (siehe unten) entspricht dabei dem [[Weg (Graphentheorie)|Knotenabstand]] des aktuell durchlaufenen [[Knoten (Graphentheorie)|Knotens]] vom Startknoten. Dieser Index müsste, um zum Beispiel auf der Konsole ausgegeben zu werden, in einer [[Variable (Programmierung)|Variablen]] gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel mit den Städten (siehe oben) gibt es 4 Iterationsschritte:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iterationsschritt 0&amp;#039;&amp;#039;&amp;#039;: Hannover (Knotenabstand 0)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iterationsschritt 1&amp;#039;&amp;#039;&amp;#039;: Frankfurt, Hamburg, Berlin (Knotenabstand 1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iterationsschritt 2&amp;#039;&amp;#039;&amp;#039;: Zürich, Stuttgart, Mannheim, Wien (Knotenabstand 2)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iterationsschritt 3&amp;#039;&amp;#039;&amp;#039;: München, Dresden (Knotenabstand 3)&lt;br /&gt;
&lt;br /&gt;
Der [[Weg (Graphentheorie)|Knotenabstand]] bezieht sich immer auf den Startknoten. Im links dargestellten ungerichteten Graphen ist es Hannover. Bei [[Gerichteter Graph|gerichteten Graphen]] ist der [[Weg (Graphentheorie)|Knotenabstand]] zwischen zwei &amp;#039;&amp;#039;verschiedenen&amp;#039;&amp;#039; Knoten nicht &amp;#039;&amp;#039;unbedingt&amp;#039;&amp;#039; symmetrisch.&lt;br /&gt;
&lt;br /&gt;
In einem [[Gerichteter Graph|gerichteten Graphen]] könnte zum Beispiel der Knotenabstand von Hannover nach Mannheim ebenfalls 2 sein. Der Knotenabstand von Mannheim nach Hannover jedoch könnte gleich 1 sein, wenn es eine Kante (direkte Verbindung) von Mannheim nach Hannover gäbe. Er könnte auch gleich 2, gleich 3 oder größer sein.&lt;br /&gt;
&lt;br /&gt;
Der Knotenabstand und die Anzahl der Iterationsschritte ist nur für [[Zusammenhängender Graph|zusammenhängende]] [[Graph (Graphentheorie)|Graphen]] definiert und hängt vom Startknoten ab. Für nicht zusammenhängende Graphen ist der Knotenabstand und die Anzahl der Iterationsschritte nur innerhalb jeder [[Zusammenhang (Graphentheorie)|Zusammenhangskomponente]] definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis&amp;#039;&amp;#039;&amp;#039;: Der in der Abbildung links oben mit den Städten gezeigte [[Graph (Graphentheorie)|Graph]] ist ein &amp;#039;&amp;#039;ungerichteter&amp;#039;&amp;#039; Graph. Die Reihenfolge der durchlaufenen [[Knoten (Graphentheorie)|Knoten]] &amp;#039;&amp;#039;kann&amp;#039;&amp;#039; sich ändern, wenn stattdessen ein anderer Startknoten oder ein [[gerichteter Graph]] genommen wird, der &amp;#039;&amp;#039;nicht&amp;#039;&amp;#039; symmetrisch ist.&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
# Bestimme den [[Knoten (Graphentheorie)|Knoten]], an dem die Suche beginnen soll, markiere ihn als gesehen und speichere ihn in einer [[Warteschlange (Datenstruktur)|Warteschlange]] ab.&lt;br /&gt;
# Entnimm einen Knoten vom Beginn der Warteschlange.&lt;br /&gt;
#* Falls das gesuchte Element gefunden wurde, brich die Suche ab und liefere „gefunden“ zurück.&lt;br /&gt;
#* Anderenfalls hänge alle bisher unmarkierten Nachfolger dieses Knotens ans Ende der Warteschlange an und markiere sie als gesehen.&lt;br /&gt;
# Wenn die Warteschlange leer ist, dann wurde jeder Knoten bereits untersucht. Beende die Suche und liefere „nicht gefunden“ zurück.&lt;br /&gt;
# Wiederhole Schritt 2.&lt;br /&gt;
&lt;br /&gt;
Nachstehend formulierte [[Algorithmus|Algorithmen]] sind als [[Pseudocode]] zu verstehen und geben aus Gründen der Lesbarkeit nur an, ob der Zielknoten gefunden wurde. Weitere, in Anwendungsfällen wichtige Informationen – wie z.&amp;amp;nbsp;B. die aktuelle Pfadtiefe oder der bisherige Suchweg – könnten zusätzlich eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
[[Rekursion|Rekursiv]] formuliert:&lt;br /&gt;
 BFS(&amp;#039;&amp;#039;start_node&amp;#039;&amp;#039;, &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; BFS&amp;#039;({&amp;#039;&amp;#039;start_node&amp;#039;&amp;#039;}, ∅, &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
 BFS&amp;#039;(&amp;#039;&amp;#039;fringe&amp;#039;&amp;#039;, &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039;, &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;fringe&amp;#039;&amp;#039; == ∅)&lt;br /&gt;
     // Knoten nicht gefunden&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; false;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039; ∈ &amp;#039;&amp;#039;fringe&amp;#039;&amp;#039;)&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; true;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; BFS&amp;#039;({&amp;#039;&amp;#039;child&amp;#039;&amp;#039; | &amp;#039;&amp;#039;x&amp;#039;&amp;#039; ∈ &amp;#039;&amp;#039;fringe&amp;#039;&amp;#039;, &amp;#039;&amp;#039;child&amp;#039;&amp;#039; ∈ nachfolger(&amp;#039;&amp;#039;x&amp;#039;&amp;#039;)} \ &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039;, &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039; ∪ &amp;#039;&amp;#039;fringe&amp;#039;&amp;#039;, &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Als [[Schleife (Programmierung)|Schleife]] formuliert:&lt;br /&gt;
 BFS(&amp;#039;&amp;#039;start_node&amp;#039;&amp;#039;, &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;)&lt;br /&gt;
     erzeuge eine leere Warteschlange &amp;#039;&amp;#039;queue&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;queue&amp;#039;&amp;#039;.enqueue(&amp;#039;&amp;#039;start_node&amp;#039;&amp;#039;);&lt;br /&gt;
     markiere &amp;#039;&amp;#039;start_node&amp;#039;&amp;#039; als &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;queue&amp;#039;&amp;#039; ist nicht leer&lt;br /&gt;
         &amp;#039;&amp;#039;node&amp;#039;&amp;#039; = &amp;#039;&amp;#039;queue&amp;#039;&amp;#039;.dequeue();&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;node&amp;#039;&amp;#039; == &amp;#039;&amp;#039;goal_node&amp;#039;&amp;#039;&lt;br /&gt;
             &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; true;&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;foreach&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;child&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; nachfolger(&amp;#039;&amp;#039;node&amp;#039;&amp;#039;)&lt;br /&gt;
             &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;child&amp;#039;&amp;#039; ist nicht markiert als &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039;&lt;br /&gt;
                 &amp;#039;&amp;#039;queue&amp;#039;&amp;#039;.enqueue(&amp;#039;&amp;#039;child&amp;#039;&amp;#039;);&lt;br /&gt;
                 markiere &amp;#039;&amp;#039;child&amp;#039;&amp;#039; als &amp;#039;&amp;#039;gesehen&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; false;&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C-Sharp|C#]] zeigt die Implementierung der Breitensuche für einen [[Gerichteter Graph|gerichteten Graphen]]. Der gerichtete Graph wird als [[Klasse (Objektorientierung)|Klasse]] &amp;#039;&amp;#039;DirectedGraph&amp;#039;&amp;#039; deklariert. Bei der Ausführung des Programms wird die [[Methode (Programmierung)|Methode]] &amp;#039;&amp;#039;Main&amp;#039;&amp;#039; verwendet, die die Liste der markierten Knoten auf der Konsole ausgibt.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;GeeksforGeeks: [https://www.geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph/ Breadth First Search or BFS for a Graph]&amp;lt;/ref&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
// Deklariert die Klasse für die Knoten des Graphen&lt;br /&gt;
class Node&lt;br /&gt;
{&lt;br /&gt;
	public int index;&lt;br /&gt;
	public string value;&lt;br /&gt;
	public List&amp;lt;Node&amp;gt; adjacentNodes = new List&amp;lt;Node&amp;gt;(); // Liste der Nachbarknoten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Deklariert die Klasse für den gerichteten Graphen&lt;br /&gt;
class DirectedGraph&lt;br /&gt;
{&lt;br /&gt;
	// Diese Methode verbindet die Knoten startNode und targetNode miteinander.&lt;br /&gt;
	public void ConnectNodes(Node startNode, Node targetNode)&lt;br /&gt;
	{&lt;br /&gt;
		startNode.adjacentNodes.Add(targetNode);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Program&lt;br /&gt;
{&lt;br /&gt;
	// Diese Methode gibt die Liste der Knoten in der Form A, B, C, ... als Text zurück.&lt;br /&gt;
	public static string ToString(List&amp;lt;Node&amp;gt; traversedNodes)&lt;br /&gt;
	{&lt;br /&gt;
		string text = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (int i = 0; i &amp;lt; traversedNodes.Count; i++) // for-Schleife, die die Knoten durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			text += traversedNodes[i].value + &amp;quot;, &amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		text = text.Substring(0, text.Length - 2);&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode durchläuft die Knoten des gerichteten Graphen mit einer Breitensuche&lt;br /&gt;
	public static List&amp;lt;Node&amp;gt; BreadthFirstSearch(Node startNode)&lt;br /&gt;
	{&lt;br /&gt;
		List&amp;lt;Node&amp;gt; traversedNodes = new List&amp;lt;Node&amp;gt;(); // Liste der Knoten für die Breitensuche&lt;br /&gt;
		traversedNodes.Add(startNode); // Fügt den Startenknoten der Liste hinzu&lt;br /&gt;
		HashSet&amp;lt;Node&amp;gt; visitedNodes = new HashSet&amp;lt;Node&amp;gt;(); // Menge der markierten Knoten&lt;br /&gt;
		visitedNodes.Add(startNode); // Fügt den Startenknoten der Menge der markierten Knoten hinzu&lt;br /&gt;
		Queue&amp;lt;Node&amp;gt; queue = new Queue&amp;lt;Node&amp;gt;(); // Warteschlange für die Breitensuche&lt;br /&gt;
		queue.Enqueue(startNode); // Fügt den Startenknoten der Warteschlange hinzu&lt;br /&gt;
		while (queue.Count &amp;gt; 0) // So lange die Warteschlange nicht leer ist&lt;br /&gt;
		{&lt;br /&gt;
			startNode = queue.Dequeue(); // Entfernt den ersten Knoten aus der Warteschlange&lt;br /&gt;
			foreach (Node node in startNode.adjacentNodes) // foreach-Schleife, die alle benachbarten Knoten des Knotens durchläuft&lt;br /&gt;
			{&lt;br /&gt;
				if (!visitedNodes.Contains(node)) // Wenn der Knoten noch nicht markiert wurde&lt;br /&gt;
				{&lt;br /&gt;
					traversedNodes.Add(node); // Fügt den Knoten der Liste hinzu&lt;br /&gt;
					visitedNodes.Add(node); // Markiert den Knoten&lt;br /&gt;
                    queue.Enqueue(node); // Fügt den Knoten der Warteschlange für die Breitensuche hinzu&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return traversedNodes; // Gibt die Liste der Knoten zurück&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Hauptmethode, die das Programm ausführt&lt;br /&gt;
	public static void Main(string[] args)&lt;br /&gt;
	{&lt;br /&gt;
		// Deklariert und initialisiert 4 Knoten&lt;br /&gt;
		Node node1 = new Node{index = 0, value = &amp;quot;A&amp;quot;};&lt;br /&gt;
		Node node2 = new Node{index = 1, value = &amp;quot;B&amp;quot;};&lt;br /&gt;
		Node node3 = new Node{index = 2, value = &amp;quot;C&amp;quot;};&lt;br /&gt;
		Node node4 = new Node{index = 3, value = &amp;quot;D&amp;quot;};&lt;br /&gt;
		&lt;br /&gt;
		// Erzeugt einen gerichteten Graphen&lt;br /&gt;
		DirectedGraph directedGraph = new DirectedGraph();&lt;br /&gt;
		&lt;br /&gt;
		// Verbindet Knoten des Graphen miteinander&lt;br /&gt;
		directedGraph.ConnectNodes(node1, node2);&lt;br /&gt;
		directedGraph.ConnectNodes(node1, node3);&lt;br /&gt;
		directedGraph.ConnectNodes(node2, node3);&lt;br /&gt;
		directedGraph.ConnectNodes(node3, node1);&lt;br /&gt;
		directedGraph.ConnectNodes(node3, node4);&lt;br /&gt;
		directedGraph.ConnectNodes(node4, node4);&lt;br /&gt;
		&lt;br /&gt;
		List&amp;lt;Node&amp;gt; traversedNodes = BreadthFirstSearch(node3); // Aufruf der Methode&lt;br /&gt;
		Console.WriteLine(ToString(traversedNodes)); // Ausgabe auf der Konsole&lt;br /&gt;
		&lt;br /&gt;
		Console.ReadLine();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;&amp;#039;&amp;#039;Hinweise&amp;#039;&amp;#039;&amp;#039;: Für die Nachbarknoten wurde eine [[Liste (Datenstruktur)|Liste]] als [[Datentyp]] verwendet, damit die Reihenfolge der durchlaufenen [[Knoten (Graphentheorie)|Knoten]] eindeutig ist und die Knoten in allen Ebenen von links nach rechts durchlaufen werden. Für den Datentyp [[Menge (Datenstruktur)|Menge]] zum Beispiel muss das nicht der der Fall sein. Statt dem &amp;#039;&amp;#039;HashSet&amp;#039;&amp;#039; ([[Menge (Datenstruktur)|Menge]]) &amp;#039;&amp;#039;visitedNodes&amp;#039;&amp;#039; kann auch eine Liste oder ein Array vom Typ &amp;#039;&amp;#039;bool&amp;#039;&amp;#039; ([[Boolesche Variable]]) verwendet werden, wie im Einzelnachweis gezeigt.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der in der Abbildung links oben mit den Städten gezeigte [[Graph (Graphentheorie)|Graph]] ist ein &amp;#039;&amp;#039;ungerichteter&amp;#039;&amp;#039; Graph. Die Reihenfolge der durchlaufenen [[Knoten (Graphentheorie)|Knoten]] &amp;#039;&amp;#039;kann&amp;#039;&amp;#039; sich ändern, wenn stattdessen ein anderer Startknoten oder ein [[gerichteter Graph]] genommen wird, der &amp;#039;&amp;#039;nicht&amp;#039;&amp;#039; symmetrisch ist.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
Bezeichne &amp;lt;math&amp;gt; |V| &amp;lt;/math&amp;gt; die Anzahl der [[Knoten (Graphentheorie)|Knoten]] und &amp;lt;math&amp;gt; |E| &amp;lt;/math&amp;gt; die Anzahl der [[Kante (Graphentheorie)|Kanten]] im Graphen. [[Speicherplatz|Speicherplatzverbrauch]] und [[Laufzeit (Informatik)|Laufzeit]] des [[Algorithmus]] sind in [[Landau-Symbole|Landau-Notation]] angegeben.&lt;br /&gt;
&lt;br /&gt;
=== Speicherplatzverbrauch ===&lt;br /&gt;
Da alle bisher entdeckten [[Knoten (Graphentheorie)|Knoten]] gespeichert werden, beträgt der [[Platzkomplexität|Speicherplatzverbrauch]] von Breitensuche &amp;lt;math&amp;gt;\mathcal{O}(|V|)&amp;lt;/math&amp;gt;. Die Breitensuche ist für Verfahren, bei denen die Knoten erst während der Breitensuche generiert werden (z.&amp;amp;nbsp;B. das [[Branch-and-Bound|Branch-&amp;amp;-Bound-Verfahren]]), aufgrund des großen Platzverbrauches meist ungeeignet. Ein der Breitensuche ähnliches Verfahren, das jedoch meist mit deutlich weniger Speicher auskommt, ist die [[iterative Tiefensuche]].&lt;br /&gt;
&lt;br /&gt;
=== Laufzeit ===&lt;br /&gt;
Da im ungünstigsten Fall alle möglichen [[Pfad (Graphentheorie)|Pfade]] zu allen möglichen [[Knoten (Graphentheorie)|Knoten]] betrachtet werden müssen, beträgt die [[Zeitkomplexität|Laufzeit]] der Breitensuche &amp;lt;math&amp;gt;\mathcal{O}(|V| + |E|)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;{{Literatur |Autor=Winfried Hochstättler |Titel=Algorithmische Mathematik |Verlag=Springer |Ort=Heidelberg, u.&amp;amp;nbsp;a. |Datum=2010 |ISBN=978-3-642-05421-1 |Seiten=56–58}}&amp;lt;/ref&amp;gt;. Beachte, dass &amp;lt;math&amp;gt;\mathcal{O}(|E|)&amp;lt;/math&amp;gt; zwischen &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;\mathcal{O}(|V|^2)&amp;lt;/math&amp;gt; variieren kann, abhängig davon, wie dünn der [[Graph (Graphentheorie)|Graph]] ist.&lt;br /&gt;
&lt;br /&gt;
Wenn die Anzahl der Knoten im Graphen im Voraus bekannt ist und zusätzliche [[Datenstruktur|Datenstrukturen]] verwendet werden, um zu bestimmen, welche Knoten bereits zur [[Warteschlange (Datenstruktur)|Warteschlange]] hinzugefügt wurden, kann die [[Platzkomplexität]] als &amp;lt;math&amp;gt;\mathcal{O}(|V|)&amp;lt;/math&amp;gt; ausgedrückt werden. Dies gilt zusätzlich zu dem für das Graphen selbst erforderlichen Speicherplatz, der abhängig von der von einer Implementierung des Algorithmus verwendeten Graphendarstellung variieren kann.&lt;br /&gt;
&lt;br /&gt;
=== Vollständigkeit ===&lt;br /&gt;
Wenn in jedem [[Knoten (Graphentheorie)|Knoten]] nur endlich viele Alternativen existieren, ist die Breitensuche vollständig. Dies bedeutet, dass, wenn eine Lösung existiert, diese auch gefunden wird. Dies ist unabhängig davon, ob der zugrunde liegende [[Graph (Graphentheorie)|Graph]] endlich ist oder nicht. Sollte jedoch keine Lösung existieren, so [[Divergieren|divergiert]] die Breitensuche bei einem unendlichen Graphen.&lt;br /&gt;
&lt;br /&gt;
Bei der Analyse von [[Algorithmus|Algorithmen]] wird angenommen, dass die Eingabe für die Breitensuche ein [[endlicher Graph]] ist, der explizit als [[Adjazenzliste]] oder ähnlich dargestellt wird. Bei der Anwendung von [[Graph (Graphentheorie)|Graph]]-[[Traversierung|Traversierungen]] in der [[Künstliche Intelligenz|künstlichen Intelligenz]] kann die Eingabe jedoch eine implizite Darstellung eines unendlichen Graphen sein. In diesem Zusammenhang wird ein [[Suchverfahren]] als vollständig 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 schließlich den Zielzustand, aber die Tiefensuche kann in Teilen des Graphen verloren gehen, die keinen Zielzustand haben und niemals zurückkehren.&amp;lt;ref&amp;gt;Coppin, B. (2004). Artificial intelligence illuminated. Jones &amp;amp; Bartlett Learning. pp. 79–80.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optimalität ===&lt;br /&gt;
Jede durch Breitensuche gefundene Lösung hat den kürzesten Abstand zum Wurzelknoten. Führt man [[Kantengewicht]]e ein, so muss das Ergebnis, welches am nächsten 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 äquivalent, so ist jede durch Breitensuche gefundene Lösung optimal, da in diesem Fall die Lösung, die am nächsten zum Ausgangsknoten liegt, auch die Lösung mit den geringsten Kosten ist. Ob existierende Lösungen überhaupt gefunden werden hängt mit Endlichkeitseigenschaften des [[Suchbaum|Suchbaums]] zusammen (siehe Vollständigkeit).&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;uniforme Kostensuche&amp;#039;&amp;#039; ({{enS|uniform-cost search}}) ist eine Erweiterung der Breitensuche für Graphen mit gewichteten Kanten. Der [[Algorithmus]] besucht Knoten in Reihenfolge aufsteigender Pfadkosten vom Wurzelknoten und wird deshalb üblicherweise mit einer [[Vorrangwarteschlange]] implementiert, in der alle noch nicht besuchten Nachbarn bereits besuchter Knoten mit der Pfadlänge als Schlüssel verwaltet werden. Die Optimalität ist nur für nicht-negative Kantengewichte garantiert.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Die Breitensuche kann für viele Fragestellungen in der [[Graphentheorie]] verwendet werden. Einige sind:&lt;br /&gt;
&lt;br /&gt;
* Finde alle Knoten innerhalb einer Zusammenhangskomponente&lt;br /&gt;
* Prüfe, ob der gegebene Graph [[Bipartiter Graph|paar]] ist und finde ggf. eine zulässige [[Färbung (Graphentheorie)|2-Färbung]] seiner Knoten&amp;lt;ref&amp;gt;Dieter Jungnickel: &amp;#039;&amp;#039;Graphen, Netzwerke und Algorithmen.&amp;#039;&amp;#039; BI Wissenschaftsverlag, 3. Auflage 1994, ISBN 3-411-14263-4, S. 95–100&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Finde zwischen zwei Knoten u und w einen [[Kürzester Pfad|kürzesten Pfad]] (ungewichtete Kanten)&lt;br /&gt;
* Kürzeste-Kreise-Problem&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Beschränkte Tiefensuche]]&lt;br /&gt;
* [[parallele Breitensuche]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Thomas H. Cormen, Charles Leiserson, [[Ronald L. Rivest]], Clifford Stein: &amp;#039;&amp;#039;Introduction to Algorithms.&amp;#039;&amp;#039; MIT Press, 2nd edition 2001, ISBN 0-262-53196-8&lt;br /&gt;
* Sven Oliver Krumke, Hartmut Noltemeier: &amp;#039;&amp;#039;Graphentheoretische Konzepte und Algorithmen&amp;#039;&amp;#039;. 3. Auflage. Springer Vieweg, 2012, ISBN 978-3-8348-1849-2&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Commonscat|Breadth-first search|Breitensuche}}&lt;br /&gt;
{{Wikibooks|Algorithmensammlung: Graphentheorie: Breitensuche|Breitensuche|suffix=Implementierungen in der Algorithmensammlung}}&lt;br /&gt;
&lt;br /&gt;
{{Gesprochene Version&lt;br /&gt;
|datei=De-Breitensuche-article.ogg&lt;br /&gt;
|länge=06:03 min&lt;br /&gt;
|größe=8,6 MB&lt;br /&gt;
|exzellent=nein&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Graphsuchalgorithmus]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Horst Gräbner</name></author>
	</entry>
</feed>