Algorithmen I - Tutorium 3 | Nr. 9 20.06.2016: Spaß mit Graphen und Graphtraversierung Marc Leinweber | [email protected] INSTITUT FÜR THEORETISCHE INFORMATIK (ITI), PROF. DR. DENNIS HOFHEINZ KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Agenda 1 Graphrepräsentation 2 Tiefensuche 3 Breitensuche 4 Aufgaben Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 2/22 Graphen Definition Wir nennen G einen gerichteten Graphen, G = (V , E ), E ⊆ V × V wobei V als Knotenmenge, E als Kantenmenge bezeichnet wird. Wir nennen zwei Knoten adjazent, falls sie durch eine Kante verbunden werden. Wir nennen einen Knoten und eine Kante inzident, falls der Knoten ein Endpunkt der Kante ist. Kennt jemand Beispiele? Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 3/22 Graphrepräsentation Adjazenzfeld Adjazenzliste Adjazenzmatrix Implizite Repräsentation Hashing Man kann sich noch weitere Repräsentationen ausdenken und das werden wir auch Grundprinzip Wählt die Repräsentation nach dem Programm das ihr gerade schreibt. Das Adjazenzfeld wird zwar als die Allzweckwunderwaffe erscheinen und meistens ist es das auch. Vielleicht ist das aber nicht immer der Fall. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 4/22 Adjazenzfeld Wir interpretieren Knoten als Zahlen von 0 . . . n − 1. Die können wir dann als Array-Indizes verwenden Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 5/22 Adjazenzfeld Wir halten uns ein int - Array V [0 . . . n − 1] sowie ein Array E für die Kanteninformationen E [V [i ]] enthält die erste von Knoten i ausgehende Kante Die anderen Kanten folgen dann sequentiell bis E [V [i + 1]] Das bedeutet outdegree(i ) = V [i + 1] − V [i ], falls i ≤ n − 2 Und für n − 1 ? outdegree(n − 1) = E .length − V [n − 1] Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 6/22 Adjazenzliste Wieder mit einem Array V. Statt Indizes speichern wir diesmal verkettete Listen mit Kanteneinträgen. Unterschiede zum Adjazenzfeld: dynamischer d.h. schnelles Einfügen und Löschen von Kanten Speicherverbrauch? Cache-Performance? Adressierung kann je nach Rechnerarchitektur teuer sein (Pointer sind Adressen) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 7/22 Adjazenzmatrix M ∈ {0, 1}n×n mit Mij = 1 ⇐⇒ (i , j ) ∈ E Aufgabe Zeichnet den durch folgende Matrix dargestellten Graphen und gebt eine Darstellung als Adjazenzfeld und Adjazenzliste an. Ist der Graph ein DAG? 0 0 0 0 1 0 0 0 Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 Breitensuche 0 1 1 0 0 1 1 0 Aufgaben 20.06.2016 Ende 8/22 Adjazenzmatrixeigenschaften Eigenschaften Speicherverbrauch gut bzw. schlecht je nach Dichte des Graphen (O (n2 )) Was ist die maximale Anzahl an Kanten in einem Graphen (ohne Parallelkanten)? Graphtraversierung: Schnell bei dichtem Graphen (verglichen mit Adjazenzfeld und Adjazenzliste), langsam sonst Erreichbarkeit von Knoten durch Matrixmultiplikation Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 9/22 Hashing Was machen wir, wenn wir unsere Knoten nicht mit den Zahlen 0 bis n − 1 identifizieren können oder wollen? Statt einem Array V nehmen wir eine Hashtabelle und hashen Knoten auf Adjazenzlisten. Das ist hilfreich, wenn man sich nicht zu viel Mühe geben will, denn das ist in 2 Minuten implementiert. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 10/22 Tiefensuche (DFS = depth-first search) procedure dfs(Node : n) mark (n) foreach (n, m) ∈ E do if (¬marked (m)) dfs(m, id ) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 11/22 Tiefensuche - do it! Aufgabe Starte eine Tiefensuche von Knoten 0! Schreibe in rot den Schrittindex an die Kante. Markiere dabei forward-Kanten blau, backward-Kanten rot, cross-Kanten gelb und tree-Kanten grün. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 12/22 Tiefensuche - Fakten Laufzeit: Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) optimal: Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) optimal: nein, man findet eventuell einen lange Pfad vor einem (deutlich) kürzeren Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) optimal: nein, man findet eventuell einen lange Pfad vor einem (deutlich) kürzeren nicht-rekursiv: ja, möglich! Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) optimal: nein, man findet eventuell einen lange Pfad vor einem (deutlich) kürzeren nicht-rekursiv: ja, möglich! findet Anwendung bei der Suche starker Zusammenhangskomponenten (SCC) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Tiefensuche - Fakten Laufzeit: O (|V | + |E |) optimal: nein, man findet eventuell einen lange Pfad vor einem (deutlich) kürzeren nicht-rekursiv: ja, möglich! findet Anwendung bei der Suche starker Zusammenhangskomponenten (SCC) DAG Wie finde ich mit DFS Kreise? Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 13/22 Breitensuche (BFS = breadth-first search) procedure bfs(Node : s) q : Queue, n : Node q .push(s); mark (s) while(¬q .empty ()) n := q .pop() foreach (n, m) ∈ E do if(¬marked (m) do q .push(m); mark (m) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 14/22 Breitensuche - do it! Aufgabe Starte eine Breitensuche von Knoten 0!! Schreibe in rot den Schrittindex an die Kante. Markiere dabei forward-Kanten blau, backward-Kanten rot, cross-Kanten gelb und tree-Kanten grün. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 15/22 Breitensuche - Fakten Laufzeit: Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 Breitensuche - Fakten Laufzeit: O (|V | + |E |) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 Breitensuche - Fakten Laufzeit: O (|V | + |E |) optimal: Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 Breitensuche - Fakten Laufzeit: O (|V | + |E |) optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür ist man langsamer als bei der Tiefensuche. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 Breitensuche - Fakten Laufzeit: O (|V | + |E |) optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür ist man langsamer als bei der Tiefensuche. Speicheraufwand: O (|V | + |E |). Das kann die iterative Tiefensuche viel besser! Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 Breitensuche - Fakten Laufzeit: O (|V | + |E |) optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür ist man langsamer als bei der Tiefensuche. Speicheraufwand: O (|V | + |E |). Das kann die iterative Tiefensuche viel besser! Kürzeste Wege Wie finde ich mit einer modifizierten Breitensuche kürzeste Wege? Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 16/22 A I: Heaps Aufgabe I Ein Array A[1..h] stellt einen impliziten binären Heap dar. Gib den Index für Elternknoten, linkes Kind und rechtes Kind von Knoten i an, gegeben sie existieren. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 17/22 A I: Heaps Aufgabe I Ein Array A[1..h] stellt einen impliziten binären Heap dar. Gib den Index für Elternknoten, linkes Kind und rechtes Kind von Knoten i an, gegeben sie existieren. parent (i ) = b 2i c kindL (i ) = 2i kindR (i ) = 2j + 1 Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 17/22 A II: Quickselect Aufgabe II Was ermittelt der Quickselect-Algorithmus? Wie lauten Worst-Case-Laufzeit und erwartete Laufzeit im Θ-Kalkül? Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 18/22 A II: Quickselect Aufgabe II Was ermittelt der Quickselect-Algorithmus? Wie lauten Worst-Case-Laufzeit und erwartete Laufzeit im Θ-Kalkül? Ermittelt das Element mit Rang k über einer Folgen von n Elementen. WC: Θ(n2 ) AC: Θ(n) Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 18/22 A III: Heaps Aufgabe III Wie lautet die Heap-Eigenschaft? Wie hoch ist der Baum bei n Elementen? Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 19/22 A III: Heaps Aufgabe III Wie lautet die Heap-Eigenschaft? Wie hoch ist der Baum bei n Elementen? ∀v ∈ V : parent (v ) ≤ v Höhe blog (n)c Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 19/22 A IV: Algorithmenentwurf Aufgabe IV Ein Anagramm ist eine Zeichenkette, welche durch Permutation der Zeichen aus einer anderen Zeichenkette entstanden ist. Auch ist jede Zeichenkette ein Anagramm von sich selbst. 1 Gib eine Funktion f (s) auf Zeichenketten an, die zwei Wörtern genau dann das gleiche Bild zuordnet, wenn sie Anagramme sind. 2 Gegeben sei eine Menge S von Zeichenketten. Gib einen effizienten Algorithmus an, der zu einem Anfragestring q feststellt, ob S ein Anagramm davon enthält. Die Laufzeit soll nicht von |S | abhängen. Berechne vorher eine Datenstruktur, die die Anfrage ermöglicht. Die Vorberechnung zählt nicht zur Anfragezeit. q ist bei Vorberechnung unbekannt. Benutze die Funktion aus 1. Begründe Korrektheit und Laufzeit. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 20/22 A IV: Algorithmenentwurf 1 f (s) sortiert die Zeichen von s lexigrafisch. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 21/22 A IV: Algorithmenentwurf 1 f (s) sortiert die Zeichen von s lexigrafisch. 2 Löse mit Hashtabelle. Berechne Hashtabelle H mit zufälligem h aus universeller Familie und Tabelle der Größe Θ(|S |). Speichere in H alle Bilder von S unter f . Eine Anfrage ist dann eine Anfrage an nach h(f (q )) an H. Die Laufzeit ist unabhängig von |S |, da nach Satz 1 nur eine konstante Anzahl Kollisionen erwartet wird. Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 21/22 Was haben wir heute gemacht? Graphdarstellung Graphtraversierung Aufgaben Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 22/22 Was haben wir heute gemacht? Graphdarstellung Graphtraversierung Aufgaben Viel Erfolg und eine super Woche! Graphrepräsentation Tiefensuche Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9 Breitensuche Aufgaben 20.06.2016 Ende 22/22