Algorithmen und Datenstrukturen Prof. Jürgen Sauer Algorithmen und Datenstrukturen Skriptum zur Vorlesung im WS 2001 / 2002 1 Algorithmen und Datenstrukturen 1. Objektorientierte Programmierung mit Datenstrukturen und Algorithmen 1.1 Ein einführendes Beispiel: Das Durchlaufen eines Binärbaums 1.1.1 Rekursive Problemlösung 1.1.2 Nichtrekursive Problemlösung 1.1.3 Verallgemeinerung 1.2 Begriffe und Erläuterungen zu Datenstrukturen und Programmierverfahren 1.2.1 Algorithmus (Verarbeitung von Daten) 1.2.1.1 Datenstruktur und Programmierverfahren 1.2.1.2 Der intuitive Algorithmus-Begriff 1.2.1.3 Bausteine für Algorithmen 1.2.1.4 Formeln, Eigenschaften von Algorithmen 1.2.1.5 Komplexität 1.2.1.6 Laufzeitberechnungen („Big-O“) 1.2.1.7 O(logN)-Algorithmen 1.2.1.8 Effizienz 1.2.2 Daten und Datenstrukturen 1.2.2.1 Der Begriff Datenstruktur 1.2.2.2 Relationen und Ordnungen 1.2.2.3 Klassifikation von Datenstrukturen 1. Lineare Ordnungsgruppen 2. Bäume 3. Graphen 4. Dateien 5. Datenbanken 1.2.3 Definitionsmethoden für Datenstrukturen 1.2.3.1 Der abstrakte Datentyp (ADT) 1.2.3.2 Die axiomatische Methode 1.2.3.3 Die konstruktive Methode 1.2.3.4 Die objektorientierte Modellierung abstrakter Datentypen Die Spezifikation abstrakter Datentypen Klassendiagramme der Unified Modelling Language 1.2.3.5 Die Implementierung abstrakter Datentypen in C++ 1.2.3.5.1 Das Konzept der benutzerdefinierten Datentypen class bzw. struct 1.2.3.5.2 Generische ADT (Klassenschablonen) 1.2.3.6 Die Implementierung abstrakter Datentypen in Java 1.2.3.6.1 Modellierung von Zustand und Verhalten 1.2.3.6.2 Referenzen, einfache Typen und Referenztypen 1.2.3.6.3 Superklassen und Subklassen, Vererbung und Klassenhierarchie 1.2.3.6.4 Schnittstellen und Pakete 2 Algorithmen und Datenstrukturen 1.2.3.6.5 Polymorphismus und Binden 1.3 Sammlungen (Container) und Ordnungen 1.3.1 Ausgangspunkt: Das Konzept für Sammlungen in Smalltalk 1.3.2 Behälter-Klassen 1.3.2.1 Lineare Kollektionen 1. Sammlungen mit direktem Zugriff 2. Sammlungen mit sequentiellem Zugriff 1.3.2.2 Nichtlineare Kollektionen 1. Hierarchische Sammlung 2. Gruppenkollektionen Set Graph Netzwerk 2. Implementierung von Datenstrukturen und Algorithmen in Programmiersprachen 2.1 Datenstrukturen und Algorithmen in C++ 2.2 Datenstrukturen und Algorithmen in Java 2.2.1 Durchwandern von Daten mit Iteratoren 2.2.2 Die Klasse Vector 2.2.3 Die Klasse Stack 2.2.4 Die Klasse Bitset für Bitmengen 2.2.5 Die Klasse Hashtable und assoziative Speicher 2.2.6 Die abstrakte Klasse Dictionary 2.2.7 Die Klasse Properties 2.2.8 Collection-API 2.2.8.1 Die Schnittstelle Collection, Iterator, Comparator 2.2.8.2 Die Behälterklassen und Schnittstellen des Typs List 2.2.8.3 Die Behälterklassen des Typs Set 2.2.8.4 Die Behälterklassen des Typs Map 2.2.8.5 Implementierung von Graphen-Algorithmen 1. Kürzeste Pfade in gerichteten, ungewichteten Graphen 2. Berechnung der kürzesten Pfadlängen in gewichteten Graphen 3. Berechnung eines minimal spannenden Baums in einem zusammenhängenden ungewichteten Graphen (Algorithmus von Prim) 2.2.9 Algorithmen 2.2.9.1 Datenmanipulation 2.2.9.2 Größter und kleinster Wert einer Collection 2.2.9.3 Sortieren 2.2.9.4 Suchen von Elementen 2.2.9.5 Typsichere Datenstrukturen 3 Algorithmen und Datenstrukturen 3. Algorithmen 3.1 Ausgesuchte algorithmische Probleme 3.1.1 3.1.1.1 Spezielle Sortieralgorithmen Interne Sortierverfahren Quicksort Heap-Sort Sortieren durch Mischen 3.1.1.2 Externe Sortierverfahren 3.1.1.2.1 Direktes Mischen 1. 2-Wege-Mischsortieren 2. Mehrwege-Mischsortieren 3. Mehrphasen-Mischsortieren 3.1.1.2.2 Natürliches Mischen 3.1.2 Suche in Texten 3.1.2.1 Ein einfacher Algorithmus zum Suchen in Zeichenfolgen 1. Das naive Verfahren zur Textsuche 2. Mustererkennung über den Vergleich des ersten und letzten Zeichens 3.1.2.2 Das Verfahren von Knith-Morris-Pratt 3.1.2.3 Das Verfahren von Boyer-Moore 3.2 Entwurfstechniken von Algorithmen 3.2.1 3.2.1.1 3.2.1.2 3.2.2 3.2.3 Greedy-Algorithmen Ein einfaches Planungsproblem Huffman-Codes Divide and Conquer Dynamisches Programmieren 3.4 Rekursive Algorithmen 3.3.1 3.3.2 Prinzip der Rekursion an Beispielen Rekursive Kurven 3.4 Backtracking-Algorithmen 4. Bäume 4.1 Grundlagen 4.1.1 4.1.2 4.1.3 4.1.4 Grundbegriffe und Definitionen Darstellung von Bäumen Berechnungsgrundlagen Klassifizierung von Bäumen 4 Algorithmen und Datenstrukturen 4.2 Freie binäre Intervallbäume 4.2.1 Ordnungsrelation, Suchaufwand und Darstellung 4.2.2 Operationen 1. Generieren a) Erzeugen eines binären Suchbaums in Pascal b) Erzeugen von Binärbaumknoten bzw. eines binären Baums in C++ 2. Suchen und Einfügen a) Implementierung in Pascal b) Implementierung in C++ 3. Löschen von Knoten 4.2.3 Ordnungen und Durchlaufprinzipien a) Implementierung in Pascal b) Funktionsschablonen für das Durchlaufen binärer Bäume in C++ 4.2.4 Fädelung 4.3 Balancierte Bäume 4.3.1 Statisch optimierte Bäume 4.3.2 AVL-Baum 4.3.3 Splay-Bäume 4.3.4 Rot-Schwarz-Bäume 4.3.5 AA-Bäume 4.4 Die Bayer-Baum-Familie 4.4.1 Grundlagen und Definitionen 4.4.1.1 Ausgeglichene T-äre Bäume 4.4.1.2 (a,b)-Bäume 4.4.2 Darstellung 4.4.3 Suchen eines Schlüssels 4.4.4 Einfügen 4.4.5 Löschen 4.4.6 Auf Externspeichern mit Direktzugriff gespeicherte Bayer-Bäume 4.5 Alphabetische Suchbäume und mehrdimensionale Suchbäume 5. Graphenalgorithmen 5.1 Graphen 5.1.1 Gerichteter Graph 5.1.2 Ungerichteter Graph 5.2 Kürzeste Pfade 5.2.1 Grundlagen 5.2.2 Dijkstra´s Algorithmus 5 Algorithmen und Datenstrukturen 5.3 Minimale Spannbäume 5.2.1 Grundlagen 5.2.2 Kruskal’s Algorithmus 5.4 Fluß in Netzwerken 6 Algorithmen und Datenstrukturen Prof. Jürgen Sauer Algorithmen und Datenstrukturen Übungsblätter zur Vorlesung im WS 2001 / 2002 7 Algorithmen und Datenstrukturen 1. Übungsblatt: Bearbeiten binärer Baumknoten in Java1 2. Übungsblatt: Bearbeitung binärer Suchbaumknoten2 3. Übungsblatt: Implementierung eines binären Suchbaums für Comparable-Objekte3 4. Übungsblatt: Die generische Klasse „AVL-Baum“ in Java4 5. Übungsblatt: Perfekt ausgeglichene binäre Bäume, statisch optimierte Bäume5 6. Übungsblatt: Rot-Schwarz-Bäume6 7. Übungsblatt: AA-Bäume7 8. Übungsblatt: Splay-Baum8 9. Übungsblatt: Bayer-Baum9 10. Übungsblatt: Auf Platte / Diskette gespeicherte Bayer-Bäume10 11. Übungsblatt: Hash-Coding11 12. Übungsblatt: Binary Heap12 13. Übungsblatt: Binomial Heap, Fibonacci Heap 14. Übungsblatt: Fibonacci-Heap, Priority-Queue 15. Übungsblatt: Backtracking-Algorithmen13 1 pr42000 pr42000 3 pr42000 4 pr43210 5 pr43205 6 pr43220 7 pr43225 8 pr43215 9 pr44200 10 pr44_2 11 pr22141, pr22142 12 pr13228 13 pr32410 2 8 Algorithmen und Datenstrukturen Prof. Jürgen Sauer Algorithmen und Datenstrukturen Aufgabenblätter zur Vorlesung im WS 2001 / 2002 9 Algorithmen und Datenstrukturen 1. Aufgabenblatt: Binäre Suchbäume (PBB, AVL-Baum, Rot-Schwarz-Baum, AA-Baum, Splay-Baum) 2. Aufgabenblatt: Bayer-Baum 3. Aufgabenblatt: Nichtrekursiver Quicksort 4. Aufgabenblatt: Heap-Sort 5. Aufgabenblatt: Hash-Coding 6. Aufgabenblatt: Berechnung kürzester Pfade, Minimal spannender Baum 7. Aufgabenblatt: Doppelt verkette, ringförmig geschlossene Liste 8. Aufgabenblatt: Topologisches Sortieren 9. Aufgabenblatt: Josephus-Problem 10. Aufgabenblatt: 10