Andreas Solymosi Ulrich Grude Grundkurs Algorithmen und Datenstrukturen Aushildung und Studium Die Bücher der Reihe .Ausbildung und Studium" bieten praxisorientierte Einfüh rungen für die Aus-und Weiterbildung sowie Bausteine für ein erfolgreiches berufs qualifizierendes Studium. Unter anderem sind erschienen: Turbo Pa.cal W.gw.I• •r für Grundkurs JAVA Au.blldung und Studium von Dietmar Abts von Ekkehard Kaier PLII für Work.tatlon. D.lphl E• ••n tlal. von Eberhard Sturm von Ekkehard Kaier Aufbaukurs Wirtschafts-. Wlrtschaft.math.matlk mit Informatik d.m Comput.r von Dietmar Abts und Wilhelm Mülder von Hans Benker Onllne-Publl.hlng für Stud.nt.n Dat.nbank-Englneering und WI •••n .chaftl.r von Alfred Moos und Gerhard Daues von Michael Beißwenger VI.ual Ba.lc Essential. VI.ual Ba.lc für von Ekkehard Kaier technl.ch. Anw.ndung.n von Jürgen Radel Exc.1 für Betri.b.wlrt. von Robert lIorvat Theori. und Praxl. und Kambiz Koo haki relatlonal.r Dat.nbank.n von Rene Steiner Praktl.ch. Syst.mprogramml.rung Obj.ktori.ntl.rt. von Helmut Weber Programml.rung In JAVA von Olto Rauh Ing.nl.urmath.matlk mit Comput.ralg.bra-Sy.t.m.n Grundkurs Wirtschafts-. von Hans Benker Informatik von Dietmar Abts und Wilhelm Mülder Exc.1 für Technlk.r und Ing.nl.ur. Manag.m.nt von von Hans-] ü rgen Holland G• •c häftsproz. ...n und Uwe Bernhardt von Andreas Gadatsch Kost.nst.ll.nrechnung Effektiv Programml.r.n mit SAPS R/3- InCundC++ von Franz Klenger und Ellen Falk von Dielmar Herrmann Kalms SOL mit Oracl. OBERON von Wolf-Michael Kähler \on B. Marincek, I.L. Marais Modul., Kla ••e n, V.rträg. und E. Zeller von Karlheinz Hug Studl.nführ.r Grundkurs Wlrtschaft.lnformatlk B.tri.b.wlrtschaftslehre von Peter Mertens, Peter Chamoni, von otger Carl, RudolFF iedler, Dieter Ehrenberg, Joachim Griese, William J6rasz und Manfred Kiesel LUlll. Heinrich und Karl Kurbel (IIrsg.) Grundkur. Algorithmen Einführung In UNIX und Dat.n.trukturen von Werner Brecht von Andreas Solymosi und Ulrich Grude Vieweg Anreas Solymosi Ulrich Grude Grundkurs Algorithmen und Datenstrukturen Eine Einführung in die praktische Informatik mit Java 2., überarbeitete und erweiterte Auflage IJ vleweg Die Deutsche Bibliothek - CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich. 1. Auflage August 2000 2., überarbeitete und erweiterte Auflage August 2001 Alle Rechte vorbehalten © Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, BraunschweigiWiesbaden, 2001 Der Verlag Vieweg ist ein Unternehmen der Fachverlagsgruppe BertelsmannSpringer. www.vieweg.de [email protected] Das Werk einschließlich aller seiner Teile ist urheberrechtlich ge schützt. Jede Verwertung außerhalb der engen Grenzen des Ur heberrechtsgesetzes ist ohne Zustimmung des Verlags unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Über setzungen, Mikroverfilmungen und die Einspeicherung und Ver arbeitung in elektronischen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Konzeption und Layout des Umschlags: Ulrike Weigel, www.CorporateDesignGroup.de Gedruckt auf säurefreiem Papier ISBN 978-3-528-15743-2 ISBN 978-3-322-94293-7 (eBook) DOI 10.1007/978-3-322-94293-7 v Vorwort zur 2. Auflage Autoren und Verlag haben offenbar richtig erkannt, dass Java an Schulen und Hochschulen zunehmend als Unterrichtssprache eingesetzt wird und dass moderne, praxisorientierte Lehrbücher zum Thema "Algorithmen und Daten strukturen" Mangelware sind. Dies zeigt sich auch im Erfolg der 1. Auflage. Die zugesandten Kommentare, Bemerkungen und Korrekturhinweise schei nen ebenfalls zu bestätigen: Immer mehr Lehrer und Hochschullehrer setzen das Buch in ihren Lehrveranstaltungen ein; neben seiner "klassischen" Aus wahl von Themen werden die Algorithmen verständlich erläutert, ohne einen höheren Anspruch auf mathematisch orientierte Beweisführung. In der 2. Auflage wurden die dankend entgegengenommenen Korrekturhin weise eingearbeitet sowie die Druckqualität verbessert. Auch der Online Service wurde aktualisiert, um die im Buch vorgestellten Programme von der angegebenen Internet-Adresse http://www.tfh-berlin.de/-oo-plug/Ad einfach laden und ausführen zu können. VI Inhaltsverzeichnis Inhaltsverzeichnis Inhaltsverzeichnis V Einleitung X Danksagungen XII 1. Begriffsbildung 1 1.1. Algorithmus 1 1.2. Komplexität 4 1.3. Verbrauch und Komplexität 5 2. Gleichwertige Lösungen 8 2.1. Maximale Teilsumme 8 2.1.1. Summen und Teilsummen 8 2.1.2. Aufgabenstellung 9 2.1.3. Intuitive Lösung 9 2.1.4. Zeitkomplexität der Lösung 10 2.1.5. Zeit für Raum 12 2.1.6. Teile und herrsche 14 2.1.7. Die optimale Lösung 17 2.1.8. Messergebnisse 18 2.1.9. Gleichwertigkeit von Algorithmen 20 2.2. Komplexitätsformel 21 2.3. Datenstrukturen 22 2.3.1. Reihungen 23 2.3.2. Verkettete Listen 24 2.3.3. Gleichwertigkeit von Datenstrukturen 27 3. Rekursion und Wiederholung 30 3.1. Rekursive Algorithmen 30 3.1.1. Fakultät 30 3.1.2. Die Fibonacci-Zahlen 31 3.1.3. Die Ackermann-Funktion 34 3.1.4. Die mathematische Induktion 34 3.1.5. Permutationen 37 3.2. Abarbeitung von Datenstrukturen 38 3.2.1. Iterative Abarbeitung von rekursiven Datenstrukturen 38 3.2.2. Rekursive Abarbeitung von rekursiven Datenstrukturen 39 3.2.3. Rekursive Abarbeitung von Reihungen 40 3.3. Rekursive Kurven 42 3.3.1. Schneeflockenkurve 43 Inhaltsverzeichnis VII 3.3.2. Die Pfeilspitzenkurve 45 3.3.3. Die Hilbert-Kurve 47 3.3.4. Ersetzen der Rekursion durch Wiederholung 50 3.4. Zurückverfolgung 52 3.4.1. Labyrinth 53 3.4.2. Der Weg des Springers 53 3.4.3. Die acht Damen 56 3.5. Spracherkennung 60 3.5.1. Sprachen und Grammatiken 60 3.5.2. Reguläre Ausdrücke 61 3.5.3. Reguläre Grammatiken 63 3.5.4. R-Grammatiken 64 3.5.5. Endliche Automaten 66 3.5.6. Kellerautomaten 69 3.5.7. Endlichkeit und Unendlichkeit 71 4. Suchen 72 4.1. Textsuche 72 4.2. Suchen in Sammlungen 76 4.3. Suchen in einer Reihung 77 4.3.1. Suchen in einer unsortierten Reihung 77 4.3.2. Lineares Suchen in einer sortierten Reihung 79 4.3.3. Binäres Suchen 80 4.4. Hash-Tabellen 81 4.5. Suchen in einer verketteten Liste 86 4.5.1. Lineares Suchen in einer unsortierten Liste 87 4.5.2. Lineares Suchen in einer sortierten Liste 87 4.6. Zeitkomplexitäten beim Suchen 88 5. Sortierverfahren 91 5.1. Die Problemstellung 91 5.1.1. Präzisierung des Problems und Grundbegriffe 92 5.1.2. Zeitbedarf und Zeitkomplexität 94 5.2. Quadratische Sortierverfahren 95 5.2.1. Sortieren durch Vertauschen benachbarter Elemente 95 5.2.2. Sortieren durch Einfügen 97 5.2.3. Sortieren durch Auswählen 99 5.3. Unterquadratische Verfahren 100 5.4. Rekursive Verfahren 102 5.5. Logarithmische Verfahren 105 5.5.1. Halde 105 5.5.2. Die Haldenbedingung 106 5.5.3. Senken 107 VIII Inhaltsverzeichnis 5.5.4. Zwei Phasen des Heap Sorts 108 5.5.5. Sortieren auf der Halde 108 5.6. Externe Sortierverfahren 111 5.6.1. Mischen 111 5.6.2. Sortierkanal 113 5.6.3. Mischkanal 114 5.6.4. Fibonacci-Mischen 115 6. Baumstrukturen 118 6.1. Binärbaum 118 6.1.1. Definition 118 6.1.2. Suchen im sortierten Binärbaum 121 6.1.3. Darstellung von Binärbäumen 122 6.2. Sortieren mit Binärbäumen 124 6.2.1. Binärbaum als Halde 124 6.2.2. Senken im Binärbaum 125 6.2.3. Baumsort 127 6.2.4. Durchwandern eines Binärbaums 129 6.3. Operationen für Binärbäume 132 6.3.1. Binärbaum aus Knoten 132 6.3.2. Eintragen in einen sortierten Binärbaum 132 6.3.3. Löschen in Binärbäumen 134 6.4. Ausgeglichene Bäume 137 6.4.1. Eintragen in ausgeglichene Bäume 138 6.4.2. Löschen in ausgeglichenen Bäumen 142 6.5. 2-3-4-Bäume 144 6.5.1. Definition 144 6.5.2. Spalten 145 6.5.3. Einfügen 147 6.6. Rot-Schwarz-Bäume 149 6.7. B-Bäume 155 7. Klassen von Algorithmen 158 7.1. Was ist ein algorithmisches Problem? 158 7.2. Theoretische Lösbarkeit von Problemen 163 7.2.1. Definitionen 163 7.2.2. Beispiele 164 7.2.3. Das Halteproblem 167 7.2.4. Das Kachelproblem 168 7.2.5. Das Paligrammproblem 170 7.2.6. Gleichwertigkeit von Grammatiken 172 7.3. Praktische Lösbarkeit von Problemen 173 7.3.1. Das zweite Kachelproblem 174 Inhaltsverzeichnis IX 7.3.2. Das Rucksackproblem 175 7.3.3. Das Aufteilungsproblem 175 7.3.4. Das Problem des Handelsreisenden 176 7.3.5. Hamiltonsche Wege durch einen Graphen 176 7.3.6. Das Erfüllbarkeitsproblem 177 7.4. Die Klassen ':p und ~':p 178 7.5. Ist':p = ;)1':p? 180 7.6. Übersicht über Problemklassen 181 Literaturverzeichnis 182 Empfehlungen 183 Programmverzeichnis 185 Abbildungs-und Tabellenverzeichnis 187 Sachwortverzeichnis 190 x Einleitung Das Fach "Algorithmen und Datenstrukturen" deckt "klassische Themen" der Ausbildung von Informatikern ab. Es gibt viele Lehrbücher, die klassische Algorithmen (wie Sortierverfahren usw.) und klassische Datenstrukturen (wie Reihungen', verkettete Listen, Bäume usw.) mehr oder weniger verständlich vorstellen. Die meisten - insbesondere die besten - von ihnen wurden vor einiger Zeit geschrieben, deswegen verwenden sie typischerweise auch eine "klassische" Programmiersprache (wie Algol, Pascal, C o.ä.). Java gehört dieser Reihe der Sprachen nicht an. Sie ist aber diejenige Pro grammiersprache, deren Wachstumsrate an Popularität wahrscheinlich alle anderen übertrifft. Dies hat im Wesentlichen zwei Gründe: • die Plattformunabhängigkeit, die ihre Verwendung im Internet ermöglicht • die Objektorientierung, die moderne Programmentwicklungstechniken und -paradigmen unterstützt. Java wird sogar zunehmend als erste Unterrichtssprache verwendet, auch in den Informatikstudiengängen an der Technischen Fachhochschule Berlin. So gibt es immer mehr Studenten, die noch keine andere Programmiersprache beherrschen. Um ihnen Algorithmen und Datenstrukturen unterrichten zu können, wurde dieses Lehrbuch entwickelt. Es wendet sich an folgende Zielgruppen: • Studenten von Informatikstudiengängen • Schüler mit Leistungskurs Informatik • Auszubildende in IT-Berufen mit Schwerpunkt Software • Programmierer und • Interessierte an anspruchsvollen Algorithmen Es ist geeignet sowohl als Lehrmaterial für Vorlesungen und Kurse wie auch fürs Selbststudium. Der Leser sollte möglichst die folgenden Voraussetzungen erfüllen: • Erfahrung im Erstellen einfacherer Programme • Kenntnisse der Programmiersprache Java • insbesondere die Behandlung von Reihungen und Datenstrukturen, I die durch Referenzen (Zeiger) miteinander verkettet sind • nicht aber die Standardbibliotheken (nur rudimentär) Felder, arrays I