René Krooß
Algorithmen und Datenstrukturen
Praktische Übungen für die Vorlesungen und Praktika
Inhalt
7
Vorwort
11
Teil I: Grundlagen
15
1 Einführung
17
1.1 Berechenbarkeit von Algorithmen
18
1.2 Wie eine Turing-Maschine arbeitet
19
1.2.1 Beispiel 1: Addition zweier Zahlen mit einer Turing-Maschine
20
1.2.2 Beispiel 2: Suchen und ersetzen
22
1.2.3 Beispiel 3: Multiplikation zweier Zahlen mit einer erweiterten Turing-Maschine
24
1.2.4 Von der Turing-Maschine zum Prozessor
27
1.3 Laufzeitanalyse von Algorithmen
28
1.3.1 Das P-NP-Problem
30
1.4 Laufzeitabschätzungen von C-Programmen
31
1.5 Übungen
35
2 Basisalgorithmen
37
2.1 Der Ringtausch
38
2.2 Einfache Textsuche
42
2.3 Einfaches Suchen und Ersetzen
47
2.3.1 Entfernen eines Textes aus einer Zeichenkette
47
2.3.2 Einfügen von Freiräumen in den Text
48
2.3.3 Ein vollständiges Programm zum Suchen und Ersetzen
49
2.4 Einfaches Sortieren von Zahlen
52
2.4.1 Bubble Sort
53
2.4.2 Einfaches, sortiertes Einfügen
57
2.5 Primfaktorzerlegung
61
2.5.1 Wann ist eine Zahl eine Primzahl
61
2.5.2 Die Primfaktorzerlegung das Programm Primteiler
63
2.6 Berechnung des GGT (größter gemeinsamer Teiler)
67
2.7 Gezielte Suche nach Primzahlen
70
2.7.1 Das Sieb des Eratosthenes
70
2.8 Rechnen mit beliebig langen Zahlen
73
2.8.1 Addition beliebig langer Zahlen
73
2.8.2 Subtraktion beliebig langer Zahlen
78
2.8.3 Multiplikation beliebig langer Zahlen (Ägyptische Multiplikation)
82
2.8.4 Division beliebig langer Zahlen (Ägyptische Division)
84
2.9 Übungen
97
3 Rekursive Algorithmen
99
3.1 Der Prozessorstapel (Stack)
99
3.2 Was sind Rekursionen und wozu werden sie benötigt
101
3.3 Beispielprogramme zur Rekursion
101
3.3.1 Berechnung der Fakultät
102
3.3.2 Berechnung von Fibonacci-Zahlen
104
3.3.3 Das Erstellen von Galois-Feldern
106
3.3.4 Die Türme von Hanoi
109
3.3.5 Ein Backtracking-Algorithmus
112
3.3.6 Ein einfacher Taschenrechner
118
3.4 Wann Rekursion und wann lieber nicht
127
3.5 Übungen
128
Teil II: Fortgeschrittene Themen
129
4 Verkettete Listen
131
4.1 Die Erstellung verketteter Listen
131
4.1.1 Einfach verkettete Listen
132
4.1.2 Doppelt verkettete Listen
141
4.2 Blockchains und Listen mit beliebigen Objekten
152
4.2.1 Blockchains
152
4.2.2 Listen mit beliebigen Objekttypen
165
4.3 Listen mit Java erstellen
180
4.3.1 Erstellen von Java-Listen mit LinkedList
181
4.3.2 Erstellen von Java-Listen mit Vector
185
4.3.3 Wann LinkedList und wann Vector
186
4.4 Übungen
187
5 Bäume
189
5.1 Allgemeine Bäume
190
5.1.1 Einfach strukturierte allgemeine Bäume
190
5.1.2 Allgemeine Bäume mit beliebigen Objekten
202
5.2 Binärbäume
216
5.3 Bäume in Java
227
5.4 Übungen
232
6 Such- und Sortierverfahren
233
6.1 Wichtige effiziente Sortierverfahren
234
6.1.1 Min-Max-Sort
234
6.1.2 Mergesort
239
6.1.3 Quicksort
245
6.1.4 Treesort
252
6.1.5 Heapsort
255
6.2 Effiziente Suchalgorithmen
264
6.2.1 Der KMP-Algorithmus
264
6.2.2 Threadsearch
271
6.3 Übungen
278
Teil III: Weiterführende Themen
279
7 Signalverarbeitung
281
7.1 Was ist ein Signal
281
7.1.1 Korrektes Messen von Signalen
282
7.2 Generierung digitaler Signale
286
7.2.1 Das Rechtecksignal
287
7.2.2 Das Sägezahnsignal
290
7.2.3 Das Dreiecksignal
292
7.2.4 Das weiße Rauschen
294
7.2.5 Das Sinussignal
297
7.2.6 Zeitveränderliche diskrete Signale
299
7.3 Filteralgorithmen
303
7.3.1 Der Pop-Klick-Filter
304
7.3.2 Der Distortion-Filter
307
7.3.3 Der EMA-Filter
309
7.3.4 Diskrete Fourier-Transformation (DFT)
313
7.4 Übungen
317
8 Grafische Bildverarbeitung
319
8.1 Der Medianfilter
319
8.2 Binärfilter
335
8.3 Lineares Filtern mit Filtermasken
338
8.4 Chroma Keying
343
8.5 Übungen
346
9 Simulation neuronaler Netze
347
9.1 Zeichenerkennung mit neuronalen Netzen
348
9.2 Spracherkennung
361
10 Kryptographische Algorithmen
371
10.1 Historische Chiffren
371
10.1.1 Die Caesar-Chiffre
372
10.1.2 Die Vigenre-Verschlüsselung
377
10.1.3 Die Enigma
380
10.2 Sichere Schlüsselübertragung
389
10.2.1 Verwenden der Modulo-Operation
389
10.2.2 Verwenden des RSA-Algorithmus
396
10.3 Blockchiffren
409
10.4 Hashing-Verfahren
426
10.4.1 Erweitertes XOR-Hashing
426
10.4.2 Der SHA-Algorithmus
436
10.5 Erzeugen sicherer Pseudo-Zufallszahlen
443
10.6 Übertragen von Nachrichten durch Quantenkryptographie
446
11 Graphen
449
11.1 Darstellung eines Graphen als Adjazenzmatrix
451
11.2 Darstellung eines Graphen als verallgemeinerte Baumstruktur
460
11.3 Eulerkreise
469
11.4 Petri-Netze
476
11.4.1 Prozess-Synchronisation
476
11.4.2 Das Erzeuger-Verbraucher-Problem
479
11.4.3 Das Philosophenproblem von Dijkstra
481
11.4.4 Simulation von Petri-Netzen mit Inzidenzmatrizen
495
11.5 Übungen
505
Anhang: Lösung der Übungsaufgaben
507
Anhang zu Kapitel 1 Einführung
507
Anhang zu Kapitel 2 Basisalgorithmen
512
Anhang zu Kapitel 3 Rekursive Algorithmen
514
Anhang zu Kapitel 4 Verkettete Listen
516
Anhang zu Kapitel 5 Bäume
518
Anhang zu Kapitel 6 Such- und Sortierverfahren
520
Anhang zu Kapitel 7 Signalverarbeitung
521
Anhang zu Kapitel 8 Grafische Bildverarbeitung
524
Anhang zu Kapitel 11 Graphen
526
Index
529
© 2009-2024 ciando GmbH