DATENSTRUKTUREN UND ALGORITHMEN 2 Ist die Datenstruktur so wichtig??? Wahl der Datenstruktur wichtiger Schritt beim Entwurf und der Implementierung von Algorithmen Dünn besetzte Graphen und Matrizen bilden keine Ausnahme Bei dünn besetzten Matrizen gegenseitiger Einfluss: Algorithmen bestimmen Wahl der Datenstruktur Wahl der Datenstruktur bestimmt Algorithmen Analyse der Algorithmen im RAM-Modell und im I/O-Modell 3
2.: EM- bzw. I/O-Modell Motivation Ein Rechner, insbesondere der Speicher, ist hierarchisch aufgebaut Register... Grund:??? Wichtig: Blockbasierter Zugriff günstiger als zufälliger Konzept lässt sich auf andere Bereiche übertragen: Parallele Kommunikation Stapelweise Abarbeitung 4 Speicherhierarchie Blockweise Abarbeitung unter Ausnutzung von Lokalität Chip On-/off-Chip, geteilt/privat Register CPU L Cache ~ 64 KB L2 Cache ~ 4 MB Main Memory (RAM) ~ 8 GB L cache hit: -3 Zyklen L2 cache hit: 0-5 Zyklen RAM (cache) hit: 00-250 Zyklen 5
I/O-Modell = EM-Modell Speicher ist hierarchisch organisiert: Register Caches (L, L2, L3) RAM SSD, HDD Cache External Memory-Modell: 2 Ebenen: Schnell und langsam Schnell: Cache oder (Haupt)Speicher Langsam: (Haupt)Speicher oder Platte Benennung nur Termini, Prinzipien gelten für jeden Ebenenübergang RAM 6 Modell-Parameter Speicher partitioniert in Blöcke der Größe L (Größe einer Cachezeile) Größe des schnellen Speichers ist Z Langsamer Speicher ist nicht limitiert in der Größe Referenziertes Datum nicht im Cache: Cache-Fehlzugriff Blocktransfer vom RAM in den Cache Komplexitätsmaß: Zahl der Cache-Fehlzugriffe (I/Os) Frage: Welche Komplexität (Anzahl I/O-Operationen) hat das Scannen eines Arrays der Länge N? 7
Externes Sortieren Ausnahmsweise kein Graphen- oder Matrixalgorithmus! Eingabe: Zahlenfolge A der Länge N >> Z Ausgabe: A sortiert abgelegt im langsamen Speicher Externes Merge-Sort am Beispiel (s. Wikipedia): Sortiere 400 MB Daten mit 00 MB schnellem Speicher. Lese 00 MB Daten in schnellen Speicher und sortiere diese mit einem internen Algorithmus, bspw. Quicksort 2. Schreibe die sortierten Daten in den langsamen Speicher 3. Wiederhole ) und 2), bis alle 00 MB-Blöcke sortiert sind. 4. Lies die ersten 20 MB (= 00 MB / (4 Blöcke + )) jedes sortierten Blocks in den schnellen Speicher, Rest: Ausgabepuffer 5. Führe 4-fach-Merge(-Sort) durch und speichere Ergebnis im Ausgabepuffer. Wenn Ausgabepuffer voll, dann in langsamen Speicher schreiben. Wenn Eingabepuffer leer, dann nächsten Block lesen 8 Skizze und Zeitkomplexität Externe Sortierphase: O(N/L) I/Os Merge-Phase: k-faches Verschmelzen mit k = Z/2L Zeitkomplexität: O(N/L * log Z/L (N/L)) I/Os = O(sort(N)) 9
Externes Sortieren, alternatives Beispiel 52 GB Daten sortieren, interner Speicher der Größe 4 GB Annahme: 8-faches Verschmelzen besonders effizient Frage: Wie läuft der Algorithmus nun ab? 28 Iterationen der ersten Phase => 28 Blöcke, in sich sortiert (iss). Verschmelziter.: 8-faches Verschmelzen => 28/8 = 6 Blöcke, iss 2. Verschmelziter.: 8-faches Verschmelzen => 6/8 = 2 Blöcke, iss 3. Verschmelziter.: 2-faches Verschmelzen => 2/2 = Block, vollständig sortiert Zeitkomplexität: O(N/L * log Z/L (N/L)) I/Os = O(sort(N)) 20 Analyse im Detail Merge-Sort intern:. Phase: Erstellung sortierter Folgen 2. Phase: Verschmelzen von zwei sortierten Folgen Abbruch, wenn nur noch eine sortierte Folge übrig bleibt Analyse des internen Algorithmus im I/O-Modell:. Phase: keine I/Os 2. Phase: Verschmelzen von S und S 2 benötigt O( + ( S + S 2 ) / L) I/Os (scanning) Jedes Element ist in O(log N) Verschmelzungs-Ops. involviert Es gibt O(N) Verschmelzungs-Ops. (Baum!) => O(N + (N / L) log 2 N) I/Os 2
Illustration Siehe Tafel! 22 Das muss schneller gehen! Beschleunigung durch veränderte. Phase: Sicherstellen, dass 2. Phase mit N / Z sortierten Folgen startet (anstelle von N) Dazu: N / Z Stücke der Größe Z bilden, in den internen Speicher holen, dort sortieren und wieder zurückschreiben Aufwand: O((N / Z) * (Z / L)) = O(N / L) I/Os Kosten für neue 2. Phase wg. weniger Sequenzen: O(N / Z + (N / L) log 2 (N / Z)) I/Os Gesamt: O((N / L) log 2 (N / L)) I/Os Grund: N / Z < N / L, Z <= poly(l) Zum Vergleich, vorher: O(N + (N / L) log 2 N) I/Os 23
Basis des log drücken Beschleunigung durch veränderte 2. Phase: Sicherstellen, dass Zahl der Sequenzen sich um einen Faktor Ω(Z / L) reduziert von einer Iteration zur nächsten Dann: O(log Z / L (N / L)) Iterationen reichen aus! Darum: k-faches Verschmelzen mit k = Z / 2L Sequenzen Beispiel: Siehe Tafel! Gesamtlaufzeit: O(N/L * log Z/L (N/L)) I/Os = O(sort(N)) 24 Zwischenfazit EM-Modell Speicherhierarchie wichtiger Aspekt eines Rechners Übergang der Ebenen universell Blockweise Abarbeitung wichtig Dazu Lokalität ausnutzen! Möglichst wenig im Speicher springen! Wesentliche Operationen mit Laufzeiten: Scannen: scan(n) = O(N / L) I/Os Sortieren: sort(n) = O(N/L * log Z/L (N/L)) I/Os 25
Minimum Spanning Forest Algorithmus für RAM-Modell von Jarnik und Prim Eingabe: Ungerichteter gewichteter Graph G = (V, E) Ausgabe: Wald von Spannbäumen minimalen Gewichts Algorithmus (Skizze): Starte mit beliebigem Knoten Iteriere: Verbinde unbesuchten Knoten mit Baum, der über die leichteste Kante verbunden ist Wiederhole für weitere ZHK Prioritätswarteschlange speichert Knoten Laufzeit: O(m log n) mit binären Heaps O(m + n log n) mit Fibonacci-Heaps 26 Beispiel 0 4 8 2 2 3 4 5 4 4 3 6 7 3 2 9 4 5 27
Minimum Spanning Forest Algorithmus für EM-Modell von [Arge et al., SWAT 00] Eingabe und Ausgabe wie eben Änderung des Algorithmus: Prioritätswarteschlange PQ für EM-Modell PQ speichert nun Kanten anstatt Knoten: Keine Aktualisierungen nötig PQ enthält (mindestens) alle Kanten, die Knoten des Baums mit Knoten außerhalb verbinden Es können darin auch Kanten sein, die zwei Baumknoten miteinander verbinden Iteration des Algorithmus (sei u der aktuelle Knoten): Extract-min aus PQ für Kante (u, v) Nur falls v noch nicht im Baum: Füge v zum Baum hinzu, füge seine inzidenten Kanten außer (u, v) in PQ ein 28 Analyse des Algorithmus Korrektheit Jeder Knoten im Baum fügt seine inzidenten Kanten hinzu PQ kann daher zwei Kopien derselben Kante beinhalten Annahme: Alle Kantengewichte sind verschieden Wenn Kante e aus PQ entfernt wird, ist ihre Kopie mglw. nächstes Min. => zweites extract-min zum Test, ob v im Baum Bei gleichem Startknoten (pro ZHK) und eindeutigen Kantengewichten: Reihenfolge der bearbeiteten Knoten wie bei RAM- Algorithmus => gleiches Endergebnis 29
Analyse des Algorithmus Laufzeit Die Adjazenzliste jedes Knotens wird einmal gelesen: O(n + m/l) I/Os O(m) Einfüge- und extract-min-operationen PQ: Einfügen und extract-min von m Elementen in O(/L log Z/ (m/l)) amortisierter Zeit L Laufzeit: O((n + m/l) + m * log Z/L (m/l) / L) = O(n + sort(m)) Schnellere EM-Verfahren existieren 30