Inhalt der Vorlesung Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen 1 Daten 2 Algorithmen 3 Sortieralgorithmen 4 Suchalgorithmen 5 Graphen 6 Verarbeitung von Strings 7 Typen von Algorithmen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1.1 Literatur Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen • M.T. Goodrich and R. Tamassia. Algorithm Design. John Wiley & Sons,Inc., New York, 2002. ISBN 0-471-38365-1. • 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.2 Bewertung Daten Pierre Fierz Einleitung 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% Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1.3 Daten Pierre Fierz Chapter 1 Einleitung Daten Datentypen Abgeleitete Typen Lecture Algorithmen & Datenstrukturen 29.08.2011 Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Pierre Fierz Berner Fachhochschule Technik und Informatik 1.4 Contents Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.5 Outline Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.6 Einleitung Daten 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. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • 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. • Die Darstellung hängt von der Verwendung der Daten ab. 1.7 Daten Einleitung 2 Pierre Fierz Beispiel: Verschiedene Personendaten Einleitung Datentypen • Als Beispiel vergleichen wir die Personaldaten in einer Arbeitgeberkartei und in einer Arztkartei. Aufbau der Arbeitgeberkartei Name Adresse Funktion Gehalt Lohnentwicklung usw. Aufbau der Arztkartei Name Adresse Grösse Gewicht Krankengeschichte usw. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Unwichtige Daten werden weggelassen • Das Objekt “Person” wird abstrahiert. 1.8 Daten Einleitung 3 Pierre Fierz • Bei der Abbildung der Welt in ein Datenmodell sind zwei Aspekte wichtig: Einleitung Datentypen Abgeleitete Typen Abstraktion • Wichtige Daten eines Objekts identifizieren Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Für die Applikation unwesentliche Daten weglassen • Abstraktion = Vereinfachung Darstellung • Wahl der Darstellung eines Objektes im Computer • Schwierige Aufgabe. • Hängt von den Operationen (Algorithmen), die auf dem Objekt ausgeführt werden ab. 1.9 Einleitung 4 Daten Pierre Fierz • Wir wollen das Problem der Darstellung am Beispiel von Zahlen betrachten Einleitung Beispiel: Technische Darstellung von Zahlen Im technisch-wissenschaftlichen Bereich werden von Zahlen folgende Eigenschaften verlangt: • Das Rechnen ist die Hauptoperation und muss möglichst Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) effizient sein. • Es werden sehr grosse und auch sehr kleine Zahlen benötigt. (Bereich ca. 10−40 bis 1040 ) • Im allgemeinen genügt eine Genauigkeit von 10 bis 16 signifikante Stellen zur Berechnung und Ausgabe der Resultate. • Die Druckoperation ist viel seltener als die Rechenoperationen. Diese Überlegungen legt die floating point-Darstellung nahe, die nachstehend erklärt ist. 1.10 Daten Einleitung 5 Pierre Fierz Beispiel: Technische Darstellung von Zahlen 2 Vorzeichen Exponent Mantisse 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 Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Ist der Exponent 0, so ist die Zahl 0. • Mantisse besteht aus 23 bits und stellt einen normalisierten Dualbruch dar. • Normalisiert bedeutet, dass die erste signifikante Stelle vor dem Komma steht. • Da die erste Stelle vor dem Komma immer 1 ist, wird sie in der Darstellung weggelassen. • Alles in einer Formel zusammengefasst: zahl = Vorzeichen · (2(Exponent−127) · 1.Mantisse) 1.11 Daten Einleitung 6 Pierre Fierz Beispiel: Technische Darstellung von Zahlen 3 Einleitung Datentypen • Wir wollen dies noch an einem Zahlenbeispiel veranschaulichen Abgeleitete Typen Weitere Datenstrukturen • Wir möchten die Dezimalzahl −0.1 darstellen. Der Abstrakte Datentyp (ADT) • Das Vorzeichen ist also 1 • 0.1 dual ergibt 0.00011001100 . . . • Normalisiert ergibt es 1.1001100 · 2−4 • Der Exponent ist also E = −4 + 127 = 123 binär 01111011 Vorzeichen 1 Exponent 01111011 Mantisse 10011001100110011001100 1.12 Einleitung 7 Daten Pierre Fierz • Wir wollen nun eine weitere Möglichkeit für die Darstellung von Zahlen betrachten Einleitung Beispiel: Kommerzielle Darstellung von Zahlen Datentypen Abgeleitete Typen Im kommerziellen Bereich werden Zahlen vor allem zur Darstellung von Geldbeträgen verwendet. • Mit den Zahlen wird wenig gerechnet (meistens Additionen). Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Die Zahlen werden sehr oft gedruckt. • Der benötigte Bereich ist viel kleiner als im technischen Bereich. • 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 Ausgabe genau sein. Diese Überlegungen legt die fix point-Darstellung nahe, die nachfolgend erklärt ist. 1.13 Daten Einleitung 8 Pierre Fierz Beispiel: Kommerzielle Darstellung von Zahlen 2 Einleitung Datentypen n − m Vorkommastellen 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 Dezimalstelle dar • Das Vorzeichen ist durch die letzten 4 Bits gegeben • Als Beispiel stellen wir die Zahl 35.7310 dar. 0000 | {z } . . . 0011 | {z } 0101 | {z } 0111 | {z } 0011 | {z } 0001 | {z } 0000 | {z } 0000 | {z } 0 3 5 7 3 1 0 + 1.14 Einleitung 9 Daten 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 Einleitung Datentypen Abgeleitete Typen 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. 1.15 Einleitung 10 Daten Pierre Fierz Einleitung Beispiel: Computer-Daten Datentypen Abgeleitete Typen Datenobjekt: "Müller" Bezeichnung: Familienname einer Person. Damit ist die Bedeutung des angegebenen Objekts festgelegt. 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.16 Einleitung 11 Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Bemerkung: Syntax und Semantik 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. 1.17 Outline Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.18 Definition: Datentyp 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 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • In der Informatik werden noch mehr Objekte unterschieden wie • • • • • • Zahlen Funktionen, Personaldaten, Wetterdaten, Rechnungen u.s.w. • Es ist noch wichtiger als in der Mathematik diese Objekte zu ordnen • Objekte werden in Datentypen unterteilt 1.19 Definition: Datentyp 2 Daten Pierre Fierz Einleitung • Wir wollen nun den Begriff Datentyp definieren Definition 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. Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1.20 Definition: Datentyp 3 Daten 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 Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Beispiel: Enum-Typ In der Sprache Java etwa, können wir einen Farbentyp folgendermassen deklarieren. public Enum Farbe {ROT, BLAU, GELB, GRÜN}; • Mit dieser Definition ist auch der Vergleichsoperator (equals) definiert. 1.21 Atomare Datentypen Daten Pierre Fierz Einleitung Datentypen • Atomare Datentypen sind solche, die in einer Programmiersprache schon definiert sind. • Sie bilden die Basis des Typsystems der Sprache. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Durch Typkonstruktoren können aus den Atomaren Typen weitere Typen erzeugt werden. • Welche atomaren Typen zur Verfügung stehen, hängt von der gewählten Programmiersprache ab. • Im Folgenden stellen wir einige wichtige atomare Datentypen vor. 1.22 Atomare Datentypen: Ganze Zahlen (INTEGER) Daten Pierre Fierz Einleitung 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. • Die Operationen sind bezüglich INTEGER nicht abgeschlossen (overflow). 1.23 Daten Atomare Datentypen: reelle Zahlen (REAL) Pierre Fierz • Der Datentyp REAL ist ein endliches Modell der reellen Zahlen R. • Die Elemente dieses Typs werden auch Maschinenzahlen 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. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Die REALs auf der reellen Zahlenachse −max 0 Overflowbereich +max Overflowbereich Underflowbereich • Das Intervall der reellen Zahlen, das durch die REAL-Zahl 0 repräsentiert wird, heisst Underflow-Bereich 1.24 Daten Atomare Datentypen: Endliche Arithmetik Pierre Fierz • Wir haben schon gesehen, dass eine REAL-Zahl als Einleitung floatingpoint dargestellt werden Datentypen (Exponent−127) Zahl = Vorzeichen · (2 · 1.Mantisse) Abgeleitete Typen Weitere Datenstrukturen • Diese Darstellung der reellen Zahlen nennt man auch eine endliche binäre Arithmetik. Der Abstrakte Datentyp (ADT) • Die Grösse der Mantisse bestimmt die maximale Anzahl signifikanter Stellen einer Zahl. • Ist diese Anzahl z.B. 10, so spricht man von einer 10-stelligen endlichen Arithmetik. • Bei einer Operation wird mit einer Stelle mehr gerechnet und anschliessend das Resultat auf die Grösse der Mantisse gerundet. • Menge der Zahlen einer endlichen Arithmetik wollen wir mit M bezeichnen. 1.25 Atomare Datentypen: Eigenschaften einer endliche Arithmetik Daten Pierre Fierz • Die Wertemenge von M ist eine Untermenge der reellen Einleitung Zahlen. M⊂R • Jeder Zahl x ∈ R ist eindeutig ein x̃ ∈ M zugeordnet, welches als Repräsentant von x bezeichnet wird. • Jedes x̃ ∈ M repräsentiert alle Zahlen in einem Intervall Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) um x̃. • Die reellen Zahlen 0 und 1 können in M exakt dargestellt werden. Es gilt: 0 = 0̃ und 1 = 1̃ • Sind x, y ∈ M, dann ist das Resultat der Addition im Allgemeinen nicht mehr in M. • Das Resultat muss auf das nächstliegende Element in M gerundet werden. • Aus diesem Grund gelten nicht dieselben Gesetze wie in einer gewöhnlichen Arithmetik. 1.26 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 Pierre Fierz Einleitung Datentypen Abgeleitete Typen Beispiel: Assotiativgesetz der Addition Weitere Datenstrukturen Wir verwenden hier eine 4-Stellige dezimale endliche Arithmetik. Der Abstrakte Datentyp (ADT) x = 9.100 y = 3.0 · 10−4 z = 4.0 · 10−4 (x + y ) + z = (9.100 + 0.0003 +0.0004 = 9.100 | {z } gerundet=9.100 | {z gerundet=9.100 } x + (y + z) = 9.100 + (0.0003 + 0.0004) = 9.101 | {z } gerundet=0.0007 | {z gerundet=9.101 } 1.27 Atomare Datentypen: Eigenschaften einer endliche Arithmetik 3 • Das Distributivgesetz gilt in einer endlichen Arithmetik im Allgemeinen nicht: x · (y + z) 6= (x · y ) + (x · z) Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Beispiel: Distributivgesetz Der Abstrakte Datentyp (ADT) 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 | {z gerundet=6.000 } (x · y ) + (x · z) = (2.000 · 3.000) + (2.000 · 0.0003) = 6.001 | {z } | {z } gerundet=6.000 | gerundet=0.0006 {z gerundet=6.001 } 1.28 Atomare Datentypen: Absoluter und relativer Fehler Daten Pierre Fierz • Bei Operationen mit Zahlen aus M wird das Resultat gerundet. Einleitung • Dadurch entstehen Fehler im Resultat. Datentypen Abgeleitete Typen Weitere Datenstrukturen Definition Sei x̃ eine Approximation der Zahl x so definieren wir den absoluten Fehler als Der Abstrakte Datentyp (ADT) |x − x̃| und den relativen Fehler als |x − x̃| |x| • Für die Fehlerrechnung ist vor allem der relative Fehler interessant 1.29 Atomare Datentypen: Numerische Auslöschung • Numerische Auslöschung ist ein spezieller Rundungsfehler. • Entsteht wenn zwei fast gleich grosse Zahlen voneinander subtrahiert werden. Beispiel: Numerische Auslöschung Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen • Wir betrachten die folgende Rechnung Der Abstrakte Datentyp (ADT) 1.2345 · 100 − 1.2344 · 100 = 1.0000 · 10−4 • Falls die Anfangsdaten verfälscht waren ist das exakte Resultat aber 1.xxxx. • Die Stellen xxxx sind dabei nicht bekannt • 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 • Der relative Fehler wird also um einen Faktor von 104 vergrössert. 1.30 Atomare Datentypen: Numerische Stabilität Daten Pierre Fierz 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 Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Die folgende Definition von Stabilität stammt von Wilkinson: Definition Bei stabilen Algorithmen ist das vom Computer berechnete (durch Rundungsfehler verfälschte) Resultat, das exakte Resultat von leicht geänderten Anfangsdaten. 1.31 Atomare Datentypen: Numerische Stabilität 2 Daten Pierre Fierz Beispiel: Quadratische Gleichung nicht stabil • Wir betrachten Quadratische Gleichungen der Form Einleitung Datentypen x 2 + px + q = 0 • Die übliche Formel zum Finden der beiden Lösungen lautet 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 = • Dann gilt nämlich −p ≈ 2 r p 2 2 −q und es werden fast gleich grosse Zahlen voneinader subtrahiert. 1.32 Atomare Datentypen: Numerische Stabilität 3 Daten Pierre Fierz Beispiel: Quadratische Gleichung nicht stabil (Forts.) • Wir berechnen nun das folgende numeriche Beispiel 2 8 x + 10 x + 1 = 0 • Mit einer 7-stelligen Arithmetik und der obigen Formel Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) erhalten wir die Lösungen: x1 = −108 und x2 = 0 • Das sind aber die Lösungen der Gleichung x 2 + 108 x = 0 • Der relative Fehler von x1 ist gering (≈ 10−9 ) • Die Lösung x2 ist hingegen schlicht falsch (Underflow). • Dieser Algorithmus ist also nicht stabil. 1.33 Atomare Datentypen: Numerische Stabilität 4 Daten Pierre Fierz Beispiel: Quadratische Gleichung stabil Einleitung • Um quadratische Gleichungen immer stabil zu berechnen kann man den folgenden Algorithmus verwenden. • Falls eine Lösung der Gleichung bekannt ist, kann die zweite Lösung mit der folgenden Formel berechnet werden. q x2 = x1 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Wir verwenden diese Formel zur Berechnung der betragsmässig kleineren Lösung • Im Beispiel x 2 + 108 x + 1 = 0 erhalten wir x1 = 10−8 , x2 = 1 1 = − 8 = −10−8 x1 10 • Dieser Algorithmus ist in jedem Fall numerisch stabil. 1.34 Atomare Datentypen: Schlecht konditionierte Probleme Daten Pierre Fierz • 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. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • In den Naturwissenschaften sind die Ausgangsdaten von Berechnungen meistens Messdaten. • Messdaten sind aber immer ungenau. • Ist das zu lösende Problem schlecht konditioniert, so wird das Resultat sehr häufig falsch sein. 1.35 Atomare Datentypen: Schlecht konditionierte Probleme 2 Daten Pierre Fierz Beispiel: Nullstellen von Polynomen • Wir betrachten das Polynom P(x) = (x − 1)3 = x 3 − 3x 2 + 3x − 1 • Dieses Polynom hat eine dreifache Nullstelle bei x1,2,3 = 1. • Wir betrachten nun das folgende Polynom mit leicht Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) verfälschten Anfangsdaten Q(x) = x 3 − 3.000001x 2 + 3x − 0.999999 • Die Nullstellen sind x1 = 1, x2 ≈ 1.001414 und x3 ≈ 0.998586 • Die Koeffizienten von P wurden um 10−6 gestört, was die Nullstellen um 10−3 veränderte. • Die Störung wurde damit 1000 mal verstärkt. • Das Polynom P ist also schlecht konditioniert 1.36 Atomare Datentypen: Logische Werte (BOOLEAN) Daten Pierre Fierz Einleitung Datentypen • Der Datentyp BOOLEAN umfasst die beiden Werte TRUE (wahr) und FALSE (falsch) • Es existieren die folgenden Basisoperatoren • Konjunktion AND (∧) • Disjunktion OR (∨) und • Negation NOT (¬) Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Das Resultat eines Vergleichs ist ein BOOLEAN • In Java is die folgende Zuweisung möglich boolean Bool = (10 >= 8); 1.37 Atomare Datentypen: Logische Werte (BOOLEAN) 2 Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen • Wahrheitstabellen für die boolschen Operatoren Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) A true true false false 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 1.38 Atomare Datentypen: Text (CHAR) Daten Pierre Fierz Einleitung • Der Datentyp CHAR bezeichnet eine Menge von Schriftzeichen. • Es existieren verschiedene Kodierungen wie EBCDIC, ASCII oder Unicode Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Auf der Menge existiert eine totale Ordnung. • Bezüglich dieser Ordnung müssen die Teilmengen der Buchstaben und der Ziffern je zusammenhängend und wie üblich geordnet sein. Es gilt: A < B < C ··· < Z a < b < c ··· < z 0 < 1 < 2··· < 9 1.39 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: ord : CHAR 7→ {0, 1, . . . , N − 1} char : {0, 1, . . . , N − 1} 7→ CHAR • Ferner gelten die folgenden Regeln • ord(char (i)) = i ∀i ∈ [0 . . . N − 1] Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • char (ord(x)) = x ∀x ∈ CHAR Beispiel: Ausgeben von Zeichen in Java // 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.40 Outline Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.41 Mengenoperationen Daten Pierre Fierz Einleitung • Ein Datentyp besteht aus einer Menge und Operationen Datentypen • Durch Mengenoperationen können also aus bestehenden Abgeleitete Typen Datentypen neue gewonnen werden. • Die wichtigsten Mengenoperationen sind Weitere Datenstrukturen • • • • Der Abstrakte Datentyp (ADT) Die Teilmengenbildung Das Kartesische Produkt Bilden der Potenzmenge Erzeugen von Funktionsräume • Bei der Teilmengenbildung spricht man von Unterbereichstypen (oder auch Subtypen) • Bei den anderen Mengenoperationen von strukturierten Typen 1.42 Unterbereichstypen Daten Pierre Fierz • Ein Unterbereichstyp ist ein intervall eines ordinal Typ (Integer, Char) • Das heisst, die Wertemenge wird auf ein Intervall beschränkt. Einleitung Datentypen Abgeleitete Typen • Die Definition erfolgt durch die Angabe der Grenzen des Intervalls. TYPE T = min..max (*Pascal Definition*) Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Beispiel: Unterbereichstypen TYPE Grossbuchstabe = A..Z TYPE Ziffer = 0..9 TYPE Kleinezahl = -10..10 • Operatoren des Obertyps können auf den Subtyp angewendet werden 1.43 Daten Subtypen Pierre Fierz • Beim Unterbereichstyp wird ein Intervall des Obertyps benutzt • Eine Verallgemeinerung ist der Subtyp der aus einer beliebigen Teilmenge des Obertyps besteht (set comprehension) 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 Resultat die Postleitzahl des Ortes. • Wir können nun den neuen Subtyp BEadr folgendermassen definieren: BEadr = {x ∈ CHadr | PLZ (x) ≥ 3000 ∧ PLZ (x) ≤ 3999} 1.44 Daten Der Array Pierre Fierz • Der strukturierte Typ Array wird aus zwei gegebenen 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 Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) folgendermassen definiert werden. Arraygtid = GT |ID| Beispiel: Array in Java • Wir definieren einen Array mit Grundtyp double und dem Indextyp 0..19 public double[] doubleArray = new double[20]; 1.45 Daten Der Array 2 Pierre Fierz • Auf Arrays ist der Selektoroperator [] definiert. • Mit diesem Operator kann auf ein beliebiges Element des Arrays zugegriffen werden. • Das i-te Element des Arrays A wird mit A[i] bezeichnet und repräsentiert ein Objekt des Grundtyps des Arrays. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Ein Arrayelement kann gelesen oder geschieben werden. Beispiel: Der Arrayselektor double[] doubleArray = new double[20]; double x; x = doubleArray[7] + 10.0; doubleArray[3] = 27.0; /* Lesen der 7. Komponente des Arrays doubleArray */ /* Schreiben der 3. Komponente des Arrays doubleArray */ 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. Beispiel: Binäres Suchen • Das binäre Suchen kann angewendet werden um in einem 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: A[0] ≤ A[1] ≤ · · · ≤ A[n − 1] • Der Algorithmus ist ganz Einfach: • Vergleiche das mittlere Element am des Arrays mit x 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 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: 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 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 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: 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 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 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: 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 • Gilt am < x dann suche das Element im rechten Teil des Arrays 1.47 Der Array 4 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; 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; Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) } 1.48 Der Array 4 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; 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; Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) } • Die maximale Anzahl Vergleiche im Algorithmus ist log2 (a.length) 1.48 Allgemeine Struktur Daten 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; 1.49 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. 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.50 Allgemeine Struktur 3 Daten Pierre Fierz • Bei Strukturen existiert der Selekoroperator ., der es erlaubt auf einzelene Komponenten zuzugreifen. Beispiel: Zugriff auf Komponenten Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Person Hans = new Person(); Hans.Name = "Meier"; Hans.Gehalt = 4500.0; Hans.GeburtsDatum.set(80, 11, 22); System.out.println(Hans.Name); 1.51 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. Beispiel: Mengen und Operationen 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>(); 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 } 1.52 Daten Funktionsräume Pierre Fierz • Mit den Datentypen DT1 und DT2 kann der Funktionsraum Fraum = {f |f : DT1 → DT2 } gebildet werden. Einleitung Datentypen Abgeleitete Typen Beispiel: Funktionsräume • Das nächste Beispiel zeigt wie man in C++ Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Funktionstypen definieren kann. #include <cmath> #include <iostream> typedef double (*realfunc)(double); int main() { realfunc fp; realfunc fp1; fp = &sin; fp1 = &cos; std::cout << fp(fp1(M_PI)) << std::endl; } 1.53 Outline Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.54 Daten Die lineare Liste Pierre Fierz • Eine lineare Liste besteht aus i-Tupel von Elementen eines Grundtyps GT Einleitung Datentypen • Im Gegensatz zum Array ist die Anzahl Elemente einer Abgeleitete Typen Weitere Datenstrukturen Liste variable. • Formal kann eine Liste folgendermassen definiert werden: ListeGT = ∞ [ Der Abstrakte Datentyp (ADT) GT i i=0 • Da i = 0 zugelassen ist, kann eine Liste auch leer sein. • Da Tupel geordnet sind kann man vom ersten, letzten und n-ten Element der Liste sprechen. • Wir können auch vom Vorgänger und Nachfolger eines Elements sprechen. 1.55 Die lineare Liste 2 Daten Pierre Fierz Einleitung 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 Der Abstrakte Datentyp (ADT) • Der Aufwand für die einzelnen Operationen hängt von der Repräsentation der Liste ab. 1.56 Daten Die lineare Liste 3 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 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Freier Speicher 1.57 Die lineare Liste 4 Daten Pierre Fierz • Verkettete Repräsentation: 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. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1.58 Daten Stack und Queue Pierre Fierz • Aus einer Liste kann man neue Datentypen ableiten, indem die Operationen eingeschränkt werden. Einleitung 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) Last-in-First-out). • Man braucht die Begriffe push und pop für das Einfügen und Löschen eines Elements. Sami push(Sami) Sami pop() Paul Paul Paul Peter Peter Peter Hans Hans Hans Fritz Fritz Fritz 1.59 Daten Stack und Queue 2 Pierre Fierz 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. • Die Queue wird häufig als FiFo-Struktur bezeichnet (FiFo Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) = First-in-First-out). write(Sami) Paul Peter Hans Fritz Sami Paul Peter Hans Fritz read() Sami Paul Peter Hans Fritz 1.60 Der Baum • Eine weitere wichtige Datenstruktur ist der Baum (engl. tree) • Der Baum ist dem Wesen nach eine zweidimensionale Struktur. Daten Pierre Fierz Einleitung Datentypen Abgeleitete Typen Definition 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). Der Abstrakte Datentyp (ADT) Wurzel ...... Unterbaum 1.61 Daten Der Baum 2 Pierre Fierz • Bäume werden als Graphen dargestellt • Dabei wird die Wurzel durch m Kanten (engl. edges) mit Einleitung Datentypen den Wurzeln der Unterbäume verbunden. Abgeleitete Typen Wurzel Weitere Datenstrukturen A Geschwister 1111 0000 0000 1111 0000 1111 Der Abstrakte Datentyp (ADT) Unterbaum B C D Hoehe E G F H I Innere Knoten J Blaetter 1.62 Der Baum 3 Daten 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 Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Die Tiefe (engl. depth) oder Höhe (engl. height) eines Baumes b ist definiert als: depth(b) := maxx∈b (level(x)) 1.63 Der Baum 4 Daten Pierre Fierz Einleitung Datentypen • 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)) 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. 1.64 Der binäre Baum Daten Pierre Fierz • Ein wichtiger Speziallfall von Bäumen sind die binären Bäume. Einleitung Datentypen 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. Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1.65 Daten Der binäre Baum 2 Pierre Fierz Beispiel: Diverse binäre Bäume Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 1 Binaerer Baum 3 Vollstaendiger binaerer Baum 2 Streng binaerer Baum 4 Fast vollstaendiger binaerer Baum 1.66 Darstellung von binären Bäumen 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; Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) ... } • Der Baum selbst kann nun folgendermassen definiert werden: public class BinTree<Element> { private BinTreeNode<Element> root; ... } 1.67 Traversieren von binären Bäumen Daten Pierre Fierz • Eine wichtige Operation für Bäume ist das Traversieren des Baumes. Einleitung Datentypen • Das heisst, besuchen aller Knoten und ausführen einer Aktion (z.B. ausdrucken der Information) • Da die Baumstruktur rekursiv definiert ist, liegt es natürlich 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 1 2 3 Behandle die Wurzel des Baumes Traversiere den linken Unterbaum in preorder Traversiere den rechten Unterbaum in preorder 1.68 Traversieren von binären Bäumen 2 Daten Pierre Fierz • Fortsetzung: Einleitung Postorder Traversierung 1 2 3 Traversiere den linken Unterbaum in postorder Traversiere den rechten Unterbaum in postorder Behandle die Wurzel des Baumes Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Inorder Traversierung 1 2 3 Traversiere den linken Unterbaum in inorder Behandle die Wurzel des Baumes Traversiere den rechten Unterbaum in inorder 1.69 Traversieren von binären Bäumen 3 • Der folgende Algorithmus implementiert die Traversierung eines binären Baumes in inorder. Algorithmus: Baumtraversierung Daten Pierre Fierz Einleitung Datentypen public class BinTreeNode<Element> { private Element info; private BinTreeNode<Element> left; private BinTreeNode<Element> right; ... Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public void traverse() { // Linker Unterbaum if (this.left != null) this.left.traverse(); // Ausgeben des Knotens System.out.println(info); // Rechter Unterbaum if (this.right != null) this.right.traverse(); } ... } 1.70 Daten Traversieren von binären Bäumen 4 Pierre Fierz Beispiel: Arithmetische Ausdrücke • Zu jedem arithmetischen Ausdruck gehört ein Syntaxbaum. • Die inneren Knoten repräsentieren die Operatoren Einleitung Datentypen Abgeleitete Typen • Die Blätter repräsentieren die Operanden. Weitere Datenstrukturen • Der folgende Baum repräsentiert den Ausdruck Der Abstrakte Datentyp (ADT) ((a + b) · c − d/e) · 7 01 − 7 01 c + a / d e b 1.71 Traversieren von binären Bäumen 5 Daten Pierre Fierz Beispiel: Arithmetische Ausdrücke (forts.) • Traversieren wir den Baum in Preorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten (Polnische Notation): · − · + abc/d e7 Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Traversieren wir den Baum in Postorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten (Umgekehrte polnische Notation): ab + c · d e/ − 7· • Traversieren wir den Baum in Inorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten (Infix Notation ohne Klammern): a + b · c − d /e · 7 1.72 Outline Daten Pierre Fierz Einleitung 1 Einleitung Datentypen Abgeleitete Typen 2 Datentypen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 3 Abgeleitete Typen 4 Weitere Datenstrukturen 5 Der Abstrakte Datentyp (ADT) 1.73 Definition ADT Daten Pierre Fierz Einleitung • Der abstrakte Datentyp (abgekürzt ADT) ist eines der wichtigsten Konzepte in der modernen Informatik. • Objektorientierte Sprachen unterstützen das Konzept. • Er dient dazu, Datentypen unabhängig von deren Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Implementation zu definieren. • Beispiele: Listen, Stacks, Queues usw. • Aber auch konkrete Objekte der Welt wie Personen, Motoren, Schrauben, Fahrzeuge usw. • Zwei wichtige Prinzipien: • Geheimnisprinzip • Wiederverwendbarkeit 1.74 Definition ADT 2 Daten Pierre Fierz • Das Geheimnisprinzip kann folgendermassen formuliert werden: Einleitung 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). Abgeleitete Typen Weitere Datenstrukturen 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. 1.75 Definition ADT 3 Daten Pierre Fierz • Das Prinzip der Wiederverwendbarkeit kann wie folgt formuliert werden: Einleitung Datentypen Abgeleitete Typen Definition Weitere Datenstrukturen Ein Datentyp soll in verschiedenen Applikationen wiederverwendbar sein, wenn ähnliche Probleme gelöst werden müssen. Der Abstrakte Datentyp (ADT) • 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.76 Daten Formale Spezifikation von ADTs Pierre Fierz • Die Wiederverwendbarkeit bedingt, dass die Funktionen eines ADTs genau beschrieben werden. • Das Geheimnisprinzip verlangt, dass die Spezifikation nicht aufgrund der Implementation geschieht. Einleitung Datentypen Abgeleitete Typen • Eine Beschreibung, die auf der Implementation basiert, führt oft zu einer Überspezifikation des Datentyps. Beispiel: Spezifikation eines Stacks aufgrund der Implementation Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) 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]; /* DT steht fuer irgend einen Datentyp */ }; void push(stack st, DT x) { ++st.stack_pointer; st.stack_element[st.stack_pointer] = x; } 1.77 Formale Spezifikation von ADTs 2 Daten Pierre Fierz • Die Beschreibung des Stacks durch seine Implementation ist genau • Der Datentyp Stack ist aber dadurch überspezifiziert • Da der Benutzer weiss, dass der Stack als Array impplementiert ist, kann er auf beliebige Element des Stacks zugreifen. Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • Ein solcher Zugriff widerspricht aber der Idee des Stacks. • Eine Spezifikation besteht aus einer Signatur und einer Semantik, die Bedeutung und Interaktion der Operationen festlegt. • Im folgenden wollen wir die folgenden Spezifikationsmethoden betrachten: 1 2 3 Mathematisch-axiomatische Methode Mathematisch-algebraische Methode Informelle Methode 1.78 Mathematisch-axiomatische Methode Daten Pierre Fierz • 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 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Elementen des Typs neue erzeugen. • Die Axiome sind in Preconditions und Equations aufgeteilt und beschreiben die Semantik des Typs. • Die Grundmenge der Objekte des Datentyps ist die Menge aller aus den Operationen erzeugbaren Objekte. • In der Mathematik wird ein solches System auch eine Termalgebra genannt. 1.79 Mathematisch-axiomatische Methode 2 Daten Pierre Fierz Beispiel: Spezifikation des Stacks TYPES Stack ELEMENT BOOLEAN // wird hier definiert // beliebiger Datentyp (generischer Parameter) Datentypen Abgeleitete Typen Weitere Datenstrukturen FUNCTIONS emptystack : empty : push : pop : top : 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)) AXIOMS ∀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.80 Mathematisch-axiomatische Methode 3 Daten Pierre Fierz Beispiel: Spezifikation der Queue TYPES Queue ELEMENT BOOLEAN // wird hier definiert // beliebiger Datentyp (generischer Parameter) Datentypen Abgeleitete Typen Weitere Datenstrukturen FUNCTIONS emptyqueue : empty : enqueue : dequeue : head : Einleitung 7→ Stack Queue 7→ BOOLEAN ELEMENT × Queue 7→ Queue Queue ,→ Queue Queue ,→ ELEMENT Der Abstrakte Datentyp (ADT) PRECONDITIONS ∀q ∈ Queue : pre dequeue(q) : ¬(empty (q)) pre head(q) : ¬(empty (q)) AXIOMS ∀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) 1.81 Mathematisch-algebraische Methode Daten Pierre Fierz • Die algebraische Methode unterscheidet sich von der axiomatischen nur in der Angabe der Semantik. • Die inhaltliche Bedeutung der Operationen wird hierbei durch mathematische Mittel, Matrizen, Vektoren, Folgen, etc. definiert. • Ein Repräsentant dieser Methode ist die Java Modelling Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) Language (JML) • JML ist auf die Sprache Java zugeschnitten • Die JML Anweisungen werden als Annotationen im Code geschrieben. • Der Formalismus von JML ist nicht mathematisch sondern Java ähnlich. • Zu JML existieren viele Tools zum testen oder beweisen ob die Implementation der Spezifikation entspricht. 1.82 Mathematisch-algebraische Methode 2 Daten Pierre Fierz Beispiel: Stack algebraische Spezifikation TYPES Stack ELEMENT BOOLEAN // wird hier definiert // beliebiger Datentyp (generischer Parameter) Einleitung Datentypen Abgeleitete Typen FUNCTIONS emptystack : empty : push : pop : top : 7→ Stack Stack 7→ BOOLEAN ELEMENT × Stack 7→ Stack Stack ,→ Stack Stack ,→ ELEMENT Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) SPECIFICATION Sets ELEMENT beliebiege Menge S = {<>} ∪ {< x1 , . . . , xn > |xi ∈ ELEMENT ∧ n ∈ N1 } Functions 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 Mathematisch-algebraische Methode 3 Daten Pierre Fierz Beispiel: Queue algebraische Spezifikation TYPES Queue ELEMENT BOOLEAN // wird hier definiert // beliebiger Datentyp (generischer Parameter) Einleitung Datentypen Abgeleitete Typen FUNCTIONS emptyqueue : empty : enqueue : dequeue : head : 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 } 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 > 1.84 Informelle Methode Daten Pierre Fierz 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 Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) • 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 eindeutig ist. 1.85 Informelle Methode 2 Daten Pierre Fierz Beispiel: Informelle Spezifikation des Stacks 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) /** Preconditions: none * Postconditions: none * @return true falls keine Elemente im Stack sind. */ public boolean empty(); /** Preconditions: none * Postconditions: none * @return true falls kein Element eingefuegt werden kann. * */ public boolean full(); 1.86 Informelle Methode 3 Daten Pierre Fierz Beispiel: Informelle Spezifikation des Stacks (forts.) 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 Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) /** 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; /** Preconditions: empty() == false * Postconditions: none * @return old.top() (Oberstes Element des Stacks) */ public Element top() throws StackEmptyException; } 1.87 Informelle Methode 4 Daten Pierre Fierz Beispiel: Bounded Implementation mit Array public class BoundedStack<Element> implements Stack<Element> { private int maxsize; private int sp; private Element[] st; public BoundedStack(int size) { maxsize = size; sp = -1; st = (Element[])new Object[size]; } Einleitung Datentypen Abgeleitete Typen Weitere Datenstrukturen Der Abstrakte Datentyp (ADT) public boolean full() { return sp+1 == maxsize; } public boolean empty() { return sp == -1; } public void push(Element e) throws StackFullException { if (full()) throw new StackFullException(); st[++sp] = e; } 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.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