--- title: Breitensuche date: 2018-11-13 --- (ungerichtete Graphen) *Frage*: Gegeben ein Graph $G = (V,E)$ und $s \in V$. Wie finden wir die kürzesten Pfade zum Knoten $u \in V \setminus \{s\}$? Ohne Einschränkung $V = \{1,...,n\}$. *Zuerst*: a) Speichern von Graphen Man möchte unter Anderem folgendes berechnen/testen: i) für $u,v \in V$ ist $\{u,v\} \in E$? ii) $\Gamma(u) = \{v \in V \mid \{u,v\} \in E\}$ Der Aufwand für diese Operationen ist abhängig davon, wie wir den Graphen speichern. 1. Möglichkeit: Adjazenzmatrix $A$ mit $A_{ij} = \begin{cases} 1 & \{i,j\} \in E \\ 0 & \text{sonst} \end{cases}$ Speicheraufwand: $O(n^2)$ * testen ob $\{u,v\} \in E$ kostet $O(1)$ (teste ob $A_{ij} = 1$ oder nicht) * berechnen von $\Gamma(u)$ kostet $O(n)$ 1. Möglichkeit: Verkettete Listen (Adjazenzlisten) Für jeden Knoten $u \in \{1,...,n\}$ speichern wir eine (aufsteigend sortierte) Liste der Nachbarn von $u$. *Beispiel*: ![Graph](20181113_2-adjlist.png) | Knoten | Nachbarn | | --- | --- | | 1 | 2, 3, 4 | | 2 | 1, 4 | | 3 | 1 | | 4 | 1, 2 | | 5 | 6 | | 6 | 5 | Speicherplatz: $\sum\limits_{u \in V} | \Gamma(u) | = \sum\limits_{u \in V} deg(u) = 2 |E| \Rightarrow O(n+|E|) = O(|V| + |E|)$ * testen ob $\{u,v\} \in E$ kostet $O(min\{deg(u), deg(v)\})$ * berechnen von $\Gamma(u)$. Nachbarschaft entspricht genau der Adjazenzliste. $O(|\Gamma(u)|) = O(deg(u))$ b) Warteschlange *Beispiel*: i) Supermarkt ii) Kommunikationskanal **Abstraktion**: Sei $U$ eine endliche Menge. Eine Queue ist eine Datenstruktur mit folgenden Operationen: i) Erzeugen einer leeren Warteschlange `Q <- new Queue()` ii) Einfügen von Elementen in die Warteschlange `Q.enqueue(u)` mit $u \in U$ iii) Entfernen des *zuerst* hinzugefügten Elements aus der Warteschlange `u <- Q.dequeue()` iv) Testen, ob die Warteschlange leer ist `Q.isEmpty()` Queue ist eine `FIFO` Datenstruktur Damit können wir die Breitensuche beschreiben. # Algorithmus (Breitensuche) *Eingabe*: Graph $G = (V,E)$ mit $V = \{1,...,n\}$ als Adjazenzliste und sei $s \in V$ i) für alle $v \in V\setminus\{s\}$ setze `d[v] =` $\infty$ und `pred[v] = NIL` i) `d[s] = 0` i) `Q <- new Queue()` i) `Q.enqueue(s)` i) `while (!Q.isEmpty())` a) `v <- Q.dequeue()` a) Für alle $u \in \Gamma(v)$ Falls `d[u] =` $\infty$ dann * setze `d[u] = d[v] + 1` * setze `pred[u] = v` * `Q.enqueue(u)` i) *Ausgabe*: `d[u]`, `pred[u]` für alle $u \in V$ **Beispiel**: Startknoten: $s = 1$ ![Breitensuche](20181113_2-breitensuche.png) | *Queue* | | --- | | **1** | | **2**, 4, 3 | | **4**, 3, 5 | | **3**, 5 | | **5** | | v | 1 | 2 | 3 | 4 | 5 | | --- | --- | --- | --- | --- | --- | | `d[v]` | 0 | 1 | 1 | 1 | 2 | | `pred[v]` | | 1 | 1 | 1 | 2 | # Satz (Breitensuche) Sie Breitensuche liefert für den Startknoten $s$ die kürzesten $u$-$s$-Pfade für alle $u \in V$ als `p = (u, pred[u], pred[pred[u]], ..., s)` in Laufzeit $O(|V| + |E|)$ # Beweis (Breitensuche) i) Laufzeit ist klar i) **Korrektheit** Für $u \in V$ ist `p = (u, pred[u], pred[pred[u]], ..., s)` ein Pfad in $G$ (da jeder Knoten maximal einmal in die Queue eingefügt wird, gibt es keine Knotenwiederholung). Die Länge von `p` ist `d[u]`, da * `d[u] - 1 = d[pred[u]]` * `d[pred[pred[u]]] = d[pred[u]] - 1 = d[u] - 2` usw. bis `d[s] = 0`. Sei $p' = (v_0 = u, v_1, ... v_k = s)$ ein weiterer $u$-$s$-Pfad. Zu zeigen: `d[u]` $\leq$ `k`. Es gilt für alle $\{u',v'\} \in E$ ``` d[v'] <= d[u'] + 1 ``` $\Rightarrow d[u] \leq d[v_1] + 1 \leq d[v_2] + 2 \leq ... \leq d[v_k] + k \leq d[s] + k = k$ $$ \tag*{$\Box$} $$ # Satz (Breitensuche $\to$ Spannbaum) Breitensuche liefert bei Eingabe eines zusammenhängenden Graph $G = (V,E)$ und $s \in V$ einen Spannbaum $T=(V,E')$ mit $E' = \{\{u, pred[u]\} \mid u \in V \setminus \{s\}\}$ von $G$. # Beweis (Breitensuche $\to$ Spannbaum) Zu zeigen: $T$ ist Spannbaum von $G$, das heißt i) $T$ ist zusammenhängend Für $u,v \in V$ sind * $p = (u, pred[u], ..., s$ * $p' = (v, pred[v], ..., s$ Pfade in $T$. Damit ist $u \sim v$ und $v \sim u$ in $T$ und damit (Transitivität) $u \sim v$ in T $\Rightarrow T$ ist zusammenhängend i) $T$ ist kreisfrei $T$ ist kreisfrei, da $T$ zusammenhängend und $|E'| = |V| + 1$ (siehe Übung) $$ \tag*{$\Box$} $$