Inhalt der Vorlesung Daten Daten Literatur Pierre Fierz Pierre Fierz Einleitung Einleitung Datentypen Datentypen Abgeleitete Typen 1 Daten 2 Algorithmen 3 Sortieralgorithmen 4 Suchalgorithmen 5 Graphen 6 Verarbeitung von Strings 7 Typen von Algorithmen Abgeleitete Typen Weitere Datenstrukturen • M.T. Goodrich and R. Tamassia. Algorithm Design. John Wiley & Sons,Inc., New York, 2002. ISBN 0-471-38365-1. Der Abstrakte Datentyp (ADT) • Aho, Hopcroft, and Ullman. The Design and Analysis of Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Computer Algorithms. Addison Wesley, Reading, Massachusetts, 1974. ISBN 0-201-00029-6. • Robert Sedgewick. Algorithms in Java. Addison Wesley, 2002. ISBN 978-0-2013-6120-9.7 1.1 Bewertung 1.2 Daten Daten Pierre Fierz Pierre Fierz Chapter 1 Einleitung Einleitung Daten Datentypen Datentypen Abgeleitete Typen • Prüfung während des Semesters Dauer: 90 Minuten Hilfsmittel: Skript, Slides und eigene Notizen Gewicht: 25% • Schlussprüfung Dauer: 150 Minuten Hilfsmittel: Skript, Slides und eigene Notizen Gewicht: 75% Abgeleitete Typen Lecture Algorithmen & Datenstrukturen 29.08.2011 Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Pierre Fierz Berner Fachhochschule Technik und Informatik 1.3 1.4 Contents Daten Daten Outline Pierre Fierz Pierre Fierz Einleitung 1 Einleitung 2 Datentypen Einleitung 1 Einleitung Datentypen Datentypen Abgeleitete Typen Abgeleitete Typen Weitere Datenstrukturen Weitere Datenstrukturen 2 Datentypen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 3 Abgeleitete Typen 4 Weitere Datenstrukturen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 5 Der Abstrakte Datentyp (ADT) Der Abstrakte Datentyp (ADT) 1.5 Einleitung Daten 1.6 Daten Einleitung 2 Pierre Fierz • Der Digital-Computer wurde entwickelt, um komplexe und aufwendige Berechnungen durchzuführen. • Daher ist die Darstellung von Zahlen ideal. • Berechnungen werden direkt von der Hardware ausgeführt. Pierre Fierz Beispiel: Verschiedene Personendaten Einleitung Einleitung Datentypen Datentypen • Als Beispiel vergleichen wir die Personaldaten in einer Abgeleitete Typen Arbeitgeberkartei und in einer Arztkartei. Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Aufbau der Arbeitgeberkartei Name Adresse Funktion Gehalt Lohnentwicklung usw. • Bei vielen Applikationen steht aber das speichern von Daten im Vordergrund. • Wichtige Aufgabe der Informatik ist die Darstellung der Daten • Die Daten stellen eine Abstraktion der reallen Welt dar. Aufbau der Arztkartei Name Adresse Grösse Gewicht Krankengeschichte usw. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Unwichtige Daten werden weggelassen • Die Darstellung hängt von der Verwendung der Daten ab. • Das Objekt “Person” wird abstrahiert. 1.7 1.8 Daten Einleitung 3 Daten Einleitung 4 Pierre Fierz Pierre Fierz • Wir wollen das Problem der Darstellung am Beispiel von Zahlen betrachten • Bei der Abbildung der Welt in ein Datenmodell sind zwei Aspekte wichtig: Einleitung Einleitung Datentypen Beispiel: Technische Darstellung von Zahlen Abgeleitete Typen Abstraktion Im technisch-wissenschaftlichen Bereich werden von Zahlen folgende Eigenschaften verlangt: Weitere Datenstrukturen • Wichtige Daten eines Objekts identifizieren Der Abstrakte Datentyp (ADT) • Das Rechnen ist die Hauptoperation und muss möglichst • Für die Applikation unwesentliche Daten weglassen Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) effizient sein. • Abstraktion = Vereinfachung • Es werden sehr grosse und auch sehr kleine Zahlen benötigt. (Bereich ca. 10−40 bis 1040 ) Darstellung • Im allgemeinen genügt eine Genauigkeit von 10 bis 16 • Wahl der Darstellung eines Objektes im Computer signifikante Stellen zur Berechnung und Ausgabe der Resultate. • Schwierige Aufgabe. • Hängt von den Operationen (Algorithmen), die auf dem • Die Druckoperation ist viel seltener als die Objekt ausgeführt werden ab. Rechenoperationen. Diese Überlegungen legt die floating point-Darstellung nahe, die nachstehend erklärt ist. 1.9 Daten Einleitung 5 1.10 Daten Einleitung 6 Pierre Fierz Pierre Fierz Beispiel: Technische Darstellung von Zahlen 2 Vorzeichen Exponent Mantisse Beispiel: Technische Darstellung von Zahlen 3 Einleitung Datentypen • Vorzeichen ist ein Bit 0 = positiv 1 = negativ • Exponent (Basis 2) besteht aus 8 Bits (Zahl von 0 bis 255) • Tatsächlicher Exponent E = Exponent − 127 Einleitung Datentypen • Wir wollen dies noch an einem Zahlenbeispiel Abgeleitete Typen veranschaulichen Weitere Datenstrukturen Weitere Datenstrukturen • Wir möchten die Dezimalzahl −0.1 darstellen. Der Abstrakte Datentyp (ADT) Abgeleitete Typen Der Abstrakte Datentyp (ADT) • Das Vorzeichen ist also 1 • Ist der Exponent 0, so ist die Zahl 0. • 0.1 dual ergibt 0.00011001100 . . . • Mantisse besteht aus 23 bits und stellt einen • Normalisiert ergibt es 1.1001100 · 2−4 normalisierten Dualbruch dar. • Der Exponent ist also E = −4 + 127 = 123 binär • Normalisiert bedeutet, dass die erste signifikante Stelle 01111011 vor dem Komma steht. Vorzeichen 1 • Da die erste Stelle vor dem Komma immer 1 ist, wird sie in der Darstellung weggelassen. Exponent 01111011 Mantisse 10011001100110011001100 • Alles in einer Formel zusammengefasst: zahl = Vorzeichen · (2(Exponent−127) · 1.Mantisse) 1.11 1.12 Einleitung 7 Daten Daten Einleitung 8 Pierre Fierz Pierre Fierz • Wir wollen nun eine weitere Möglichkeit für die Darstellung Beispiel: Kommerzielle Darstellung von Zahlen 2 von Zahlen betrachten Beispiel: Kommerzielle Darstellung von Zahlen Einleitung Einleitung Datentypen Datentypen Abgeleitete Typen Im kommerziellen Bereich werden Zahlen vor allem zur Darstellung von Geldbeträgen verwendet. • Mit den Zahlen wird wenig gerechnet (meistens Additionen). n − m Vorkommastellen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) m Nachkommastellen Vorzeichen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • n und m sind vereinbarte Konstanten (z.B. 15 und 4) • Der Dezimalpunkt steht somit immer an der gleichen Stelle • Die Zahlen werden dezimal dargestellt je 4 Bit stellen eine • Die Zahlen werden sehr oft gedruckt. Dezimalstelle dar • Der benötigte Bereich ist viel kleiner als im technischen • Das Vorzeichen ist durch die letzten 4 Bits gegeben Bereich. • Als Beispiel stellen wir die Zahl 35.7310 dar. • Die Anzahl Stellen nach dem Komma kann fix vereinbart werden (z.B. 4 Stellen). • Die Zahlen müssen sowohl beim Rechnen wie auch in der 0000 | {z } . . . 0011 | {z } 0101 | {z } 0111 | {z } 0011 | {z } 0001 | {z } 0000 | {z } 0000 | {z } Ausgabe genau sein. 0 Diese Überlegungen legt die fix point-Darstellung nahe, die nachfolgend erklärt ist. 3 5 7 3 1 0 + 1.13 Einleitung 9 Daten 1.14 Einleitung 10 Pierre Fierz • Nun noch die Definition was wir unter Computer-Daten verstehen wollen. Definition Computer-Daten sind Objekte mit den drei folgenden Eigenschaften 1 2 3 Daten Pierre Fierz Einleitung Einleitung Beispiel: Computer-Daten Datentypen Abgeleitete Typen Datentypen Abgeleitete Typen Datenobjekt: "Müller" Bezeichnung: Familienname einer Person. Damit ist die Bedeutung des angegebenen Objekts festgelegt. Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Bezeichnung Die Bezeichnung trägt den semantischen Teil (Bedeutung) des Objektes (siehe auch Datentypen). Wertemenge Die Wertemenge legt alle möglichen Werte fest, die ein Objekt dieses Types annehmen kann. Die Wertemenge bestimmt somit die Syntax (Form) eines Objektes. Speicherplatz Der Speicherplatz lokalisiert das Objekt im Speicher und identifiziert dieses eindeutig. Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Wertemenge: Alle Folgen von maximal n alphabetischen Zeichen. Das erste Zeichen muss ein grosser Buchstabe sein. Damit ist die Form des Objektes festgelegt. Speicherplatz: Eine Adresse im Speicher, wo die gegebene Zeichenfolge beginnt. Dadurch ist das Objekt eindeutig identifiziert. 1.15 1.16 Einleitung 11 Daten Outline Pierre Fierz Einleitung Einleitung 1 Einleitung Datentypen Bemerkung: Syntax und Semantik Daten Pierre Fierz Datentypen Abgeleitete Typen Abgeleitete Typen Weitere Datenstrukturen Weitere Datenstrukturen 2 Datentypen Der Abstrakte Datentyp (ADT) In der Informatik wird die Semantik durch den Datentyp eines Objektes gegeben. Die Syntax (Wertemenge) ist im Prinzip durch die Anzahl reservierter Bits im Speicher gegeben. Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.17 Definition: Datentyp Daten 1.18 Definition: Datentyp 2 Pierre Fierz Daten Pierre Fierz • In der Mathematik werden Objekte nach wichtigen Eigenschaften geordnet man unterscheidet • • • • • einzelne Werte Mengen von Werten Funktionen Mengen von Funktionen usw. Einleitung Einleitung Datentypen • Wir wollen nun den Begriff Datentyp definieren Abgeleitete Typen Weitere Datenstrukturen Definition Der Abstrakte Datentyp (ADT) Der Datentyp bestimmt eine Menge von Werten, welche die Objekte dieses Typs annehmen können. Diese Menge bezeichnet man als Wertemenge des Datentyps. Die Elemente des Wertebereichs bezeichnet man auch als Konstanten des Datentyps. Der Datentyp bestimmt auch die Operatoren, welche auf die Objekte der Wertemenge definiert sind und somit auf Objekte dieses Typs angewandt werden können. • In der Informatik werden noch mehr Objekte unterschieden wie • • • • • • Zahlen Funktionen, Personaldaten, Wetterdaten, Rechnungen u.s.w. Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Es ist noch wichtiger als in der Mathematik diese Objekte zu ordnen • Objekte werden in Datentypen unterteilt 1.19 1.20 Definition: Datentyp 3 Daten Daten Atomare Datentypen Pierre Fierz • Einige Beispiele für Datentypen: • Ganze Zahlen (int) mit den Operatoren +, −, ∗, /, ≤, == usw. • Zeichenketten (strings) mit den Operatoren substring, concatenate usw. • Es ist auch möglich einen Datentyp zu definieren, indem alle möglichen Werte aufgezählt werden Pierre Fierz Einleitung Einleitung Datentypen Datentypen • Atomare Datentypen sind solche, die in einer Abgeleitete Typen Programmiersprache schon definiert sind. Weitere Datenstrukturen Weitere Datenstrukturen • Sie bilden die Basis des Typsystems der Sprache. Der Abstrakte Datentyp (ADT) Abgeleitete Typen Der Abstrakte Datentyp (ADT) • Durch Typkonstruktoren können aus den Atomaren Typen weitere Typen erzeugt werden. Beispiel: Enum-Typ • Welche atomaren Typen zur Verfügung stehen, hängt von In der Sprache Java etwa, können wir einen Farbentyp folgendermassen deklarieren. der gewählten Programmiersprache ab. • Im Folgenden stellen wir einige wichtige atomare Datentypen vor. public Enum Farbe {ROT, BLAU, GELB, GRÜN}; • Mit dieser Definition ist auch der Vergleichsoperator (equals) definiert. 1.21 Atomare Datentypen: Ganze Zahlen (INTEGER) Daten 1.22 Daten Atomare Datentypen: reelle Zahlen (REAL) Pierre Fierz Pierre Fierz • Der Datentyp REAL ist ein endliches Modell der reellen Zahlen R. • Die Elemente dieses Typs werden auch Maschinenzahlen Einleitung M genannt. • Jedes Element von REAL repräsentiert ein ganzes (offenes) Intervall der reellen Zahlen. • Dadurch wird die reelle Zahlenachse diskretisiert. • Diese Tatsache hat für das Rechnen mit REAL Zahlen wichtige Konsequenzen. Datentypen • Der Datentyp INTEGER umfasst ein um die Zahl Null symmetrisches Intervall der ganzen Zahlen. • In diesem Intervall sind die Zahlen genau darstellbar. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Die Operationen umfassen die üblichen arithmetischen Operationen +, −, ∗, / wobei / die ganzzahlige Division bezeichnet. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Die REALs auf der reellen Zahlenachse • Die Operationen sind bezüglich INTEGER nicht abgeschlossen (overflow). −max 0 Overflowbereich +max Overflowbereich Underflowbereich • Das Intervall der reellen Zahlen, das durch die REAL-Zahl 0 repräsentiert wird, heisst Underflow-Bereich 1.23 1.24 Daten Atomare Datentypen: Endliche Arithmetik Atomare Datentypen: Eigenschaften einer endliche Arithmetik Pierre Fierz • Die Wertemenge von M ist eine Untermenge der reellen • Wir haben schon gesehen, dass eine REAL-Zahl als Einleitung floatingpoint dargestellt werden Einleitung Zahlen. Datentypen (Exponent−127) Zahl = Vorzeichen · (2 · 1.Mantisse) endliche binäre Arithmetik. Datentypen M⊂R Abgeleitete Typen Abgeleitete Typen • Jeder Zahl x ∈ R ist eindeutig ein x̃ ∈ M zugeordnet, Weitere Datenstrukturen • Diese Darstellung der reellen Zahlen nennt man auch eine Daten Pierre Fierz welches als Repräsentant von x bezeichnet wird. Der Abstrakte Datentyp (ADT) • Jedes x̃ ∈ M repräsentiert alle Zahlen in einem Intervall Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) um x̃. • Die Grösse der Mantisse bestimmt die maximale Anzahl signifikanter Stellen einer Zahl. • Die reellen Zahlen 0 und 1 können in M exakt dargestellt werden. Es gilt: • Ist diese Anzahl z.B. 10, so spricht man von einer 0 = 0̃ und 1 = 1̃ 10-stelligen endlichen Arithmetik. • Bei einer Operation wird mit einer Stelle mehr gerechnet • Sind x, y ∈ M, dann ist das Resultat der Addition im und anschliessend das Resultat auf die Grösse der Mantisse gerundet. Allgemeinen nicht mehr in M. • Das Resultat muss auf das nächstliegende Element in M • Menge der Zahlen einer endlichen Arithmetik wollen wir gerundet werden. mit M bezeichnen. • Aus diesem Grund gelten nicht dieselben Gesetze wie in einer gewöhnlichen Arithmetik. 1.25 Atomare Datentypen: Eigenschaften einer endliche Arithmetik 2 • Das Assoziativgesetz der Addition gilt in einer endlichen Arithmetik im allgemeinen nicht: (x + y ) + z 6= x + (y + z) Daten 1.26 Atomare Datentypen: Eigenschaften einer endliche Arithmetik 3 • Das Distributivgesetz gilt in einer endlichen Arithmetik im Allgemeinen nicht: Pierre Fierz Einleitung x · (y + z) 6= (x · y ) + (x · z) Datentypen x = 9.100 y = 3.0 · 10 −4 Abgeleitete Typen Weitere Datenstrukturen Wir verwenden hier eine 4-Stellige dezimale endliche Arithmetik. z = 4.0 · 10 Der Abstrakte Datentyp (ADT) {z x = 2.000 y = 3.000 z = 3.000 · 10−4 x · (y + z) = 2.000 · (3.000 + 0.0003) = 6.000 | {z } gerundet=3.000 | gerundet=9.101 } (x · y ) + (x · z) = (2.000 · 3.000) + (2.000 · 0.0003) = 6.001 | {z } | {z } gerundet=6.000 gerundet=0.0007 {z {z gerundet=6.000 } x + (y + z) = 9.100 + (0.0003 + 0.0004) = 9.101 | {z } | Der Abstrakte Datentyp (ADT) −4 gerundet=9.100 gerundet=9.100 Weitere Datenstrukturen Beispiel: Distributivgesetz (x + y ) + z = (9.100 + 0.0003 +0.0004 = 9.100 | {z } | Einleitung Datentypen Abgeleitete Typen Beispiel: Assotiativgesetz der Addition Daten Pierre Fierz | } 1.27 gerundet=0.0006 {z gerundet=6.001 } 1.28 Atomare Datentypen: Absoluter und relativer Fehler Daten Atomare Datentypen: Numerische Auslöschung • Numerische Auslöschung ist ein spezieller Rundungsfehler. • Entsteht wenn zwei fast gleich grosse Zahlen voneinander subtrahiert werden. Pierre Fierz • Bei Operationen mit Zahlen aus M wird das Resultat gerundet. Einleitung • Dadurch entstehen Fehler im Resultat. Datentypen Abgeleitete Typen Sei x̃ eine Approximation der Zahl x so definieren wir den absoluten Fehler als Einleitung Datentypen Abgeleitete Typen Beispiel: Numerische Auslöschung Weitere Datenstrukturen Definition Daten Pierre Fierz Weitere Datenstrukturen • Wir betrachten die folgende Rechnung Der Abstrakte Datentyp (ADT) 0 Der Abstrakte Datentyp (ADT) −4 0 1.2345 · 10 − 1.2344 · 10 = 1.0000 · 10 |x − x̃| • Falls die Anfangsdaten verfälscht waren ist das exakte Resultat aber 1.xxxx. und den relativen Fehler als • Die Stellen xxxx sind dabei nicht bekannt |x − x̃| |x| • Der absolute Fehler liegt im Bereich 10−5 • Der relative Fehler liegt im Bereich 10−5 /10−4 = 10−1 • Der relative Fehler der Anfangsdaten ist 10−5 /1.2 · 100 ≈ 10−5 • Für die Fehlerrechnung ist vor allem der relative Fehler interessant • Der relative Fehler wird also um einen Faktor von 104 vergrössert. 1.29 Atomare Datentypen: Numerische Stabilität Daten 1.30 Atomare Datentypen: Numerische Stabilität 2 Pierre Fierz Daten Pierre Fierz Beispiel: Quadratische Gleichung nicht stabil • Wir betrachten Quadratische Gleichungen der Form Einleitung • Ein numerisch stabiler Algorithmus funktioniert auch in einer endlichen Arithmetik “richtig” • Unter “richtig” meint man dabei, dass die Rundungsfehler den Ablauf nicht zu sehr stören. Datentypen Einleitung Datentypen x 2 + px + q = 0 Abgeleitete Typen Weitere Datenstrukturen • Die übliche Formel zum Finden der beiden Lösungen Der Abstrakte Datentyp (ADT) lautet • Die folgende Definition von Stabilität stammt von Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) r p 2 −p ± −q 2 2 • Falls |p| |q| passiert bei der kleineren der beiden Lösungen numerische Auslöschung. x1,2 = Wilkinson: Definition Bei stabilen Algorithmen ist das vom Computer berechnete (durch Rundungsfehler verfälschte) Resultat, das exakte Resultat von leicht geänderten Anfangsdaten. • Dann gilt nämlich −p ≈ 2 r p 2 2 −q und es werden fast gleich grosse Zahlen voneinader subtrahiert. 1.31 1.32 Atomare Datentypen: Numerische Stabilität 3 Daten Atomare Datentypen: Numerische Stabilität 4 Pierre Fierz Beispiel: Quadratische Gleichung nicht stabil (Forts.) • Wir berechnen nun das folgende numeriche Beispiel x 2 + 108 x + 1 = 0 • Mit einer 7-stelligen Arithmetik und der obigen Formel Daten Pierre Fierz Beispiel: Quadratische Gleichung stabil Einleitung Einleitung • Um quadratische Gleichungen immer stabil zu berechnen Datentypen kann man den folgenden Algorithmus verwenden. Abgeleitete Typen Weitere Datenstrukturen • Falls eine Lösung der Gleichung bekannt ist, kann die zweite Lösung mit der folgenden Formel berechnet werden. q x2 = x1 Der Abstrakte Datentyp (ADT) erhalten wir die Lösungen: x1 = −108 und x2 = 0 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Wir verwenden diese Formel zur Berechnung der • Das sind aber die Lösungen der Gleichung betragsmässig kleineren Lösung • Im Beispiel x 2 + 108 x + 1 = 0 erhalten wir x 2 + 108 x = 0 x1 = 10−8 , x2 = • Der relative Fehler von x1 ist gering (≈ 10−9 ) • Die Lösung x2 ist hingegen schlicht falsch (Underflow). 1 1 = − 8 = −10−8 x1 10 • Dieser Algorithmus ist in jedem Fall numerisch stabil. • Dieser Algorithmus ist also nicht stabil. 1.33 Atomare Datentypen: Schlecht konditionierte Probleme Daten 1.34 Atomare Datentypen: Schlecht konditionierte Probleme 2 Pierre Fierz Daten Pierre Fierz Beispiel: Nullstellen von Polynomen • Für schlecht konditionierte Probleme existieren keine stabilen Algorithmen. Definition Ein Problem ist schlecht konditioniert (ill posed problem), wenn die Lösung sich stark ändert, wenn man die Anfangsdaten wenig stört. • Wir betrachten das Polynom Einleitung Datentypen 3 Einleitung 3 2 P(x) = (x − 1) = x − 3x + 3x − 1 Abgeleitete Typen Weitere Datenstrukturen • Dieses Polynom hat eine dreifache Nullstelle bei x1,2,3 = 1. Der Abstrakte Datentyp (ADT) • Wir betrachten nun das folgende Polynom mit leicht Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) verfälschten Anfangsdaten Q(x) = x 3 − 3.000001x 2 + 3x − 0.999999 • In den Naturwissenschaften sind die Ausgangsdaten von • Die Nullstellen sind Berechnungen meistens Messdaten. x1 = 1, x2 ≈ 1.001414 und x3 ≈ 0.998586 • Messdaten sind aber immer ungenau. • Ist das zu lösende Problem schlecht konditioniert, so wird • Die Koeffizienten von P wurden um 10−6 gestört, was die das Resultat sehr häufig falsch sein. Nullstellen um 10−3 veränderte. • Die Störung wurde damit 1000 mal verstärkt. • Das Polynom P ist also schlecht konditioniert 1.35 1.36 Atomare Datentypen: Logische Werte (BOOLEAN) Daten Atomare Datentypen: Logische Werte (BOOLEAN) 2 Pierre Fierz • Der Datentyp BOOLEAN umfasst die beiden Werte TRUE (wahr) und FALSE (falsch) • Es existieren die folgenden Basisoperatoren • Konjunktion AND (∧) • Disjunktion OR (∨) und • Negation NOT (¬) Daten Pierre Fierz Einleitung Einleitung Datentypen Datentypen Abgeleitete Typen Abgeleitete Typen Weitere Datenstrukturen • Wahrheitstabellen für die boolschen Operatoren Der Abstrakte Datentyp (ADT) Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) A true true false false • Das Resultat eines Vergleichs ist ein BOOLEAN • In Java is die folgende Zuweisung möglich AND B true false true false A∧B true false false false A true true false false OR B true false true false A∨B true true true false NOT A ¬A true false false true boolean Bool = (10 >= 8); 1.37 Atomare Datentypen: Text (CHAR) Daten Atomare Datentypen: Text (CHAR) 2 • Die beiden bijektiven funktionen ord und char müssen zur Verfügung stehen. • Sei N die Anzahl Elemente im Zeichensatz so gilt: Pierre Fierz Einleitung • Der Datentyp CHAR bezeichnet eine Menge von Schriftzeichen. • Es existieren verschiedene Kodierungen wie EBCDIC, ASCII oder Unicode 1.38 ord : CHAR 7→ {0, 1, . . . , N − 1} char : {0, 1, . . . , N − 1} 7→ CHAR Datentypen Abgeleitete Typen Weitere Datenstrukturen • Ferner gelten die folgenden Regeln Der Abstrakte Datentyp (ADT) • ord(char (i)) = i ∀i ∈ [0 . . . N − 1] • Auf der Menge existiert eine totale Ordnung. Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • char (ord(x)) = x ∀x ∈ CHAR • Bezüglich dieser Ordnung müssen die Teilmengen der Buchstaben und der Ziffern je zusammenhängend und wie üblich geordnet sein. Es gilt: Beispiel: Ausgeben von Zeichen in Java A < B < C ··· < Z a < b < c ··· < z 0 < 1 < 2··· < 9 // Alle Zeichen zwischen 0 und 255 ausgeben for (int i = 0; i <= 255; i++) { System.out.print(((char) i) + ","); } // Den Code von A ausgeben System.out.println((int)’A’); 1.39 1.40 Outline Daten Mengenoperationen Pierre Fierz Einleitung 1 Einleitung 2 Datentypen Daten Pierre Fierz Einleitung Datentypen • Ein Datentyp besteht aus einer Menge und Operationen Datentypen Abgeleitete Typen • Durch Mengenoperationen können also aus bestehenden Abgeleitete Typen Weitere Datenstrukturen Datentypen neue gewonnen werden. • Die wichtigsten Mengenoperationen sind Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • • • • 3 Abgeleitete Typen Der Abstrakte Datentyp (ADT) Die Teilmengenbildung Das Kartesische Produkt Bilden der Potenzmenge Erzeugen von Funktionsräume • Bei der Teilmengenbildung spricht man von 4 Weitere Datenstrukturen Unterbereichstypen (oder auch Subtypen) • Bei den anderen Mengenoperationen von strukturierten 5 Der Abstrakte Datentyp (ADT) Typen 1.41 Unterbereichstypen Daten 1.42 Daten Subtypen Pierre Fierz Pierre Fierz • Ein Unterbereichstyp ist ein intervall eines ordinal Typ (Integer, Char) • Das heisst, die Wertemenge wird auf ein Intervall beschränkt. • Beim Unterbereichstyp wird ein Intervall des Obertyps Einleitung benutzt Datentypen Abgeleitete Typen • Die Definition erfolgt durch die Angabe der Grenzen des Intervalls. TYPE T = min..max (*Pascal Definition*) • Eine Verallgemeinerung ist der Subtyp der aus einer Weitere Datenstrukturen beliebigen Teilmenge des Obertyps besteht (set comprehension) Der Abstrakte Datentyp (ADT) Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Beispiel: Subtyp • Der Obertyp sei alle schweizer Adressen CHAdr . • Der Operator PLZ sei auf CHadr definiert und liefert als Beispiel: Unterbereichstypen Resultat die Postleitzahl des Ortes. TYPE Grossbuchstabe = A..Z TYPE Ziffer = 0..9 TYPE Kleinezahl = -10..10 • Wir können nun den neuen Subtyp BEadr folgendermassen definieren: BEadr = {x ∈ CHadr | PLZ (x) ≥ 3000 ∧ PLZ (x) ≤ 3999} • Operatoren des Obertyps können auf den Subtyp angewendet werden 1.43 1.44 Daten Der Array Daten Der Array 2 Pierre Fierz Pierre Fierz • Der strukturierte Typ Array wird aus zwei gegebenen • Auf Arrays ist der Selektoroperator [] definiert. Einleitung Datentypen konstruiert: • Der Grundtyp (GT ) ist ein beliebiger atomarer oder abgeleiteter Datentyp • Der Indextyp (ID) ist ein Unterbereichstyp von INTEGER. • Arrays des Grundtyps GT und des Indextyps ID kann nun Datentypen • Mit diesem Operator kann auf ein beliebiges Element des Abgeleitete Typen Arrays zugegriffen werden. Weitere Datenstrukturen • Das i-te Element des Arrays A wird mit A[i] bezeichnet Der Abstrakte Datentyp (ADT) und repräsentiert ein Objekt des Grundtyps des Arrays. folgendermassen definiert werden. Arraygtid = GT Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Ein Arrayelement kann gelesen oder geschieben werden. |ID| Beispiel: Der Arrayselektor double[] doubleArray = new double[20]; double x; Beispiel: Array in Java x = doubleArray[7] + 10.0; • Wir definieren einen Array mit Grundtyp double und dem Indextyp 0..19 doubleArray[3] = 27.0; public double[] doubleArray = new double[20]; /* Lesen der 7. Komponente des Arrays doubleArray */ /* Schreiben der 3. Komponente des Arrays doubleArray */ 1.45 Der Array 3 • Der Indextyp des Arrays ist eine Zahl • Ein Index kann daher auch zur Laufzeit berechnet werden (Achtung Fehler!) • Diese Eigenschaft wird im nächsten Algorithmus ausgenutzt. Beispiel: Binäres Suchen • Das binäre Suchen kann angewendet werden um in einem Daten 1.46 Der Array 3 • Der Indextyp des Arrays ist eine Zahl • Ein Index kann daher auch zur Laufzeit berechnet werden (Achtung Fehler!) • Diese Eigenschaft wird im nächsten Algorithmus ausgenutzt. Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Beispiel: Binäres Suchen Der Abstrakte Datentyp (ADT) • Das binäre Suchen kann angewendet werden um in einem sortierten Array A ein Element x schnell zu finden. Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) sortierten Array A ein Element x schnell zu finden. • In einem Sortierten Array der Länge n gilt: • In einem Sortierten Array der Länge n gilt: A[0] ≤ A[1] ≤ · · · ≤ A[n − 1] A[0] ≤ A[1] ≤ · · · ≤ A[n − 1] • Der Algorithmus ist ganz Einfach: • Vergleiche das mittlere Element am des Arrays mit x • Der Algorithmus ist ganz Einfach: • Vergleiche das mittlere Element am des Arrays mit x • Gilt am = x dann ist die Suche erfolgreich beendet 1.47 1.47 Der Array 3 • Der Indextyp des Arrays ist eine Zahl • Ein Index kann daher auch zur Laufzeit berechnet werden (Achtung Fehler!) • Diese Eigenschaft wird im nächsten Algorithmus ausgenutzt. Beispiel: Binäres Suchen • Das binäre Suchen kann angewendet werden um in einem Daten Der Array 3 • Der Indextyp des Arrays ist eine Zahl • Ein Index kann daher auch zur Laufzeit berechnet werden (Achtung Fehler!) • Diese Eigenschaft wird im nächsten Algorithmus ausgenutzt. Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Beispiel: Binäres Suchen Der Abstrakte Datentyp (ADT) • Das binäre Suchen kann angewendet werden um in einem sortierten Array A ein Element x schnell zu finden. Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) sortierten Array A ein Element x schnell zu finden. • In einem Sortierten Array der Länge n gilt: • In einem Sortierten Array der Länge n gilt: A[0] ≤ A[1] ≤ · · · ≤ A[n − 1] A[0] ≤ A[1] ≤ · · · ≤ A[n − 1] • Der Algorithmus ist ganz Einfach: • Vergleiche das mittlere Element am des Arrays mit x • Gilt am = x dann ist die Suche erfolgreich beendet • Gilt am > x dann suche das Element im linken Teil des Arrays • Der Algorithmus ist ganz Einfach: • Vergleiche das mittlere Element am des Arrays mit x • Gilt am = x dann ist die Suche erfolgreich beendet • Gilt am > x dann suche das Element im linken Teil des Arrays • Gilt am < x dann suche das Element im rechten Teil des Arrays 1.47 Der Array 4 Daten 1.47 Der Array 4 Pierre Fierz Beispiel: Binäres Suchen in Java public static int binSearch(int[] a, int such) { int left = 0; int right = a.length - 1; int mid = 0; boolean found = false; while (right >= left && !found) { //Testen des mittleren Elementes mid = (left + right) / 2; if (a[mid] == such) found = true; else if (a[mid] < such) //Das Element muss rechts der Mitte liegen. left = mid + 1; else // Das Element muss links der Mitte liegen. right = mid - 1; } return (found) ? mid : -1; Daten Pierre Fierz Beispiel: Binäres Suchen in Java public static int binSearch(int[] a, int such) { int left = 0; int right = a.length - 1; int mid = 0; boolean found = false; Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen while (right >= left && !found) { //Testen des mittleren Elementes mid = (left + right) / 2; if (a[mid] == such) found = true; else if (a[mid] < such) //Das Element muss rechts der Mitte liegen. left = mid + 1; else // Das Element muss links der Mitte liegen. right = mid - 1; } return (found) ? mid : -1; Der Abstrakte Datentyp (ADT) } Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) } • Die maximale Anzahl Vergleiche im Algorithmus ist log2 (a.length) 1.48 1.48 Allgemeine Struktur Daten Allgemeine Struktur 2 • In der Sprache Java kann ein solcher Typ mit Hilfe einer Klasse definiert werden. public class MyStructure { DT1 name_1; DT2 name_2; DT3 name_3; . . DTn name_n; }; • Die Datentypen DT1 . . . DTn können entweder atomare oder abgeleitete Typen sein. Pierre Fierz • Mit Hilfe des Kartesischen Produkts können wir neue Datentypen definieren. • Dabei fassen wir beliebige Datentypen zu einer Einheit zusammen NewType = DT1 × DT2 × DT3 × · · · × DTn Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • In der Sprache C kann ein solcher Typ folgendermassen definiert werden: typedef struct { DT1 Name_1; DT2 Name_2; DT3 Name_3; . . DTn Name_n; } MyStruct; Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Beispiel: Person public class Person { String Name; String Vorname; Calendar GeburtsDatum; String Beruf; double Gehalt; }; 1.49 Allgemeine Struktur 3 Daten Mengen von Objekten • Mengen von Objekten desselben Typs bilden mit den Mengenoperatoren auch einen Typ. • Die Wertemenge des Mengentyps eines Typs DT ist dann P(DT ) • In Java wird der Mengentyp durch die Library Klasse HashSet zur Verfügung gestellt. Pierre Fierz • Bei Strukturen existiert der Selekoroperator ., der es erlaubt auf einzelene Komponenten zuzugreifen. Beispiel: Zugriff auf Komponenten 1.50 Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Beispiel: Mengen und Operationen Der Abstrakte Datentyp (ADT) Person Hans = new Person(); Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public static void main(String[] args) { HashSet<Integer> A = new HashSet<Integer>(); HashSet<Integer> B = new HashSet<Integer>(); Hans.Name = "Meier"; Hans.Gehalt = 4500.0; Hans.GeburtsDatum.set(80, 11, 22); if (A.contains(7)) { // 7 ist Element von A? ... } if (A.containsAll(B)) { // B Teilmenge von A? ... } /* Die Mengenoperationen * Das Resultat ist in A gespeichert */ A.addAll(B); // A vereinigt mit B A.retainAll(B); // A geschnitten mit B A.removeAll(B); // A weg B System.out.println(Hans.Name); } 1.51 1.52 Daten Funktionsräume Outline Pierre Fierz Daten Pierre Fierz • Mit den Datentypen DT1 und DT2 kann der Funktionsraum Fraum = {f |f : DT1 → DT2 } gebildet werden. Einleitung Einleitung 1 Einleitung Datentypen Beispiel: Funktionsräume • Das nächste Beispiel zeigt wie man in C++ Datentypen Abgeleitete Typen Abgeleitete Typen Weitere Datenstrukturen Weitere Datenstrukturen 2 Datentypen Der Abstrakte Datentyp (ADT) Der Abstrakte Datentyp (ADT) Funktionstypen definieren kann. 3 Abgeleitete Typen #include <cmath> #include <iostream> typedef double (*realfunc)(double); 4 Weitere Datenstrukturen int main() { realfunc fp; realfunc fp1; 5 Der Abstrakte Datentyp (ADT) fp = &sin; fp1 = &cos; std::cout << fp(fp1(M_PI)) << std::endl; } 1.54 1.53 Daten Die lineare Liste Die lineare Liste 2 Pierre Fierz • Eine lineare Liste besteht aus i-Tupel von Elementen eines Grundtyps GT Einleitung Einleitung Datentypen • Im Gegensatz zum Array ist die Anzahl Elemente einer Datentypen • Für eine Liste sind die folgenden Operationen wichtig: • Schreiben/Lesen des Wertes eines beliebigen Elements der Liste. • Einfügen eines Elements an einer beliebigen Stelle in der Liste. • Löschen eines beliebigen Elements der Liste. • Traversieren der Liste • Bestimmen der Länge der Liste. Abgeleitete Typen Weitere Datenstrukturen Liste variable. • Formal kann eine Liste folgendermassen definiert werden: ListeGT = ∞ [ Daten Pierre Fierz Der Abstrakte Datentyp (ADT) GT i i=0 • Da i = 0 zugelassen ist, kann eine Liste auch leer sein. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Der Aufwand für die einzelnen Operationen hängt von der • Da Tupel geordnet sind kann man vom ersten, letzten und Repräsentation der Liste ab. n-ten Element der Liste sprechen. • Wir können auch vom Vorgänger und Nachfolger eines Elements sprechen. 1.55 1.56 Daten Die lineare Liste 3 Daten Die lineare Liste 4 Pierre Fierz • Sequentielle Repräsentation: Einleitung Alle Elemente der Liste werden in aufeinanderfolgenden Speicherplätzen abgelegt. Vorteil: Der Zugriff auf ein Element der Liste ist sehr schnell, da dessen Adresse berechnet werden kann. Nachteil Das Einfügen oder Löschen eines Elements der Liste ist langsam, da alle hinteren Elemente geschoben werden müssen. Anfang Ende Pierre Fierz Einleitung • Verkettete Repräsentation: Datentypen Datentypen Zu jedem Element der Liste wird zusätzlich die (physische) Adresse seines Nachfolgers gespeichert. Vorteil: Das Löschen und Einfügen eines Elements der Liste ist schnell, da nur der Zeiger des Vorgängers verändert werden muss. Nachteil: Der Zugriff auf ein beliebiges Element ist langsam, da alle Vorgängerelemente der Liste gelesen werden müssen. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Freier Speicher 1.57 Daten Stack und Queue 1.58 Daten Stack und Queue 2 Pierre Fierz • Aus einer Liste kann man neue Datentypen ableiten, indem die Operationen eingeschränkt werden. Pierre Fierz Einleitung Einleitung • Eine Queue ist eine lineare Liste bei der 1 Die Operationen Lesen und Löschen nur am Anfang der Liste erlaubt sind 2 Die Operation Einfügen nur am Ende der Liste erlaubt ist. Datentypen • Werden die Operationen Lesen, Einfügen und Löschen nur an einem Ende der Liste erlaubt, erhält man den Stack. • Der Stack wird häufig als LiFo-Struktur bezeichnet (LiFo = Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Die Queue wird häufig als FiFo-Struktur bezeichnet (FiFo Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) = First-in-First-out). Last-in-First-out). • Man braucht die Begriffe push und pop für das Einfügen und Löschen eines Elements. write(Sami) Paul Peter Hans Fritz Sami push(Sami) Sami pop() Paul Paul Paul Peter Peter Peter Hans Hans Hans Fritz Fritz Fritz Sami Paul Peter Hans Fritz read() Sami Paul Peter Hans Fritz 1.59 1.60 Der Baum • Eine weitere wichtige Datenstruktur ist der Baum (engl. tree) • Der Baum ist dem Wesen nach eine zweidimensionale Struktur. Daten Daten Der Baum 2 Pierre Fierz Pierre Fierz • Bäume werden als Graphen dargestellt • Dabei wird die Wurzel durch m Kanten (engl. edges) mit Einleitung Datentypen Abgeleitete Typen Definition Abgeleitete Typen Weitere Datenstrukturen Ein Baum ist entweder 1 die leere Menge (leerer Baum) oder 2 eine endliche, nichtleere Menge von Elementen, wovon ein Element Wurzel (engl. root) genannt wird und die restlichen Elemente in m ≥ 0 disjunkte Teilmengen eingeteilt sind, wobei jede wieder ein Baum ist (Unterbäume). Einleitung Datentypen den Wurzeln der Unterbäume verbunden. Wurzel Weitere Datenstrukturen A Geschwister Der Abstrakte Datentyp (ADT) 1111 0000 0000 1111 0000 1111 Der Abstrakte Datentyp (ADT) Unterbaum B C D Hoehe E G F H I Wurzel Innere Knoten J ...... Blaetter Unterbaum Der Baum 3 1.61 Daten 1.62 Der Baum 4 Pierre Fierz • Wichtige Begriffe: • Die Elemente des Baumes heissen Knoten (engl. nodes) • Die Wurzel eines Baumes ist der Vorgänger die Wurzeln der Unterbäume sind die Nachfolger (engl. predecessor and successor). • Knoten mit Nachfolger heissen innere Knoten (engl. internal nodes). • Knoten ohne Nachfolger heissen Blätter oder äussere Knoten (engl. leaves or external nodes). • Die direkten Nachfolger eines Knotens heissen Geschwister (engl. siblings). • Das Niveau (engl. level) eines Knotens ist folgendermassen definiert: level(root) := 0 level(x) := level(predecessor (x)) + 1 Daten Pierre Fierz Einleitung Einleitung Datentypen Datentypen Abgeleitete Typen • Wichtige Begriffe (fortsetzung): • Der Grad (engl. degree) eines Knotens ist gleich der Anzahl Nachfolger dieses Knotens. • Der Grad eines Baubes b ist definiert als: degree(b) := maxx∈b (degree(x)) Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Eine Menge von Bäumen heisst Wald (engl. forest). • Ein geordneter Baum (engl. ordered tree) ist ein Baum, bei dem die Reihenfolge der direkten Nachfolger eines Knotens gegeben ist. • Die Tiefe (engl. depth) oder Höhe (engl. height) eines Baumes b ist definiert als: depth(b) := maxx∈b (level(x)) 1.63 1.64 Der binäre Baum Daten Daten Der binäre Baum 2 Pierre Fierz Pierre Fierz • Ein wichtiger Speziallfall von Bäumen sind die binären Bäume. Definition 1 Ein binärer Baum (engl. binary tree) ist ein geordneter Baum mit Grad ≤ 2. 2 Ein streng binärer Baum (engl. strictly binary tree) ist ein binärer Baum und alle inneren Knoten haben den Grad 2. 3 Ein vollständiger binärer Baum (engl. complete binary tree) ist ein streng binärer Baum und alle Blätter haben das gleiche Niveau. 4 Ein fast vollständiger binärer Baum (engl. allmost complete binary tree) ist ein vollständiger binärer Baum wobei ganz rechts auf der untersten Stufe des Baumes Knoten fehlen dürfen. Beispiel: Diverse binäre Bäume Einleitung Einleitung Datentypen Datentypen Abgeleitete Typen Abgeleitete Typen Weitere Datenstrukturen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Der Abstrakte Datentyp (ADT) 1 Binaerer Baum 2 Streng binaerer Baum 3 Vollstaendiger binaerer Baum 4 Fast vollstaendiger binaerer Baum 1.65 Darstellung von binären Bäumen Daten 1.66 Traversieren von binären Bäumen Pierre Fierz Daten Pierre Fierz • Da der binäre Baum geordnet ist hat ein Knoten einen linken und rechten Unterbaum. • Die folgende Struktur stellt einen Knoten des binären Baumes dar. public class BinTreeNode<Element> { private Element info; private BinTreeNode<Element> left; private BinTreeNode<Element> rigth; • Eine wichtige Operation für Bäume ist das Traversieren Einleitung des Baumes. Datentypen Datentypen • Das heisst, besuchen aller Knoten und ausführen einer Abgeleitete Typen Aktion (z.B. ausdrucken der Information) Weitere Datenstrukturen • Da die Baumstruktur rekursiv definiert ist, liegt es natürlich Der Abstrakte Datentyp (ADT) Einleitung nahe, die Traversierung eines Baumes rekursiv zu implementieren. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Wir wollen die drei folgenden Ansätze betrachten: ... Preorder Traversierung } • Der Baum selbst kann nun folgendermassen definiert 1 werden: 2 public class BinTree<Element> { private BinTreeNode<Element> root; 3 Behandle die Wurzel des Baumes Traversiere den linken Unterbaum in preorder Traversiere den rechten Unterbaum in preorder ... } 1.67 1.68 Daten Traversieren von binären Bäumen 2 Traversieren von binären Bäumen 3 • Der folgende Algorithmus implementiert die Traversierung eines binären Baumes in inorder. Pierre Fierz • Fortsetzung: Algorithmus: Baumtraversierung Einleitung Datentypen Postorder Traversierung 1 2 3 Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 2 3 Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public void traverse() { // Linker Unterbaum if (this.left != null) this.left.traverse(); Inorder Traversierung 1 Einleitung Datentypen public class BinTreeNode<Element> { private Element info; private BinTreeNode<Element> left; private BinTreeNode<Element> right; ... Abgeleitete Typen Traversiere den linken Unterbaum in postorder Traversiere den rechten Unterbaum in postorder Behandle die Wurzel des Baumes Daten Pierre Fierz // Ausgeben des Knotens System.out.println(info); Traversiere den linken Unterbaum in inorder Behandle die Wurzel des Baumes Traversiere den rechten Unterbaum in inorder // Rechter Unterbaum if (this.right != null) this.right.traverse(); } ... } 1.69 Daten Traversieren von binären Bäumen 4 1.70 Traversieren von binären Bäumen 5 Pierre Fierz Beispiel: Arithmetische Ausdrücke Beispiel: Arithmetische Ausdrücke (forts.) • Zu jedem arithmetischen Ausdruck gehört ein Syntaxbaum. • Die inneren Knoten repräsentieren die Operatoren • Traversieren wir den Baum in Preorder, so erhalten wir die Einleitung folgende Reihenfolge für den Besuch der einzelnen Knoten (Polnische Notation): Datentypen Abgeleitete Typen • Die Blätter repräsentieren die Operanden. Weitere Datenstrukturen • Der folgende Baum repräsentiert den Ausdruck Der Abstrakte Datentyp (ADT) · − · + abc/d e7 Abgeleitete Typen Weitere Datenstrukturen die folgende Reihenfolge für den Besuch der einzelnen Knoten (Umgekehrte polnische Notation): − a Datentypen • Traversieren wir den Baum in Postorder, so erhalten wir 01 7 01 Einleitung Der Abstrakte Datentyp (ADT) ((a + b) · c − d/e) · 7 ab + c · d e/ − 7· / • Traversieren wir den Baum in Inorder, so erhalten wir die c + Daten Pierre Fierz d e folgende Reihenfolge für den Besuch der einzelnen Knoten (Infix Notation ohne Klammern): b 1.71 a + b · c − d /e · 7 1.72 Outline Daten Definition ADT Pierre Fierz Einleitung 1 Einleitung Einleitung • Der abstrakte Datentyp (abgekürzt ADT) ist eines der Datentypen Abgeleitete Typen 2 Datentypen Daten Pierre Fierz wichtigsten Konzepte in der modernen Informatik. Weitere Datenstrukturen • Objektorientierte Sprachen unterstützen das Konzept. Der Abstrakte Datentyp (ADT) • Er dient dazu, Datentypen unabhängig von deren Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Implementation zu definieren. 3 Abgeleitete Typen • Beispiele: Listen, Stacks, Queues usw. • Aber auch konkrete Objekte der Welt wie Personen, Motoren, Schrauben, Fahrzeuge usw. 4 Weitere Datenstrukturen • Zwei wichtige Prinzipien: • Geheimnisprinzip • Wiederverwendbarkeit 5 Der Abstrakte Datentyp (ADT) 1.73 Definition ADT 2 Daten 1.74 Definition ADT 3 Pierre Fierz Daten Pierre Fierz • Das Geheimnisprinzip kann folgendermassen formuliert werden: Einleitung • Das Prinzip der Wiederverwendbarkeit kann wie folgt Datentypen Definition Dem Benutzer eines Datentyps (Moduls) werden nur die auf diesem Datentyp erlaubten Operationen bekanntgegeben. Die Implementation des Datentyps bleibt für den Benutzer verborgen (abstrakt). formuliert werden: Abgeleitete Typen Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Definition Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Ein Datentyp soll in verschiedenen Applikationen wiederverwendbar sein, wenn ähnliche Probleme gelöst werden müssen. Der Abstrakte Datentyp (ADT) • Die Anwendung dieses Prinzips bringt folgende Vorteile: • Der Anwender kann den Datentyp nur im Sinne der Definition verwenden. • Die Implementation eines Datentyps kann jederzeit verändert werden. • Die Verantwortung zwischen dem Anwender und dem Implementator des Datentyps sind durch die Interface-Definitionen klar geregelt. • Die Suche nach Fehlern wird dadurch erheblich vereinfacht. • Die Anwendung dieses Prinzips verfolgt die folgenden Ziele: • Die Entwicklungszeit eines Systems soll veringert werden • Software soll aus gut getesteten (bewiesenen) Komponenten hergestellt werden können • Bestehende Softwarekomponenten sollen einfach zwischen Herstellern austauschbar sein. 1.75 1.76 Daten Formale Spezifikation von ADTs Formale Spezifikation von ADTs 2 Pierre Fierz Daten Pierre Fierz • Die Wiederverwendbarkeit bedingt, dass die Funktionen eines ADTs genau beschrieben werden. • Das Geheimnisprinzip verlangt, dass die Spezifikation nicht aufgrund der Implementation geschieht. • Die Beschreibung des Stacks durch seine Implementation ist genau Einleitung Datentypen • Der Datentyp Stack ist aber dadurch überspezifiziert Abgeleitete Typen • Eine Beschreibung, die auf der Implementation basiert, führt oft zu einer Überspezifikation des Datentyps. Beispiel: Spezifikation eines Stacks aufgrund der Implementation • Da der Benutzer weiss, dass der Stack als Array Weitere Datenstrukturen impplementiert ist, kann er auf beliebige Element des Stacks zugreifen. Der Abstrakte Datentyp (ADT) Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Ein solcher Zugriff widerspricht aber der Idee des Stacks. Wir können den Datentyp Stack als Array mit einem zusätzlichen Zeiger auf das aktuelle oberste Element des Stacks implementieren (in C). struct stack { int stack_pointer; DT stack_element[MAX]; Einleitung • Eine Spezifikation besteht aus einer Signatur und einer Semantik, die Bedeutung und Interaktion der Operationen festlegt. • Im folgenden wollen wir die folgenden Spezifikationsmethoden betrachten: /* DT steht fuer irgend einen Datentyp */ }; 1 void push(stack st, DT x) { ++st.stack_pointer; st.stack_element[st.stack_pointer] = x; } 2 3 Mathematisch-axiomatische Methode Mathematisch-algebraische Methode Informelle Methode 1.77 Mathematisch-axiomatische Methode Daten 1.78 Mathematisch-axiomatische Methode 2 Pierre Fierz Daten Pierre Fierz Beispiel: Spezifikation des Stacks TYPES • Eine Mathematisch-axiomatische Spezifikation besteht aus einer Signatur, Erzeuger und Axiomen. • Die Signatur beschreibt die Operationen mit Ihrer Wertigkeit und die Konstanten (0-Wertige Operation). • Erzeuger sind Operationen, die aus gegebenen Einleitung Stack ELEMENT BOOLEAN Datentypen Abgeleitete Typen Weitere Datenstrukturen // wird hier definiert // beliebiger Datentyp (generischer Parameter) emptystack : empty : push : pop : top : Elementen des Typs neue erzeugen. • Die Axiome sind in Preconditions und Equations aufgeteilt und beschreiben die Semantik des Typs. Datentypen Abgeleitete Typen Weitere Datenstrukturen FUNCTIONS Der Abstrakte Datentyp (ADT) Einleitung 7→ Stack Stack 7→ BOOLEAN ELEMENT × Stack 7→ Stack Stack ,→ Stack Stack ,→ ELEMENT Der Abstrakte Datentyp (ADT) PRECONDITIONS ∀s ∈ Stack : pre pop(s) : ¬(empty (s)) pre top(s) : ¬(empty (s)) • Die Grundmenge der Objekte des Datentyps ist die Menge aller aus den Operationen erzeugbaren Objekte. • In der Mathematik wird ein solches System auch eine AXIOMS Termalgebra genannt. ∀e ∈ ELEMENT ∀s ∈ Stack : empty (emptystack ) = TRUE empty (push(e, s)) = FALSE top(push(e, s)) = e pop(push(e, s)) = s push(top(s), pop(s)) = s falls ¬empty (s) 1.79 1.80 Mathematisch-axiomatische Methode 3 Daten Mathematisch-algebraische Methode Pierre Fierz Daten Pierre Fierz Beispiel: Spezifikation der Queue TYPES Queue ELEMENT BOOLEAN // wird hier definiert // beliebiger Datentyp (generischer Parameter) axiomatischen nur in der Angabe der Semantik. • Die inhaltliche Bedeutung der Operationen wird hierbei durch mathematische Mittel, Matrizen, Vektoren, Folgen, etc. definiert. Datentypen Abgeleitete Typen Weitere Datenstrukturen FUNCTIONS emptyqueue : empty : enqueue : dequeue : head : • Die algebraische Methode unterscheidet sich von der Einleitung 7→ Stack Queue 7→ BOOLEAN ELEMENT × Queue 7→ Queue Queue ,→ Queue Queue ,→ ELEMENT Der Abstrakte Datentyp (ADT) • Ein Repräsentant dieser Methode ist die Java Modelling Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • JML ist auf die Sprache Java zugeschnitten • Die JML Anweisungen werden als Annotationen im Code ∀q ∈ Queue : pre dequeue(q) : ¬(empty (q)) pre head(q) : ¬(empty (q)) geschrieben. • Der Formalismus von JML ist nicht mathematisch sondern Java ähnlich. AXIOMS • Zu JML existieren viele Tools zum testen oder beweisen ∀e ∈ ELEMENT ∀q ∈ Queue : empty (emptyqueue) = TRUE empty (enqueue(e, q)) = FALSE head(enqueue(e, q)) = e falls empty (q) = head(q) falls ¬empty (q) dequeue(enqueue(e, q)) = q falls empty (q) = enqueue(e, dequeue(q)) falls ¬empty (q) Mathematisch-algebraische Methode 2 ob die Implementation der Spezifikation entspricht. 1.81 Daten 1.82 Mathematisch-algebraische Methode 3 Pierre Fierz Daten Pierre Fierz Beispiel: Stack algebraische Spezifikation Beispiel: Queue algebraische Spezifikation TYPES TYPES // wird hier definiert // beliebiger Datentyp (generischer Parameter) Queue ELEMENT BOOLEAN Einleitung Datentypen // wird hier definiert // beliebiger Datentyp (generischer Parameter) Abgeleitete Typen FUNCTIONS emptystack : empty : push : pop : top : Datentypen Language (JML) PRECONDITIONS Stack ELEMENT BOOLEAN Einleitung 7 Stack → Stack 7→ BOOLEAN ELEMENT × Stack 7→ Stack Stack ,→ Stack Stack ,→ ELEMENT Einleitung Datentypen Abgeleitete Typen FUNCTIONS Weitere Datenstrukturen emptyqueue : empty : enqueue : dequeue : head : Der Abstrakte Datentyp (ADT) SPECIFICATION Sets 7→ Stack Queue 7→ BOOLEAN ELEMENT × Queue 7→ Queue Queue ,→ Queue Queue ,→ ELEMENT Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Sets ELEMENT beliebiege Menge Q = {<>} ∪ {< x1 , . . . , xn > |xi ∈ ELEMENT ∧ n ∈ N1 } ELEMENT beliebiege Menge S = {<>} ∪ {< x1 , . . . , xn > |xi ∈ ELEMENT ∧ n ∈ N1 } Functions Functions emptyqueue =<> empty (q) = (q ==<>) enqueue(e, q) =< e > falls q ==<> =< e, x1 , . . . , xn > falls q ==< x1 , . . . , xn > head(q) = ⊥ falls q ==<> = xn falls q ==< x1 , . . . , xn > dequeue(q) = ⊥ falls q ==<> =< x1 , . . . , xn−1 > falls q ==< x1 , . . . , xn > emptystack =<> empty (s) = (s ==<>) push(e, s) =< e > falls s ==<> =< x1 , . . . , xn , e > falls s ==< x1 , . . . , xn > top(s) = ⊥ falls s ==<> = xn falls s ==< x1 , . . . , xn > pop(s) = ⊥ falls s ==<> =< x1 , . . . , xn−1 > falls s ==< x1 , . . . , xn > 1.83 1.84 Informelle Methode Daten Informelle Methode 2 Pierre Fierz Daten Pierre Fierz Beispiel: Informelle Spezifikation des Stacks Einleitung • Die formale (mathematische) Spezifikation eines ADT ist eine sehr schwierige Aufgabe • In vielen Fällen genügt eine weniger formale Beschreibung des ADT • Diese Beschreibung kann zum Beispiel in Form eines Java-Interfaces geschehen Einleitung public interface Stack<Element> { static public class StackFullException extends Exception{}; static public class StackEmptyException extends Exception{}; /** * Dieses Interface definiert die Schnittstelle zu * einem Stack von beliebigen Elementen des Typs * Element Die Implementation steht noch offen. */ Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) /** Preconditions: none * Postconditions: none * @return true falls keine Elemente im Stack sind. */ public boolean empty(); • Zu jeder Methode werden die Preconditions und Postconditions angegeben • Die Beschreibung kann auch in natürlicher Sprache sein • Es ist darauf zu Achten, dass die Beschreibung möglichst /** Preconditions: none * Postconditions: none * @return true falls kein Element eingefuegt werden kann. * */ public boolean full(); eindeutig ist. 1.85 Informelle Methode 3 Daten 1.86 Informelle Methode 4 Pierre Fierz Daten Pierre Fierz Beispiel: Bounded Implementation mit Array Beispiel: Informelle Spezifikation des Stacks (forts.) public class BoundedStack<Element> implements Stack<Element> { private int maxsize; private int sp; private Element[] st; Einleitung /** Preconditions: full() == false * Postconditions: -- Ein Element (item) mehr auf dem Stack new.empty() == false * new.top() == item * * @param item: neues Element zuoberst auf dem Stack */ public void push(Element item) throws StackFullException; Datentypen Abgeleitete Typen public BoundedStack(int size) { maxsize = size; sp = -1; st = (Element[])new Object[size]; } Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public boolean full() { return sp+1 == maxsize; } /** Preconditions: empty() == false * Postconditions: -- Ein Element weniger auf dem Stack new.push(old.top()) == old * * @return Oberstes Element des Stacks */ public Element pop() throws StackEmptyException; public boolean empty() { return sp == -1; } public void push(Element e) throws StackFullException { if (full()) throw new StackFullException(); st[++sp] = e; } /** Preconditions: empty() == false * Postconditions: none * @return old.top() (Oberstes Element des Stacks) */ public Element top() throws StackEmptyException; public Element pop() throws StackEmptyException { if (empty()) throw new StackEmptyException(); return st[sp--]; } public Element top() throws StackEmptyException { if (empty()) throw new StackEmptyException(); return st[sp]; } } } 1.87 1.88 Informelle Methode 5 Daten Pierre Fierz Beispiel: Unbounded Implementation mit Vector import java.util.Vector; Einleitung public class MyStack<Element> implements Stack<Element> { private Vector<Element> st; Datentypen Abgeleitete Typen public MyStack() { st = new Vector<Element>(); } public boolean empty() { return st.size() == 0; } Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public boolean full() { // Immer false return false; } public Element pop() throws StackEmptyException { if (empty()) throw new StackEmptyException(); return st.remove(st.size() - 1); } public void push(Element item) { st.add(item); } public Element top() throws StackEmptyException { if (empty()) throw new StackEmptyException(); return st.elementAt(st.size() - 1); } } 1.89