Algorithmen und Datenstrukturen I Abstrakte Datentypen D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Winter 2009/10, 22. November 2009, c 2009/10 D.Rösner D. Rösner AuD I 2009/10... 1
Gliederung 1 2 s im Alltag ADT 3 s im Alltag ADT D. Rösner AuD I 2009/10... 2
Abstrakte Datentypen abstrakte Datentypen kurz oft nur ADT genannt sind im Unterschied zu den bisher betrachteten konkreten Datentypen nicht an eine bestimmte Repräsentation gebunden ADTs werden implizit definiert durch die Menge der auf ihnen zugelassenen Operationen: Konstruktoren, Selektoren, Prädikate diese werden auch als das Interface des ADT bezeichnet... D. Rösner AuD I 2009/10... 3
Abstrakte Datentypen abstrakte Datentypen... nur das Interface wird Nutzern offengelegt die interne Struktur die sog. Implementierung des ADT bleibt verborgen (Kapselung, information hiding ) und könnte jederzeit geändert werden solange das Interface unverändert bleibt, ist Code, der den ADT nutzt, davon nicht betroffen m.a.w.: ADTs dienen der Modularisierung D. Rösner AuD I 2009/10... 4
Abstrakte Datentypen in Haskell in Haskell können ADTs durch Haskell-Module realisiert werden ein Modul in Haskell definiert eine Menge von Funktionen und Datentypen in einer geschlossenen Umgebung ein Modul kann alle oder auch nur einige ausgewählte seiner Definitionen exportieren definiert wird ein Modul in Haskell durch module <name> (<exportliste>) where <definitionen> D. Rösner AuD I 2009/10... 5
ADT s im Alltag ADT... dt. Stapel im folgenden einige Beispiele aus dem Alltag D. Rösner AuD I 2009/10... 7
: Alltagsbeispiele s im Alltag ADT Quelle: http://www.fromoldbooks.org/pictures-of-old-books/pages/ D. Rösner AuD I 2009/10... 8
: Alltagsbeispiele s im Alltag ADT Quelle: http://www.rotten.com/library/culture/the-simpsons/homer-pez-dispenser.jpg D. Rösner AuD I 2009/10... 9
: Alltagsbeispiele s im Alltag ADT Quelle: http://www.pacificcatering.com.au/files/categories/md/ D. Rösner AuD I 2009/10... 10
ADT s im Alltag ADT abstrakter Datentyp Ein ist eine homogene Sammlung von Objekten, auf denen zwei zentrale Operationen definiert sind: Definition push x s füge x als neues oberstes Element in den s ein und gib den veränderten mit x als oberstem Element (sog. top) zurück pop s entferne das aktuelle oberste Element vom und gib den veränderten ohne x als oberstem Element als Wert zurück; Fehler, falls leer s.a. [RL99], Ch. 5 D. Rösner AuD I 2009/10... 12
ADT s im Alltag ADT abstrakter Datentyp realisiert das LIFO-Prinzip: last-in, first-out weitere Definitionen: das oberste Element eines s s wird durch den Selektor top s geliefert (dieses bleibt aber auf dem ) mit dem Konstruktor empty wird ein leerer kreiert das Prädikat stackempty prüft, ob ein noch Elemente enthält oder nicht manchmal kann auch noch mit size die Anzahl der Elemente auf dem erfragt werden s.a. [RL99], Ch. 5 bzw. [GT01], Ch. 4 D. Rösner AuD I 2009/10... 13
ADT s im Alltag ADT s and queues are among the simplest of all data structure, but are also among the most important. ([GT01], p. 136) wegen ihrer Bedeutung oft sogar in Hardware in den sog. Mikroinstruktionen in der CPU implementiert zentrales Element in vielen Programmierumgebungen, so z.b. in Hugs, aber auch in der Java Virtual Machine (JVM) s.a. [GT01], Ch. 4 D. Rösner AuD I 2009/10... 14
ADT s im Alltag ADT Beispiele für Verwendung von s: mit offenen Frames verschachtelter (rekursiver) Aufrufe von Funktionen sog. Operandenstack beim Auswerten arithmetischer Ausdrücke wie ((a + b)*(c + d))/e Speichern kürzlich besuchter WWW-Seiten in einem in einem Webbrowser Undo-Mechanismus in Texteditoren realisiert über einen mit den Operationen zur Textänderung s.a. [GT01], Ch. 4 D. Rösner AuD I 2009/10... 15
ADT s im Alltag ADT Bedeutung von pop als engl. Verb (aus WordNet 2.0): The verb pop has 13 senses (first 4 from tagged texts) 1. (3) protrude, pop, pop out, bulge, bulge out, bug out, come out -- (bulge outward; "His eyes popped") 2. (3) pop -- (hit a pop-fly; "He popped out to shortstop") 3. (1) pop -- (make a sharp explosive noise; "The cork of the champagne bottle popped") 4. (1) pop -- (fire a weapon with a loud explosive noise; "The soldiers were popping") 5. pop -- (cause to make a sharp explosive sound; "He popped the champagne bottle") 6. crop up, pop up, pop -- (appear suddenly or unexpectedly; "The farm popped into view as we turned the corner"; "He suddenly popped up out of nowhere") D. Rösner AuD I 2009/10... 16
ADT s im Alltag ADT Bedeutung von pop als engl. Verb (aus WordNet 2.0) (cont.): 7. pop -- (put or thrust suddenly and forcefully; "pop the pizza into the microwave oven"; "He popped the petit-four into his mouth") 8. pop -- (release suddenly; "pop the clutch") 9. pop -- (hit or strike; "He popped me on the head") 10. toss off, pop, bolt down, belt down, pour down, down, drink down, kill -- (drink down entirely; "He downed three martinis before dinner"; "She killed a bottle of brandy that night"; "They popped a few beer after work") 11. pop -- (take drugs, especially orally; "The man charged with murder popped a valium to calm his nerves") 12. pop -- (cause to burst with a lound, explosive sound; "The child popped the balloon") 13. pop -- (burst open with a sharp, explosive sound; "The balloon popped"; "This popcorn pops quickly in the microwave oven") D. Rösner AuD I 2009/10... 17
ADT s im Alltag ADT die Modul-Definition (s.a. [RL99], Ch. 5): module (,push,pop,top,empty,stackempty) where empty:: a stackempty:: a -> Bool push :: a -> a -> a pop :: a -> a top :: a -> a D. Rösner AuD I 2009/10... 19
ADT s im Alltag ADT mit einem Konstruktor data a = EmptyStk Stk a ( a) empty = EmptyStk stackempty EmptyStk = True stackempty _ = False D. Rösner AuD I 2009/10... 20
ADT s im Alltag ADT mit einem Konstruktor (cont.) push x s = Stk x s pop EmptyStk = error "pop from an empty stack" pop (Stk _ s) = s top EmptyStk = error "top from an empty stack" top (Stk x _) = x D. Rösner AuD I 2009/10... 21
ADT s im Alltag ADT Alternative durch Liste: newtype a = Stk [a] empty = Stk [] stackempty (Stk []) = True stackempty (Stk _ ) = False D. Rösner AuD I 2009/10... 22
ADT s im Alltag ADT Alternative durch Liste (cont.): push x (Stk xs) = Stk (x:xs) pop (Stk []) = error "pop from an empty stack" pop (Stk (_:xs)) = Stk xs top (Stk []) = error "top from an empty stack" top (Stk (x:_)) = x D. Rösner AuD I 2009/10... 23
ADT s im Alltag ADT Beispiel eine mit deriving gewonnene show-funktion würde die offenlegen daher Definition einer eigenen Darstellung für s für die mit Konstruktor: instance (Show a) => Show ( a) where showsprec p EmptyStk str = showchar - str showsprec p (Stk x s) str = shows x (showchar (shows s str)) D. Rösner AuD I 2009/10... 24
ADT s im Alltag ADT Beispiel Definition einer eigenen Darstellung für s für die mit Liste: instance (Show a) => Show ( a) where showsprec p (Stk []) str = showchar - str showsprec p (Stk (x:xs)) str = shows x (showchar (shows (Stk xs) str)) D. Rösner AuD I 2009/10... 25
ADT s im Alltag ADT... dt. Schlange (im Sinne von Warteschlange) im folgenden einige Beispiele aus dem Alltag D. Rösner AuD I 2009/10... 27
: Alltagsbeispiele s im Alltag ADT Quelle: http://www.istockphoto.com/ D. Rösner AuD I 2009/10... 28
: Alltagsbeispiele s im Alltag ADT Waiting queue in front of the Science Express Quelle: www.science-express.com/.../2008/02/amit5.jpg D. Rösner AuD I 2009/10... 29
: Alltagsbeispiele s im Alltag ADT Quelle: http://www.cartoonstock.com/newscartoons/cartoonists/kty/lowres/ktyn35l.jpg D. Rösner AuD I 2009/10... 30
ADT s im Alltag ADT abstrakter Datentyp Eine ist ähnlich wie ein eine homogene Sammlung von Objekten, auf denen zwei zentrale Operationen definiert sind: Definition enqueue x q füge x als neues letztes Element hinten (rear) an die q an und gib die veränderte zurück dequeue q entferne das aktuelle erste Element (front) aus der und gib die veränderte als Wert zurück; Fehler, falls leer s.a. [RL99], Ch. 5.3 D. Rösner AuD I 2009/10... 32
ADT s im Alltag ADT abstrakter Datentyp realisiert das FIFO-Prinzip: first-in, first-out weitere Definitionen: das erste Element einer q wird durch den Selektor front q geliefert (aber nicht aus der entfernt) mit dem Konstruktor empty wird eine leere kreiert das Prädikat queueempty prüft, ob eine noch Elemente enthält oder nicht manchmal kann auch noch mit size die Anzahl der Elemente in der erfragt werden s.a. [RL99], Ch. 5.3 bzw. [GT01], Ch. 4.2 D. Rösner AuD I 2009/10... 33
ADT s im Alltag ADT Beispiele für Verwendung von s: Behörden, Läden, Theater, aber auch Mensen, Prüfungsämer u.ä. bedienen ihre Kunden üblicherweise nach dem FIFO-Prinzip als Datenstruktur geeignet für Verwaltung aller Arten von Transaktionen nach diesem Prinzip z.b. Verwaltung eingehender (telefonischer) Anfragen bei einem Reservierungssystem oder sonstigen Call-Center s.a. [GT01], Ch. 4.2 D. Rösner AuD I 2009/10... 34
ADT s im Alltag ADT die Modul-Definition (s.a. [RL99], Ch. 5.3): module (,empty,queueempty, enqueue,dequeue,front) where empty :: a queueempty :: a -> Bool enqueue :: a -> a -> a dequeue :: a -> a front :: a -> a D. Rösner AuD I 2009/10... 36
ADT s im Alltag ADT durch Liste: newtype a deriving Show = Q [a] empty = Q [] queueempty (Q []) queueempty (Q _ ) = True = False D. Rösner AuD I 2009/10... 37
ADT s im Alltag ADT durch Liste (cont.): enqueue x (Q q) = Q (q ++ [x]) dequeue (Q (_:xs)) = Q xs dequeue (Q []) = error "dequeue: empty queue" front (Q (x:_)) = x front (Q []) = error "front: empty queue" D. Rösner AuD I 2009/10... 38
ADT s im Alltag ADT durch Liste (cont.): Nachteil dieser Aufwand für enqueue ist O(n) denn:......... alle anderen Operationen haben konstanten Aufwand (O(1)) D. Rösner AuD I 2009/10... 39
ADT s im Alltag ADT Alternative durch ein Paar von Listen: Idee: erste Liste repräsentiert den Anfangsteil der, zweite den hinteren Teil in umgedrehter Ordnung an den hinteren Teil kann dann mit konstantem Aufwand angefügt werden wird der Anfangsteil der leer, dann wird der hintere Teil (einmal) umgedreht und zum Anfangsteil gemacht D. Rösner AuD I 2009/10... 40
ADT s im Alltag ADT wird für reverse eine mit linearem Aufwand verwendet, dann ist der durchschnittliche Aufwand über eine Sequenz von -Operationen O(1), im schlechtesten Fall kann er aber O(n) betragen (vgl. [RL99], Ch. 5.3) D. Rösner AuD I 2009/10... 41
ADT s im Alltag ADT Alternative durch ein Paar von Listen (cont.): newtype a = Q ([a],[a]) enqueue x (Q ([],[])) = Q ([x],[]) enqueue y (Q (xs,ys)) = Q (xs,y:ys) dequeue (Q ([],[])) = error "dequeue:empty queue" dequeue (Q ([],ys)) = Q (tail(reverse ys), []) dequeue (Q (x:xs,ys)) = Q (xs,ys) D. Rösner AuD I 2009/10... 42
ADT s im Alltag ADT Alternative durch ein Paar von Listen (cont.): queueempty (Q ([],[])) = True queueempty _ = False empty = Q ([],[]) front (Q ([],[])) = error "front:empty queue" front (Q ([],ys)) = last ys front (Q (x:xs,ys)) = x D. Rösner AuD I 2009/10... 43
ADT s im Alltag ADT Alternative durch ein Paar von Listen (cont.): Definition der gedruckten Darstellung in Analogie zu der bei der Listenimplementation durch deriving abgeleiteten instance (Show a) => Show ( a) where showsprec p (Q (front, rear)) str = showstring "Q " (showlist (front ++ reverse rear) str) D. Rösner AuD I 2009/10... 44
Literatur: I s im Alltag ADT Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2001. ISBN 0-471-38367-8; 2nd edition. Fethi Rabhi and Guy Lapalme. Algorithms A Functional Programming Approach. Pearson Education Ltd., Essex, 1999. 2nd edition, ISBN 0-201-59604-0. D. Rösner AuD I 2009/10... 45