WS 2007/08 Diskrete Strukturen Prof. Dr. R. Westermann Lehrstuhl für Computer Grafik und Visualisierung Fakultät für Informatik Technische Universität München http://wwwcg.in.tum.de/Teaching/WS2007/DiskreteStrukturen 8.1.2008 Kapitel IV – Graphentheorie • Graphentheorie – Grundlagen – Bäume – Eigenschaften von Graphen – Graphen-Algorithmen – Matchings und Netzwerke 2 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Fragestellungen: – In welcher Reihenfolge können wir die Knoten eines Graphen durchlaufen (traversieren)? – Wie können wir aufspannende Bäume in einem gegebenen Graphen berechnen? – Was ist der kürzeste Weg von einem Knoten zu einem anderen? – Wie können wir einen binären Suchbaum systematisch traversieren? 3 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Breitensuche Ein Algorithmus zum Durchlaufen der Knoten 13 o n h8 eines Graphen. 7 – Durchlauf der Kanten im Gegenuhrzeigersinn, 4 b Start auf 6 Uhr m 12 root a 1 e q i c 2 g6 16 f 4 p 18 15 j 17 3 d 9 14 r k 11 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München 5 l 10 computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Breitensuche Mittels einer Breitensuche in einem Graphen lässt sich eine Wurzelbaum konstruieren. a – In unserem Beispiel sogar ein c Spannbaum. f l 5 g k m n d b h e o q r Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München i j p computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche Eingabe: Graph G = (V,E), Sartknoten s V. Ausgabe: Felder d[v], pred[v] für alle v V. for all v V do begin if v = s then d[v] 0; else d[v] ; pred[v] NULL; end … 6 // bearbeite alle Knoten aus V // wenn wir am Startknoten sind // setze seinen Abstand auf 0 // setze alle anderen Abstände auf // setze alle Vorgänger auf „undefiniert“ Fortsetzung nächste Seite Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche (Fortsetzung) … Q new QUEUE; Q.INSERT(s); while not Q.IsEMPTY() do begin v Q.DEQUEUE(); for all u (v) do if d[u] = then begin d[u] d[v] + 1; pred[u] v; Q.INSERT(u); end end // legt ein neues Objekt vom Typ Warteschlange an // fügt das Element s in die Warteschlange ein // teste, ob noch Elemente in der Queue // hole nächstes Element aus der Queue // betrachte alle Nachbarn von v // der Knoten u ist noch unbesucht // sein Abstand = Abstand Vorg. + 1 // sein Vorgänger ist v // setze ihn in die Warteschlange 7 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche – Wahl der Datenstruktur zur Speicherung der Adjazenzinformation • Platzbedarf der Adjazenzmatrix ist O(|V|2) • Platzbedarf der Adjazenzliste ist |V| verkette Listen mit |E| Listenelementen 8 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche – Zeitkomplexität des Algorithmus: • Bei Speicherung des Graphen mit Adjazenzlisten: O(|V| + |E|) da die erste Schleife |V|-mal und die zweite 2|E|-mal durchlaufen wird. • Bei Speicherung des Graphen mit Adjazenzmatrix: O(|V|2) da zum Auffinden der Nachbarn alle |V| Nachbarn durchlaufen werden müssen. 9 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche Satz: Die Breitensuche i.e. Graphen G = (V,E) hat ein Laufzeit von O(|V| + |E|), wenn der Graph als Adjazenzliste gespeichert ist. Am Ende gilt: 10 1. d[v] ist die Länge des kürzesten s-v-Pfades in G. Falls kein s-v-Pfad exisitiert, gilt d[v]=. 2. Falls G zusammenhängend ist, dann bilden die Kanten {v, pred[v]}, v V \ {s}, einen Spannbaum T mit der Eigenschaft, dass für alle Knoten v der s-vPfad in T ein kürzester s-v-Pfad in G ist. Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche Beweis von 1.: 11 – Für alle besuchten Knoten v V \ {s} gilt: d[v] = d[pred[v]]+1 ≥ 1. – Laufen wir von v ausgehend „rückwärts“ bis zu s, dann nehmen die Abstände in jedem Schritt um eins ab. – Man erhält also einen Pfad der Lände d[v], der in einem Knoten mit d = 0 (dies muss s sein) endet. – Für {u,v} E gilt: d[v] ≤ d[u] + 1. – Für einen bel. s-v-Pfad s = u0, u1,…, uk = v gilt dann: d[v] = d[uk] ≤ d[uk-1]+1 ≤ d[uk-2]+2 ≤ … ≤ d[u0]+k = k. Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche Beweis zu 2.: – Die Breitensuche erzeugt keine Kreise, da ein Knoten immer nur zu höchstens einem Knoten mit kleinerem Abstand benachbart ist. – Da Kanten immer an den aktuellen Graphen angehängt werden, ist der resultierende Graph ein Baum. – Angenommen v VT und s ist der Startknoten. Da G zusammenhängend ist, existiert ein Pfad s = v0, v1…, v und somit ein Index i mit vi VT und vi+1 VT. Da aber vi irgendwann die aktuelle Ecke war und vi+1 hinzugenommen wurde, muss vi+1 in VT sein. Dies ist ein Widerspruch zur Annahme. 12 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Breitensuche Beispiel für einen gerichteten Graphen: a b c d a d h b e f g h f i j k i c l k l g e j 13 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Tiefensuche Ein Algorithmus zum Durchlaufen der Knoten 17 o n h 16 eines Graphen. 15 – Durchlauf der Kanten im Gegenuhrzeigersinn, 9 b Start auf 6 Uhr. m 13 root a 1 e q i c 2 g 14 11 10 j 12 6 f p 14 18 d 8 7 r k 3 5 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München l 4 computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Tiefensuche Mittels einer Tiefensuche in einem Graphen lässt sich eine Wurzelbaum konstruieren a c f l g n p m h j r k q 15 In unserem Beispiel sogar ein Spannbaum. i b e Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München o d computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Tiefensuche – Traversiert den Graphen in die Tiefe, bis es nicht mehr weitergeht. – Verwendet keine Warteschlange, sondern einen Stack. • In die Warteschlange werden Elemente hinten angehängt und in der Reihenfolge ihres Einfügens entnommen. – FIFO – FirstInFirstOut-Strategie • In den Stack werden Elemente vorne eingesetzt und in der umgekehrten Reihenfolge ihres Einfügens entnommen. – LIFO – LastInFirstOut-Strategie 16 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Tiefensuche Eingabe: Graph G = (V,E), Sartknoten s V. Ausgabe: Feld pred[v] für alle v V. for all v V do pred[v] NULL; … 17 // bearbeite alle Knoten aus V // setze alle Vorgänger auf „undefiniert“ Fortsetzung nächste Seite Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Tiefensuche (Fortsetzung) … S new STACK; // legt ein neues Objekt vom Typ STACK an v s; repeat if u (v) \ {s} mit pred[u] = NULL then // nicht besuchter Nachf. ? S.PUSH(v) // setze Element auf den Stack pred[u] v; // das Element ist Vorgänger von u v u; // mache mit u weiter else if not S.IsEMPTY() then v S.POP(); // hole Element vom Stack else v NULL; until v = NULL; // wiederhole bis Stack leer 18 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Algorithmus Tiefensuche Satz: Die Tiefensuche in einem Graphen G = (V,E) hat eine Laufzeit von O(|V| + |E|), wenn der Graph als Adjazenzliste gespeichert ist. Am Ende des Algorithmus gilt: Falls G zusammenhängend ist, dann bilden die Kanten {v, pred[v]}, v V \ {s}, einen Spannbaum. 19 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Kürzeste Wege – Gegeben sind ein Graph G = (V,E) und eine Gewichtsfunktion w : E ℝ+ {+}. – O. B. d. A. sei G vollständig und damit auch zusammenhängend. – Sei u = v0, v1,..., vn = v ein Pfad in G. Die Länge dieses Pfades ist n1 w(vi , vi 1). i 0 20 – d(u, v) sei die Länge eines kürzesten Pfades von u nach v. Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Kürzeste Wege Problemstellungen: – Gegeben u, v V , berechne d(u, v). – Gegeben u V , berechne für alle v V die Länge d(u, v) eines kürzesten Pfades von u nach v (sssp, single source shortest path). – Berechne für alle (u, v) V die kürzeste Entfernung d(u, v) (apsp, all pairs shortest path). 21 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Dijkstras Algorithmus für sssp. FV for all v F do d[v] // d: aktuell kürzeste Pfade p[v] null // p: Vorgängerliste d[s] = 0; // der Startknoten while F do bestimme u F mit d[u] minimal; F F \ {u}; for all v (u) do if d[v] > d[u] + w(u,v) d[v] d[u] + w(u,v) 22 p[v] u Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Satz: Dijkstras Algorithmus berechnet d(s,v) für alle v V; der Zeitaufwand ist O(n2), der Platzbedarf O(n+m), wobei V = n und E = m. Beweis: Zeit- und Platzbedarf sind aus dem Algorithmus ersichtlich. Die Korrektheit zeigen wir mit einem Widerspruchsbeweis: Annahme: v sei der erste Knoten, so dass d(s,v) falsch (d. h. zu groß) berechnet wird. 23 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Beweis (Fortsetzung): Diese Situation illustriert folgendes Bild: 24 Nach Annahme muss dann gelten: d(w) + w(w,v) < d(s,v´) + d(v´,v) = d(v) . Damit wäre d(w) aber kleiner als d(v), und der Algorithmus hätte w und nicht v gewählt. □ Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Dijkstras Algorithmus Beispiel: 25 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Dijkstras Algorithmus Beispiel: 26 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Minimale aufspannende Bäume Beispiel: Eine Firma plant eine Vernetzung seiner 5 Computer-Zentren. Die Leasing-Gebühren für die Verbindung zweier Zentren verursachen Kosten. Welche Verbindungen sollen geleast werden, so dass bei minimalen Kosten alle Zentren miteinander kommunizieren können. Lösung: Wir modellieren das Problem als gewichteten Graphen und konstruieren einen 27 Spannbaum, der die Gewichte minimiert. Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Minimale aufspannende Bäume Beispiel: d a 1200 c b e 28 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Minimale aufspannende Bäume Eine Lösung des vorhergehenden Beispiels: d a 1200 c b e 29 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Minimale aufspannende Bäume Der Algorithmus von Kruskal: Eingabe: zusammenhängender ungerichteter Graph G = (V,E), V = n Gewichtsfunktion w: E R. Augabe: Spannbaum T = (V,ET) mit minimalem Gewicht. 30 ET ; for i = 1 to n-1 do begin X {e E \ ET | ((V,ET {e}) ist kreisfrei}; wähle emin X mit w(emin) = mineXw(e); ET ET {emin}; end Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Der Algorithmus von Kruskal Beispiel: a 2 3 b 3 1 e 4 4 3 1 2 f 3 2 i c j 5 g 3 4 3 d h 3 k 1 l Iteration Kante Gewicht 1 {c,d} 1 2 {k,l} 1 3 {b,f} 1 4 {c,g} 2 5 {a,b} 2 6 {f,j} 2 7 {b,c} 3 8 {j,k} 3 9 {g,h} 3 10 {i,j} 3 11 {a,e} 3 31 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Traversierung von Wurzelbäumen Traversierung Beispiel: Ausgabe Wurzel, traversiere Teilbäume von links nach rechts: a b c f e g d a,b,e,j,k,n,o,p,f,c,d,g,l,m,h,i h traversiere Teilbäume von links nach rechts, Ausgabe Wurzel: i j,n,o,p,k,e,f,b,c,l,m,g,h,i,d,a k j n 32 o m l p traversiere linken Teilbaum, Ausgabe Wurzel, traversiere rechte Teilbäume: j,e,n,k,o,p,b,f,a,c,l,g,m,d,h,i Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Preorder-Traversierung von Wurzelbäumen Procedure preorder (Eingabe: Wurzelbaum T) v Wurzel von T; Gebe Inhalt von v aus for all u (v) von links nach rechts do // bearbeite alle Kinder begin T Teilbaum von T mit u als Wurzel preorder(T); // rekursiver Aufruf der Traversierung end 33 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Postorder-Traversierung von Wurzelbäumen Procedure postorder (Eingabe: Wurzelbaum T) v Wurzel von T; for all u (v) von links nach rechts do // bearbeite alle Kinder begin T Teilbaum von T mit u als Wurzel postorder(T); // rekursiver Aufruf der Traversierung end Gebe Inhalt von v aus 34 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization Kapitel IV – Graphen; Algorithmen • Inorder-Traversierung von Wurzelbäumen Procedure inorder (Eingabe: Wurzelbaum T) v Wurzel von T; if IsLeaf(v) then Gebe Inhalt von v aus else begin l erstes Kind von v von links nach rechts; T Teilbaum von T mit l als Wurzel; inorder(T); // rekursiver Aufruf der Traversierung Gebe Inhalt von v aus for all u (v) \ { l } von links nach rechts do begin T Teilbaum von T mit u als Wurzel; inorder(T); end end 35 Vorlesung Diskrete Strukturen WS 07/08 Prof. Dr. R. Westermann – Institut für Informatik, TU München computer graphics & visualization