erste Auflage

Werbung
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
Herunterladen