Springer-Lehrbuch Springer Berlin Heidelberg New York Barcelona Budapest Hongkong London Mailand Paris Santa Clara Singapur Tokio Manfred Broy Informatik Eine grundlegende Einführung Teil IV. Theoretische Informatik, Algorithmen und Datenstrukturen, Logikprogrammierung, Objektorientierung Springer Professor Dr. Manfred Broy Institut für Informatik Technische Universität München Arcisstraße 21 D-80333 München Die Deutsche Bibliothek -CIP-Einheitsaufnahme Broy, Manfred: Informatik: eine grundlegende EinführunglManfred Broy. -Berlin; Heidelberg; New York; Bercelona; Budapest; Hong Kong; London; Mailand; Paris; Tokyo: Springer (Springer-Lehrbuch) Teil 4. Theoretische Informatik, Algorithmen und Datenstrukturen, Logik programmierung, Objektorientierung. - 1995 ISBN 3-540-58602-4 eR-Klassifikation (1991): A.1, FA, F.1-2, E.1, D.1 ISBN-13 :978-3-540-58602-9 e-ISBN-13 :978-3-642-97613-1 DOI: 10.1007/978-3-642-97613-1 Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbe sondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Verviel fältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Straf bestimmungen des Urheberrechtsgesetzes. © Springer-Verlag Berlin Heidelberg 1995 Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, daß solche Namen im Sinne der Warenzeichen-und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedertnann benutzt werden dürften. Satz: Reproduktionsfertige Autorenvorlage Umschlaggestaltung: Atelier Struve & Partner, Heidelberg SPIN 10485862 45/3142 -543 2 1 0 - Gedruckt auf säurefreiem Papier Vorwort Dieser Teil IV der Einführung in die Informatik behandelt grundlegende Fragestellun gen der Theoretischen Informatik, eine Reihe komplexer Algorithmen und effizienter Datenstrukturen sowie einige verbreitete aktuelle Programmierstile. Damit greift Teil IV Fragen systematisch wieder auf, die wir in den Teilen I-rn bereits angesprochen haben. Die behandelten Fragestellungen der Theoretischen Informatik umfassen die Dar stellung und Klassifizierung formaler Sprachen in der Chomsky-Hierarchie und die Begriffe Berechenbarkeit und Komplexität. Die Komplexität von Problemstellungen und von Algorithmen ist ein Maß für den Aufwand, mit dem eine bestimmte Aufgabe gelöst oder ein Algorithmus ausgeführt werden kann. An die ersten drei Kapitel zur Theoretischen Informatik schließt ein Kapitel über die Komplexität von Sortier algorithmen und ausgewählte effIziente Datenstrukturen an. Besonderes Gewicht wird auf Datenstrukturen für die Speicherung großer Datenmengen gelegt. Dazu werden geeignete Baumstrukturen behandelt, ergänzend zur allgemeinen Behandlung von Bäumen in Teil I. Es wird die Streuspeichertechnik beschrieben (engl. hashing), die ebenfalls die Speicherung großer Datenmengen und den effizienten Zugriff darauf er laubt. Im Anschluß daran werden einige in der Praxis verwendete Programmierstile dar gestellt, die jeder Informatiker zumindest kennen sollte. Dies umfaßt die Beschreibung von Rechenstrukturen, die Datenmodellierung, die logische und die objektorientierte Programmierung. Außerdem werden die wichtigsten Begriffe aus dem Gebiet der Da tenbanken eingeführt. Für die Datenmodellierung wird die EntitätslRelationen-Model lierung besprochen (engl. Entity-Relationship Modeling), die nicht nur für den Ent wurf von Datenbanken von großem Interesse ist, sondern auch als eine der wich tigsten Modellierungstechniken im Software-Entwurf weite Verbreitung gefunden hat. Dieser IV. Teil schließt die Einführung in die Informatik ab und ergänzt noch eine Reihe von wichtigen Punkten. Wie in den vorangehenden drei Teilen wird auch hier größter Wert auf saubere Begriffsbildung und genaue mathematische Behandlung der besprochenen Konzepte gelegt. Die vier Teile sind so angelegt, daß Studenten in ihrem Grundstudium einen umfassenden Überblick über alle Hauptgebiete der Informatik bekommen und danach die relevanten Begriffe nicht nur gehört, sondern auch verstanden haben. Die "Einführung in die Informatik" hat, wie bereits im Vorwort zu Teil I erwähnt, ihre Wurzeln in einer Vorlesung, die ich erstmals im Sommer 1983 an der Universität Passau und danach mehrfach in jeweils modifIzierter und überarbeiteter Form an der VI Vorwort Universität Passau und an der Technischen Universität München gehalten habe, zum letzten Mal von Wintersemester 1993/94 bis Sommersemester 1995. Die Stoffauswahl wurde durch Diskussionen mit meinen Kollegen an der Technischen Universität München stark beeinflußt. Zu Dank bin ich dafür Prof. Rudolf Bayer, Ph.D., Prof. Dr. Jürgen Eickel und Prof. Dr.-Ing. H.-J. Siegert verpflichtet. Besonderen Dank schulde ich meinem verehrten Lehrer und Vorgänger Prof. Dr. Dr. h.c. mult. F.L. Bauer. Ohne sein richtungsweisendes Einführungsbuch (Bauer/Goos) aus dem Jahre 1970 wäre meine Einführung in dieser Form nicht möglich gewesen. Danken möchte ich aber auch meinen Studenten und Studentinnen, die durch zahlreiche kritische und konstruktive Diskussionen und Vorschläge die Vorlesung mitgestaltet haben. Stellvertretend für viele möchte ich Herrn Ingolf Krüger erwähnen und dessen große Sorgfalt beim Korrekturlesen anerkennend hervorheben. Dank gilt auch meinen Mitarbeiterinnen und Mitarbeitern Michael Breu, Max Fuchs, Radu Grosu, Rudi Hettler, Ursula Hinkel, Franz Huber, Heinrich Hußmann, Comel Klein, Olaf Müller, Dieter Nazareth, Friederike Nickl, Barbara Paech, Peter Padawitz, Thomas Pinegger, Christian Prehofer, Cornelia Pusch, Franz Regensburger, Bernhard Rumpe, Birgit Schieder und Oskar Slotosch für hilfreiche Vorschläge. Gerade durch diese Rückkopplung hat mir die Vorlesung immer großen Spaß bereitet. Ich danke auch dem Springer-Verlag, vor allem Dr. Hans Wössner, für die hervor ragende Unterstützung. Beim Studium dieser Einführung in die Informatik sollte der Leser/die Leserin beachten, daß das hier vermittelte Fundament trotz der teilweise explosiven Ent wicklungen in einigen Gebieten der Informatik relativ stabil und dauerhaft gültig bleibt und somit die Mühe, es sich zu erarbeiten, nicht umsonst ist. München, Juli 1995 Manfred Broy Inhaltsverzeichnis 1. Formale Sprachen ..................................... . 1 1.1 Relationen und Graphen ................................... . 2 1.1.1 Zweistellige Relationen .................................... . 2 1.1.2 Wege in Graphen und Hüllenbildung ......................... . 6 1.2 Grammatiken ............................................ . 13 1.2.1 Reduktive und generative Grammatiken ....................... . 18 1.2.2 Die Sprachhierarchie nach Chomsky .......................... . 22 1.2.3 Strukturgraphen und Strukturbäume .......................... . 23 1.2.4 Sackgassen und unendliche Ableitungspfade ................... . 29 1.3 Chomsky-3-Sprachen und endliche Automaten ................. . 34 1.3.1 Reguläre Ausdrücke ...................................... . 34 1.3.2 Endliche Automaten ...................................... . 36 1.3.3 Äquivalenz der Darstellungsformen .......................... . 39 1.3.4 Reguläre Ausdrücke, endliche Automaten und Chomsky-3-Sprachen . 42 1.3.5 Minimale Automaten ...................................... . 50 1.4 Kontextfreie Sprachen und Kellerautomaten .................... . 52 1.4.1 Die BNF-Notation ........................................ . 52 1.4.2 Kellerautomaten ......................................... . 53 1.4.3 Kellerautomaten und kontextfreie Sprachen .................... . 56 1.4.4 Greibach-Normalform ..................................... . 59 1.4.5 LR(k)-Sprachen ......................................... . 61 1.4.6 LL(k)-Grammatiken ...................................... . 66 1.4.7 Das Verfahren des rekursiven Abstiegs ........................ . 69 1.5 Kontextsensitive Grammatiken .............................. . 70 2. Berechenbarkeit ....................................... . 73 2.1 Hypothetische Maschinen .................................. . 75 2.1.1 Die Turing-Maschine ...................................... . 75 2.1.2 Registermaschinen ....................................... . 82 2.2 Rekursive Funktionen ..................................... . 84 2.2.1 Primitiv rekursive Funktionen ............................... . 85 2.2.2 f.1-rekursive Funktionen .................................... . 91 2.2.3 Allgemein rekursive Funktionen ........................ . 94 2.3 Äquivalenz der Berechenbarkeitsbegriffe ...................... . 98 VIII Inhaltsverzeichnis 2.3.1 Äquivalenz von Il-Berechenbarkeit und Turing-Berechenbarkeit 98 2.3.2 Äquivalenz von RM-und Turing-Berechenbarkeit ............... . 100 2.3.3 Die Churchsche These ..................................... . 102 2.4 Entscheidbarkeit ......................................... . 103 2.4.1 Nichtberechenbare Funktion ................................ . 103 2.4.2 Entscheidbare Prädikate .................................... . 104 2.4.3 Rekursive und rekursivaufzählbare Mengen .................... . 106 3. Komplexitätstheorie ................................... . 109 3.1 Komplexitätsmaße ........................................ . 109 3.1.1 Zeitkomplexität .......................................... . 109 3.1.2 Bandkomplexität ......................................... . 111 3.1.3 Zeit-und Bandkomplexität von Problemen ..................... . 113 3.1.4 Polynomiale und nichtdeterministisch polynomiale Zeitkomplexität .. . 117 3.1.5 Backtracking-Nichtdeterminismus in Programmiersprachen ........ . 118 3.2 NP-Vollständigkeit ....................................... . 122 3.2.1 Das Erfüllbarkeitsproblem für Boolesche Ausdrücke ............. . 123 3.2.2 Weitere NP-vollständige Probleme ........................... . 125 3.3 Effiziente Algorithmen für NP-vollständige Probleme ............ . 126 3.3.1 Geschicktes Durchsuchen großer Baumstrukturen ............... . 128 3.3.2 Alpha/Beta-Suche ........................................ . 130 3.3.3 Dynamisches Programmieren ............................... . 135 3.3.4 Greedy-Algorithmen ...................................... . 136 4. Effiziente Algorithmen und Datenstrukturen ............. . 139 4.1 Ausgewählte Algorithmen .................................. . 139 4.1.1 Komplexität von Sortieralgorithmen .......................... . 140 4.1.2 Wege in Graphen ......................................... . 142 4.2 Bäume ................................................. . 144 4.2.1 Geordnete, orientierte und sortierte Bäume ..................... . 145 4.2.2 Darstellung von Bäumen durch Felder ........................ . 146 4.2.3· AVL-Bäume ..... _. ...................................... . 147 4.2.4 B-Bäume ............................................... . 148 4.3 Effiziente Darstellung von Mengen ........................... . 148 4.3.1 Die Rechenstruktur der Mengen mit Zugriff über Schlüssel ........ . 149 4.3.2 Mengendarstellung durch A VL-Bäume ........................ . 150 4.3.3 Streuspeicherverfahren .................................... . 158 5. Beschreibungstechniken in der Programmierung ......... . 163 5.1 Formalismen für die Spezifikation ............................ . 163 5.1.1 Abstraktion in der Spezifikation ............................. . 163 5.1.2 Die Spezifikation von abstrakten Rechenstrukturen ............... . 165 5.1.3 Spezifikation von Funktionen ............................... . 168 Inhaltsverzeichnis IX 5.1.4 Speziftkation von Anweisungen ............................. . 169 5.2 Datenbanken und Infonnationssysteme ........................ . 172 5.2.1 Die Entitäts/Relationsbeziehungsmodellierung .................. . 172 5.2.2 Entitäts/Relations-Diagramme ............................... . 176 5.2.3 Charakterisierung von Relationen ............................ . 176 5.2.4 Zur Verwendung von Datenbanksystemen ..................... . 177 5.2.5 Das DB-Managementsystem ................................ . 177 5.2.6 Datenbankabfragen und Ändern der Datenbestände .............. . 177 5.3 Logikprogranunierung .................................... . 178 5.3.1 Eine Problemlösung mit Logikprogramm ...................... . 179 5.3.2 Die Auswertung von Logikprogrammen ....................... . 181 5.3.3 Uniftkation ............................................. . 184 5.4. Objektorientierte Progranunierung ........................... . 187 6. Abschließende Bemerkungen zur Informatik ............. . 197 6.1 Anwendungen der Infonnatik ............................... . 198 6.2 Infonnatik und Recht ..................................... . 200 6.3 Soziale Kompetenz der Infonnatiker .......................... . 201 6.4 Infonnatik und Ökonomie .................................. . 202 6.5 Informatik. Wissenschaftstheorie und Philosophie ............... . 202 6.6 Zur Verantwortung des Informatikers ......................... . 203 Literaturangaben .............................................. 205 Stichwortverzeichnis .......................................... 211 1. Formale Sprachen Eine formale Sprache ist eine Menge von Wörtern über einem Zeichensatz. In vielen Gebieten der Informatik treten formale Sprachen auf. Wir haben in Teil I bereits die BNF-Schreibweise zur Beschreibung von formalen Sprachen kennengelernt. Die BNF-Schreibweise verwenden wir insbesondere zur Beschreibung der Syntax von Programmiersprachen. In diesem Kapitel behandeln wir die theoretischen Grundlagen und die unterschiedlichen Techniken zur Beschreibung formaler Sprachen systema tisch. Die Syntax einer Programmiersprache ist durch eine formale Sprache festgelegt. Eine Zeichenfolge heißt Programm, wenn sie Element der Sprache ist. Allerdings ist bei der syntaktischen Behandlung von Programmiersprachen nicht nur die Frage von Interesse, ob eine gegebene Zeichenfolge ein syntaktisch korrektes Programm dar stellt, sondern auch, wie das Programm durch Vorgruppierer und Zerteiler in eine Baumdarstellung übergeführt werden kann, die die innere Struktur des Programms explizit macht. Formale Sprachen lassen sich, wie die BNF-Notation zeigt, durch Ableitungsre geln beschreiben, die festlegen, wie die Wörter der Sprache aufgebaut sind. Durch die Regeln wird eine Struktur auf den Wörtern des Sprachschatzes induziert. Diese Struktur wird beim Zerteilvorgang durch den Parser (vgl. Teil m, Kapitel 3) verwen det, um die abstrakte Syntax eines Programms zu spezifizieren. BNF-Regeln beschreiben die meist unendliche Menge von Wörtern, die eine for male Sprache bilden. Eine Zeichenfolge gehört zum Sprachschatz der BNF-Beschrei bung, wenn sie durch Anwendung der Regeln aus dem entsprechenden Nichtterminalzeichen abgeleitet werden kann. Gleichzeitig kann die Regelanwendung zur Erzeugung des Zerteilbaums des Programms verwendet werden. Die Zerteilung ergibt sich aus der Struktur der Regelanwendung. Die Kompliziertheit des Aufbaus der Wörter einer formalen Sprache läßt sich an der Kompliziertheit beziehungsweise an der Einfachheit der Regeln ermessen, durch die die Sprache beschrieben werden kann. Wie sich zeigt, lassen sich eine Reihe ein facher Klassen von Sprachen über die äußere Form der sie beschreibenden Regeln definieren. Wir beginnen mit der Einführung einiger grundlegender Konzepte der Relationen algebra, die bei der Behandlung formaler Sprachen nützlich sind. Dann führen wir das Konzept der Grammatiken zur Beschreibung formaler Sprachen ein. Wir legen Klassen von Regeln fest und untersuchen ihre Mächtigkeit bezogen auf die durch sie beschreibbaren formalen Sprachen.