Kapitel 8 ABSTRAKTE DATENTYPEN Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm Übersicht 1 1. Einführung 2. Algorithmen 3. EigenschaCen von Programmiersprachen 4. Algorithmenparadigmen 5. Suchen & SorJeren 6. Hashing 7. Komplexität von Algorithmen 8. Abstrakte Datentypen (ADT) 9. Listen 10. Bäume 11. Graphen Lernziele des Kapitels 2 2 ¨ ¨ ¨ ¨ ¨ Sie lernen die Bedeutung von Datentypen? Sie können nachvollziehen, wozu man ADT braucht. Sie verstehen wie man ADT definiert. Sie können selbst ADT definieren. Sie können ADT in Java implemenJeren. Inhalt 3 o Datentypen ¤ ¤ MoJvaJon EigenschaCen o Was sind abstrakte Datentypen Beschreibung von ADT o ImplemenJerung von ADT in Java o Datentypen in Java 5 o Einfach ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ Boolean Integer Long integer Short integer Byte Double Float Character true, false -­‐3, 9, 4, 2345, Integer.MAX_VALUE, … 2.45, 0.123, 0.11E-­‐04 'a', '8', '&', …, 65, 66, Datentypen in Java 6 o Strings Arrays o Vector u.a. o "abc", "", "Ab&", … int [4] Datentyp Integer 1/3 7 o o o Werte, Datenbereich: 1, 2, -­‐54, … OperaJonen auf Integer +, -­‐, *, /, ==, >, <, Regeln ¤ Punkt-­‐vor-­‐Strich ¤ AssoziaJv-­‐/KommutaJv-­‐/DistribuJvgesetz ¤ TransiJvität Datentyp Integer 2/3 8 ¨ ImplemenJerung (Auswahl) ¤ Interne Darstellung n Binär 100101001 n 1. Zeichen Vorzeichen ¤ AddiJon n Halbaddierer ¤ MulJplikaJon mit 2 n shiC nach links 0101 * 2 à 1010 Datentyp Integer 3/3 9 o Integer ¤ Werte ¤ OperaJonen ¤ Regeln ¤ ImplemenJerungsdetails Für den Programmentwickler … …wichtig …unwichtig Datentyp Menge 1/2 10 o o o Werte, Datenbereich: ¤ Zahlen Menge von Zahlen ¤ 0, 1, 2, … {}, {1, 3, 5}, … OperaJonen auf der Menge ¤ erzeugen, einfügen, wegnehmen, schauen-­‐ob-­‐leer, … Regeln ¨ ¨ ¨ Eine leere Menge erzeugt à Menge ist leer. Eine Zahl wird in Menge eingefügt à Menge ist nicht leer. Menge ist leer, eine Zahl wird eingefügt, diese Zahl wird weggenommen à Menge leer. ? 11 o Datentyp Menge 2/2 ImplemenJerung ? WichJg bei Datentypen… 12 o …ist, was sie tun nicht, wie sie es tun (= Schnizstelle) (= ImplemenJerung) Abstrakte Datentypen w Abstraktion l l ADT abstrahieren von Implementierung. Wird in der Informatik häufig verwendet: ð „Bit“ abstrahiert von physikalischen Zuständen. ð CPU abstrahiert von einer Menge von Bits und deren Zustandsänderungen. ð Java Virtual Machine abstrahiert von konkreter CPU. ADT -­‐ DefiniJon 1/3 13 o Datentyp ¤ Die in einer Programmiersprache vorhandenen n Grundtypen, wie int, boolean, real, char, …, und n Strukturierungsmethoden, wie array, struct, … und die darauf definierten OperaJonen wie + (AddiJon, StringkonkatenaJon), *, sqrt, [] (SelekJon), … Anmerkung: ¤ Datentypen hängen von der Programmiersprache ab. ¤ Es gibt heute ein Verständnis über „übliche“ Datentypen: n ganze Zahlen, Fließkommazahlen, Zeichen, Zeichenkezen. n Gruppierung gleicharJger und verschiedener Datentypen. DefiniJon 2/3 14 o ADT (abstrakter Datentyp) ¤ Ein Datentyp, d.h. n eine Menge von Werten und n OperaLonen auf diesen Werten, n der nur über eine SchniMstelle zugänglich ist, sowie n Regeln über die Wirkung der OperaJonen auf den Werten. o ImplemenLerung (eines ADT) ¤ Ein Programm, das den Datentyp realisiert. Anmerkung ¤ Zur ImplemenJerung eines ADT werden typischerweise Datenstrukturen aus vorhandenen Datentypen gebildet, z.B. int A [] = new int[10]; int length = 0; DefiniJon 3/3 15 o Signatur Eine Liste mit n dem Namen, n der Typen der Eingabewerte, und n des Rückgabewertes einer FunkJon. Beispiel 1/3 16 o Punkte im kartesischen Koordinatensystem ¤ Typen Punkte ¤ Importe IR , Wahrheitswerte ¤ FunkJonen neu IR × IR → Punkt ¤ Regeln X-Wert Punkt → IR Y-Wert Punkt → IR ist-Ursprung Punkt → Wahrheitswert Abstand-von Punkt × Punkt → IR verschiebe Punkt × IR ×IR → Punkt Beispiel 2/3 17 o Liste von Zeichen ¤ Typen ¤ Importe ¤ FunkJonen ¤ Regeln Liste Character, Integer, Boolean empty addFirst removeFirst getFirst isEmpty length clone → Liste Liste × Character → Liste Liste → Liste Liste → Character Liste → Boolean Liste → Integer Liste → Liste isEmpty(empty) = true getFirst(addFirst(L, a)) = a isEmpty(removeFirst(addFirst(empty, e))) = true length(addFirst(L, e)) = length(L)+1 Beispiel 3/3 18 o Menge von Zeichen ¤ Typen ¤ Importe ¤ FunkJonen ¤ Regeln Set Character, Integer, Boolean emptySet add remove isEmpty card contains clone → Set Set × Character → Set Set × Character → Set Set → Boolean Set → Integer Set × Character → Boolean Set → Set NotaJon 1/2 19 <ADT> ::= <Name> ::= <List of Types> ::= <Type> ::= <List of FuncJons> ::= <FuncJon> ::= <Name> Types FuncJons Axioms <List of Types>”.” <List of FuncJons>”.” <Ruleset>”.”. <String>. <Type>| <List of Types>”,”<Type>. <String>. <FuncJon>| <List of FuncJons>”,”<FuncJon>. <Signature>. NotaJon 2/2 20 <Ruleset> ::= <List of Axioms > ::= < Axiom> ::= <Theory> ::= <Theory>|<List of Axioms>. < Axiom >| <List of Axioms >”,”< Axiom>. <boolean Expression>. <Text>. Gemeint ist eine mathematische Theorie, z.B. die Mengenlehre; diese besteht auch aus Axiomen, Gesetzen, etc. Im Rahmen der ADT wird dies einfach als Text notiert Ausdruck, der wahr zurückliefert (Boolesche Ausdrücke können wahr oder falsch zurückliefern, Axiome sind spezielle Ausdrücke, die immer wahr zurückliefern Beispiel POINT (erster Versuch) 21 POINT o Type ¤ POINT w Imports l REAL, BOOL w Functions l create REAL, REAL à POINT l get_x POINT à REAL l get_y POINT à REAL l is-origin POINT à BOOL l distance POINT, POINT à REAL w Axioms l get_x (create (x, y)) = x l get_y (create (x, y)) = y l is-origin (create (x, y)) = true ⇔ x = 0 ∧ y = 0 etc. etc. ADT: Types/Imports 22 o o o Im ADT verwendete Typen Types ¤ „neue“ Typen (oC nur einer) Imports ¤ Basistypen ¤ OC: Elemenzyp Liste, Punkt Boolean, Integer Character, Adresse (à ADT) ADT: FuncJons 23 o o Im ADT definierte FunkJonen Angabe der DefiniJons-­‐ und Wertebereiche ¤ NotaJon «Name»: «DefiniJonsbereich» → «Wertebereich» ¤ DefiniJonsbereich mit einem Typ «Type» ¤ DefiniJonsbereich mit mehreren Typen «Type1» × «Type2» … ¤ Wertebereich ist ein Typ «Type» append: Liste × Integer → Liste ADT: Axioms 24 o o Beschreibt die Wirkung der FunkJonen des ADT NotaJon ¤ (Natürliche Sprache) ¤ MathemaJsch • add (M, i) = M ∪ {i} ¤ Algorithmisch • isempty (add (M, i)) == false • contains (add (M, i), i) == true Set Set Set Beispiel POINT 1/2 25 POINT o Type ¤ POINT o Imports ¤ REAL, BOOL, STRING o FuncJons ¤ create ¤ get_x ¤ get_y ¤ get_r ¤ get_theta REAL, REAL POINT POINT POINT POINT à à à à à POINT REAL REAL REAL REAL Beispiel POINT 2/2 26 is-­‐origin POINT à BOOL ¤ translate POINT, REAL, REAL à POINT ¤ distance POINT, POINT à REAL ¤ toString POINT à STRING Axioms ¤ get_x (create (x, y)) = x ¤ get_y (create (x, y)) = y ¤ is-­‐origin (create (x, y)) = true ⇔ x = 0 ∧ y = 0 ¤ translate (create (x, y), a, b) = create (x+a, y+b) 2 2 ¤ distance (create (x, y), create (z, w) ) = sqrt ((x -­‐ z) + (y -­‐ w) ) ¤ etc. ¤ o Beispiel POINT ImplemenJerung 1/2 27 implementaLon module Point export type Point; export funcLon create, get_x, get_y, etc. begin type Point = struct begin real x // x-­‐Wert real y // y-­‐Wert end struct; … Beispiel POINT ImplemenJerung 2/2 28 funcLon Point create (real x, y) begin Point p = new Point; p.x = x; p.y = y; return p; end funcLon funcLon real get_x (Point p) begin return p.x end … end module Beispiel SET 1/2 32 SET o o Type ¤ SET FuncJons ¤ EmptySet ¤ add ¤ delete ¤ contains ¤ is-­‐empty SET × INTEGER SET × INTEGER INTEGER SET à à à à à SET SET SET BOOL BOOL Beispiel SET 2/2 33 o Axioms ¤ isempty (create ()) == true ¤ isempty (add (M, c)) == false ¤ add (add (M, c), c) == add (M, c) ¤ … ADT in Java 1/2 34 o o ADT = ¤ Gekapselt ¤ Schnizstelle ¤ verborgene ImplemenJerung = Objekt ¤ Gekapselt ¤ public ¤ private ADT als Objekt (Signaturen der public Methoden/ public Daten) realisiert ADT in Java 2/2 35 o o o Mit Java wird ein ADT implemenJert Typen und FunkJonen müssen angeboten werden; Importe müssen verwendet werden; à für Benutzer nutz-­‐ (und damit sicht-­‐)bar Axiome müssen eingehalten werden à für Benutzer erfahrbar Beispiel POINT 1/7 36 POINT o Type ¤ POINT w Imports l Ein-/Ausgabe einer Funktion REAL, ADT BOOL Klassenname public class Point { ... public double f (...) { ... } } JAVA Beispiel POINT 2/7 37 POINT o FuncJons -­‐ create REAL, REAL à POINT ADT Konstruktor (implizit vom Typ Point) public class Point { ... public Point (double x, double y) { ... } } JAVA Beispiel POINT 3/7 38 POINT o FuncJons ¤ get_x POINT à REAL ADT ? public class Point { ... public double get_x ... } } () { JAVA Beispiel POINT 4/7 39 POINT o FuncJons ¤ get_x POINT à REAL ADT Instanz von Point public class Point { ... public double get_x ... } } () { JAVA Beispiel POINT 5/7 40 POINT o FuncJons ¤ translate POINT, REAL, REAL public class Point { ... void translate ( double dx, double dy) { ... } } à POINT ADT JAVA Beispiel POINT 6/7 41 POINT o FuncJons ¤ translate POINT, REAL, REAL à POINT public class Point { ... Point translate ( double dx, double dy) { ... } } ADT JAVA Beispiel POINT 7/7 42 POINT o Axioms ¤ get_x (create (x, y)) = x ¤ get_y (create (x, y)) = y ¤ is-­‐origin (create (x, y)) = true ⇔ x = 0 ∧ y = 0 ADT Keine Axiome o.ä. Angabe der Funktion über Kommentar (z.B. javadoc) /** * get_x () – liefert X-Wert * JAVA ADT in Java 1/6 44 ADT JAVA o Typen Klassenname o Importe nicht vorhanden – einfach verwenden o FunkJonen -­‐ öffentliche Konstruktoren -­‐ Signaturen der öffentlichen Klassenmethoden o Axiome nicht vorhanden – nur Kommentar ADT in Java 2/6 45 o ADT JAVA Signatur Angabe aller Typen Signatur Angabe aller Typen AUSSER dem Typ der Instanz ADT JAVA ADT in Java 3/6 46 o JAVA interfaces ¤ beschreiben in JAVA Schnizstellen ¤ Bsp. interface ListInterface { public void addFirst (int value); public int getFirst (); } ¤ Ist ein Interface ein ADT? n Types J n Imports L n FuncJons K „public“ Methoden …jedoch „fehlt“ der Konstruktor n Axioms L ADT in Java 4/6 47 LIST o Elementtyp (Platzhalter) Type ¤ LIST, E, BOOL public class ... } List ADT <E> { JAVA ADT in Java 5/6 48 public class List <E> { private ListElem <E> head; public List () { head = null; } public void addFirst (E val) { head = new ListElem <E> (val, head); } ... ADT in Java 6/6 49 ... public E getFirst () { if (head != null) { return head.value } else { return null } } public boolean isEmpty () { return head == null } ... Zusammenfassung 50 o o Abstrakte Datentypen sind von zentraler Bedeutung für die Realisierung komplexer Strukturen. Ein ADT n Hat eine Menge von Werten. n Hat OperaJonen auf diesen Werten. n Ist nur über eine Schnizstelle zugänglich. n Ist gekapselt. n Definiert seine OperaJonen über eine Schnizstelle. n Hat eine verborgene ImplemenJerung. o Das Konzept der ADT lässt sich durch objektorienJerte Programmiersprachen direkt umsetzen.