Inhaltsverzeichnis 1 Einleitung und Grundlagen 1.1 Ziele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Einführendes Beispiel: Berechnung der Fibonacci-Zahlen 1.2.1 Rekursive Berechnung . . . . . . . . . . . . . . . 1.2.2 Iterative Berechnung . . . . . . . . . . . . . . . . 1.2.3 Berechnung mit Hilfe des iterierten Quadrierens 1.3 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Registermaschine (RAM) . . . . . . . . . . . . . 1.3.2 Zeitkomplexität . . . . . . . . . . . . . . . . . . . 1.3.3 Platzkomplexität . . . . . . . . . . . . . . . . . . 1.3.4 Beschreibungskomplexität . . . . . . . . . . . . . 1.3.5 Landausche Symbole . . . . . . . . . . . . . . . . 1.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . 2 Sortieren 2.1 Einfache Sortieralgorithmen . . . . . . . . . . 2.1.1 Vorbemerkungen . . . . . . . . . . . . 2.1.2 Sortieren durch Auswahl . . . . . . . . 2.1.3 Sortieren durch Einfügen . . . . . . . 2.1.4 Verbessertes Sortieren durch Einfügen 2.2 Mergesort . . . . . . . . . . . . . . . . . . . . 2.2.1 Rekursiver Mergesort . . . . . . . . . 2.2.2 Analyse des rekursiven Mergesort . . . 2.2.3 Iterativer Mergesort . . . . . . . . . . 2.2.4 Analyse des iterativen Mergesort . . . 2.3 Heapsort . . . . . . . . . . . . . . . . . . . . . 2.3.1 Heaps und generischer Heapsort . . . 2.3.2 Implementierung von Heaps . . . . . . 2.3.3 Standard-Heapsort . . . . . . . . . . . 2.3.4 Analyse von Standard-Heapsort . . . . 2.3.5 Carlssons Variante von Heapsort . . . 2.3.6 Bottom-Up-Heapsort . . . . . . . . . . 2.4 Quicksort . . . . . . . . . . . . . . . . . . . . 2.4.1 Allgemeines Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 5 6 10 10 13 16 18 18 22 . . . . . . . . . . . . . . . . . . . 25 25 25 26 29 31 32 32 34 37 37 39 39 41 47 48 51 53 54 54 viii Inhaltsverzeichnis 2.5 2.6 2.7 2.8 2.4.2 Worst-Case und Best-Case Analyse von Quicksort 2.4.3 Average-Case Analyse von Quicksort . . . . . . . . 2.4.4 Varianten von Quicksort . . . . . . . . . . . . . . . Interludium: Divide-and-Conquer-Algorithmen . . . . . . 2.5.1 Prinzip . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 Ansatz für eine allgemeine Analyse . . . . . . . . . 2.5.3 Analyse eines Spezialfalles . . . . . . . . . . . . . . 2.5.4 Analyse für allgemeinere Fälle . . . . . . . . . . . Eine untere Schranke für das Sortieren . . . . . . . . . . . 2.6.1 Entscheidungsbaum . . . . . . . . . . . . . . . . . 2.6.2 Maximale Anzahl von Vergleichen . . . . . . . . . 2.6.3 Mittlere Anzahl an Vergleichen . . . . . . . . . . . Bucketsort . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7.1 Das Universum [0 : N − 1] . . . . . . . . . . . . . . 2.7.2 Das Universum [0 : N − 1]c . . . . . . . . . . . . . 2.7.3 Das Universum [0 : N − 1]∗ . . . . . . . . . . . . . 2.7.4 Hinweise zur Implementierung . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . 3 Selektieren 3.1 Quickselect . . . . . . . . . . . . . . . . . . . . 3.1.1 Ein partitionierender Algorithmus . . . 3.1.2 Analyse von Quickselect . . . . . . . . . 3.2 Ein linearer Selektionsalgorithmus . . . . . . . 3.2.1 Der BFPRT-Algorithmus . . . . . . . . 3.2.2 Analyse des BFPRT-Algorithmus . . . . 3.3 Der Spinnen-Algorithmus . . . . . . . . . . . . 3.3.1 Spinnen . . . . . . . . . . . . . . . . . . 3.3.2 Der Algorithmus . . . . . . . . . . . . . 3.3.3 Analyse des Algorithmus . . . . . . . . 3.3.4 Die Spinnenfabrik . . . . . . . . . . . . 3.4 Eine untere Schranke . . . . . . . . . . . . . . . 3.4.1 Ein Gegenspielerargument . . . . . . . . 3.5 Ein randomisierter Median-Algorithmus . . . . 3.5.1 Der Algorithmus . . . . . . . . . . . . . 3.5.2 Ein wenig Wahrscheinlichkeitstheorie . . 3.5.3 Analyse des randomisierten Algorithmus 3.6 Neuere Ergebnisse . . . . . . . . . . . . . . . . 3.6.1 Algorithmen . . . . . . . . . . . . . . . 3.6.2 Untere Schranken . . . . . . . . . . . . . 3.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 58 62 64 64 64 66 67 68 69 69 72 74 74 75 77 79 79 . . . . . . . . . . . . . . . . . . . . . 83 83 83 84 86 86 88 91 91 92 93 94 98 98 100 101 101 107 111 111 111 112 Inhaltsverzeichnis ix 4 Suchen 4.1 Wörterbücher . . . . . . . . . . . . . . . . . . . . . 4.2 Ausnutzen von Sortierung . . . . . . . . . . . . . . 4.2.1 Lineare Suche . . . . . . . . . . . . . . . . . 4.2.2 Binäre Suche . . . . . . . . . . . . . . . . . 4.2.3 Exponentielle Suche . . . . . . . . . . . . . 4.3 Hashing . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Hashfunktionen . . . . . . . . . . . . . . . . 4.3.2 Hashing durch Verkettung . . . . . . . . . . 4.3.3 Linear Probing . . . . . . . . . . . . . . . . 4.3.4 Quadratic Probing . . . . . . . . . . . . . . 4.3.5 Double Hashing . . . . . . . . . . . . . . . . 4.3.6 Universelle Hashfunktionen . . . . . . . . . 4.4 Binäre Suchbäume . . . . . . . . . . . . . . . . . . 4.4.1 Suchbaumeigenschaft . . . . . . . . . . . . . 4.4.2 Suchen und Einfügen im binären Suchbaum 4.4.3 Löschen im binären Suchbaum . . . . . . . 4.5 AVL-Bäume . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Höhenbalancierung . . . . . . . . . . . . . . 4.5.2 Einfügen in einen AVL-Baum . . . . . . . . 4.5.3 Löschen im AVL-Baum . . . . . . . . . . . 4.6 (a, b)-Bäume . . . . . . . . . . . . . . . . . . . . . 4.6.1 Definition . . . . . . . . . . . . . . . . . . . 4.6.2 Einfügen in einen (a, b)-Baum . . . . . . . . 4.6.3 Löschen im (a, b)-Baum . . . . . . . . . . . 4.7 Weitere Varianten von Suchbäumen . . . . . . . . 4.7.1 Vielweg-Suchbäume . . . . . . . . . . . . . 4.7.2 Balancierte Suchbäume . . . . . . . . . . . 4.8 Tries . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8.1 Einfügen und Löschen in Tries . . . . . . . 4.8.2 Implementierung von Tries . . . . . . . . . 4.9 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 . 113 . 114 . 114 . 114 . 114 . 115 . 115 . 118 . 120 . 122 . 123 . 126 . 128 . 128 . 128 . 129 . 131 . 131 . 133 . 137 . 139 . 139 . 141 . 142 . 143 . 143 . 144 . 145 . 145 . 146 . 148 5 Graphen 5.1 Grundlagen der Graphentheorie . . . . 5.1.1 Ungerichtete Graphen . . . . . 5.1.2 Gerichtete Graphen . . . . . . 5.1.3 Repräsentationen von Graphen 5.2 Traversieren von Graphen . . . . . . . 5.2.1 Tiefensuche (DFS) . . . . . . . 5.2.2 Breitensuche (BFS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 149 149 152 156 158 158 161 x Inhaltsverzeichnis 5.3 5.4 5.5 5.6 5.7 5.8 5.2.3 Traversieren von Bäumen . . . . . . . . . . . . . . Zusammenhang von Graphen . . . . . . . . . . . . . . . . 5.3.1 Ungerichtete Graphen . . . . . . . . . . . . . . . . 5.3.2 Gerichtete Graphen . . . . . . . . . . . . . . . . . Kürzeste Wege . . . . . . . . . . . . . . . . . . . . . . . . 5.4.1 Der Algorithmus von Floyd . . . . . . . . . . . . . 5.4.2 Transitive Hülle von Graphen . . . . . . . . . . . . 5.4.3 Der Algorithmus von Dijkstra . . . . . . . . . . . . 5.4.4 Der Algorithmus von Dijkstra mit Priority Queues Interludium: Fibonacci-Heaps . . . . . . . . . . . . . . . . 5.5.1 Aufbau eines Fibonacci-Heaps . . . . . . . . . . . . 5.5.2 Analyse von Fibonacci-Heaps . . . . . . . . . . . . Minimale Spannbäume . . . . . . . . . . . . . . . . . . . . 5.6.1 Der Algorithmus von Prim . . . . . . . . . . . . . 5.6.2 Der Algorithmus von Kruskal . . . . . . . . . . . . Interludium: Union-Find-Datenstrukturen . . . . . . . . . 5.7.1 Darstellung von Mengen durch Listen . . . . . . . 5.7.2 Darstellung von Mengen durch Bäume . . . . . . . 5.7.3 Pfadkompression . . . . . . . . . . . . . . . . . . . Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Texte 6.1 Alphabete und Zeichenketten . . . . . . . . . . . . . . . . . . . 6.2 Der Algorithmus von Knuth, Morris und Pratt . . . . . . . . . 6.2.1 Die Idee . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.2 Analyse des Algorithmus von Knuth, Morris und Pratt . 6.2.3 Bestimmung eigentlicher Ränder . . . . . . . . . . . . . 6.3 Der Algorithmus von Boyer und Moore . . . . . . . . . . . . . . 6.3.1 Die Idee . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2 Bestimmung der Shift-Tabelle . . . . . . . . . . . . . . . 6.3.3 Analyse des Algorithmus von Boyer und Moore . . . . . 6.4 Tries für Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.1 Suffix-Tries . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.2 Suffix-Bäume . . . . . . . . . . . . . . . . . . . . . . . . 6.4.3 Suchen mit Suffix-Bäumen . . . . . . . . . . . . . . . . . 6.5 Interludium: Datenkompression . . . . . . . . . . . . . . . . . . 6.5.1 Eine untere Schranke . . . . . . . . . . . . . . . . . . . . 6.5.2 Huffman-Kodierung . . . . . . . . . . . . . . . . . . . . 6.5.3 Lempel-Ziv-77 . . . . . . . . . . . . . . . . . . . . . . . 6.5.4 Lempel-Ziv-78 . . . . . . . . . . . . . . . . . . . . . . . 6.5.5 Lempel-Ziv-Welch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 165 165 165 170 171 174 178 181 184 184 185 191 191 195 197 197 199 200 203 . . . . . . . . . . . . . . . . . . . 205 . 205 . 205 . 206 . 207 . 208 . 210 . 210 . 213 . 214 . 218 . 219 . 222 . 226 . 227 . 227 . 228 . 232 . 233 . 234 Inhaltsverzeichnis 6.6 xi 6.5.6 Die Burrows-Wheeler-Transformation . . . . . . . . . . . . 235 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 7 Arithmetik 7.1 Euklidischer Algorithmus . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Grundalgorithmus . . . . . . . . . . . . . . . . . . . . . . 7.1.2 Erweiterte Version . . . . . . . . . . . . . . . . . . . . . . 7.2 Modulare Arithmetik . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.2 Modulare Gleichungen . . . . . . . . . . . . . . . . . . . . 7.2.3 Chinesischer Restsatz . . . . . . . . . . . . . . . . . . . . 7.2.4 Berechnung von Potenzen . . . . . . . . . . . . . . . . . . 7.3 Primzahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Elementare Ergebnisse . . . . . . . . . . . . . . . . . . . . 7.3.2 Primzahltests . . . . . . . . . . . . . . . . . . . . . . . . . 7.4 Interludium: Kryptographie . . . . . . . . . . . . . . . . . . . . . 7.4.1 Public-Key-Kryptographie . . . . . . . . . . . . . . . . . . 7.4.2 Das RSA-Verfahren . . . . . . . . . . . . . . . . . . . . . 7.4.3 Sicherheit des RSA-Verfahrens . . . . . . . . . . . . . . . 7.5 Die schnelle Fouriertransformation . . . . . . . . . . . . . . . . . 7.5.1 Multiplikation von Polynomen . . . . . . . . . . . . . . . 7.5.2 Eine alternative Methode zur Polynommultiplikation . . . 7.5.3 Berechnung der Konvolution mittels FFT . . . . . . . . . 7.6 Multiplikation ganzer Zahlen . . . . . . . . . . . . . . . . . . . . 7.6.1 Analyse der Schulmethode . . . . . . . . . . . . . . . . . . 7.6.2 Ein Divide-and-Conquer-Algorithmus . . . . . . . . . . . 7.6.3 Analyse des Algorithmus von Karatsuba und Ofman . . . 7.6.4 Verbesserung des Algorithmus von Karatsuba und Ofman 7.7 Optimale Klammerung von Matrizenprodukten . . . . . . . . . . 7.7.1 Einleitendes Beispiel . . . . . . . . . . . . . . . . . . . . . 7.7.2 Anzahl verschiedener Klammerungen . . . . . . . . . . . . 7.7.3 Lösung mit dynamischer Programmierung . . . . . . . . . 7.8 Matrizenmultiplikation . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1 Der Algorithmus von Strassen . . . . . . . . . . . . . . . . 7.8.2 Analyse des Algorithmus von Strassen . . . . . . . . . . . 7.8.3 Verbesserung des Algorithmus von Strassen . . . . . . . . 7.8.4 Weitere Entwicklungen . . . . . . . . . . . . . . . . . . . . 7.8.5 Invertierung von Matrizen . . . . . . . . . . . . . . . . . . 7.9 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 239 239 240 242 242 245 245 247 248 248 251 255 256 257 258 259 259 260 261 265 265 266 267 269 272 272 272 275 276 277 278 279 282 282 285 xii 8 Schwierige Probleme 8.1 Unentscheidbarkeit . . . . . . . . . . . . . . . . . . . 8.1.1 Entscheidungsprobleme . . . . . . . . . . . . 8.1.2 Abzählbarkeit . . . . . . . . . . . . . . . . . . 8.1.3 Gödelisierung . . . . . . . . . . . . . . . . . . 8.1.4 Universelle Registermaschinen . . . . . . . . . 8.1.5 Unentscheidbare Probleme . . . . . . . . . . . 8.1.6 Die Church-Turing These . . . . . . . . . . . 8.2 N P-Vollständigkeit . . . . . . . . . . . . . . . . . . . 8.2.1 Die Klassen P und N P . . . . . . . . . . . . 8.2.2 Standard-Registermaschinen . . . . . . . . . 8.2.3 Reduktionen . . . . . . . . . . . . . . . . . . 8.2.4 N P-harte und N P-vollständige Probleme . . 8.2.5 Erfüllbarkeitsproblem . . . . . . . . . . . . . 8.2.6 Satz von Cook . . . . . . . . . . . . . . . . . 8.2.7 Konjunktive Normalform und 3Sat . . . . . 8.2.8 Beispiele N P-vollständiger Probleme . . . . . 8.3 Approximative Algorithmen . . . . . . . . . . . . . . 8.3.1 Optimierungsprobleme und Approximationen 8.3.2 Die Klassen N PO und PO . . . . . . . . . . 8.3.3 Die Klasse APX . . . . . . . . . . . . . . . . 8.3.4 Die Klasse PTAS . . . . . . . . . . . . . . . . 8.3.5 Die Klasse FPTAS . . . . . . . . . . . . . . . 8.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . Inhaltsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . 287 . 287 . 287 . 288 . 290 . 292 . 294 . 296 . 297 . 297 . 299 . 300 . 303 . 304 . 305 . 309 . 311 . 317 . 318 . 321 . 322 . 323 . 325 . 331 A Literaturhinweise A.1 Lehrbücher zur Algorithmik . . . . . . . . . . . . . . . . . . . . . A.2 Lehrbücher zu angrenzenden Themen . . . . . . . . . . . . . . . A.3 Originalarbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 . 333 . 334 . 335 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B Gofer-Skripten 337 B.1 Berechnung von Fibonacci Zahlen . . . . . . . . . . . . . . . . . . . 337 C Index 339