Überblick Abstrakte Datentypen und Datenstrukturen Professor Dr. Petra Mutzel Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund • ADT Sequence • ADT Stack • ADT Queue • ADT Dictionary Realisierung mit - Feldern - verketteten Listen • Theoretische Laufzeitanalyse 3. VO DAP2 SS 2008 Petra Mutzel 15. April 2008 DAP2 SS08 1 Petra Mutzel DAP2 SS08 2 Motivation Abstrakte Datentypen „Warum soll ich hier bleiben?“ Grundlage für alles Weitere!!! • Ein abstrakter Datentyp (ADT) besteht aus einem Wertebereich (d.h. einer Menge von Objekten) und darauf definierten Operationen. „Das kenne ich ja schon alles!“ • Die Menge der Operationen bezeichnet man auch als Schnittstelle des Datentyps. Auch die Analyse? Tipp: Beliebte Klausuraufgabe: „Realisieren Sie den ADT XXX mit einfach verketteten Listen der Form YYY (nicht ringförmig). Analyse!“ Petra Mutzel DAP2 SS08 • Eine Datenstruktur ist eine Realisierung bzw. Implementierung eines ADT. 3 Der ADT Sequence DAP2 SS08 4 Operationen des ADT Sequence • Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. • S=<a1,a2,…,an> Petra Mutzel • INSERT(val x, pos p): pos – Einfügen eines Elements x vor dem Element an Position p Leere Sequenz: < > • INSERT(x,pos(ai)): S=<a1,a2,…ai-1,x,ai,…,an> • INSERT(x,nil): S=<a1,a2,…,an,x> • Operationen: • DELETE(pos p) – Im folgenden betrachten wir die Sequence S=<a1,a2,…,an> mit Grundtyp val – Löscht das Element an Position p (p≠nil). • DELETE(pos(ai)): S=<a1,a2,…ai-1,ai+1,…,an> Petra Mutzel DAP2 SS08 5 Petra Mutzel DAP2 SS08 6 1 Operationen des ADT Sequence Realisierung durch Felder • Interne Repräsentation: • GET(int i): val – Gibt das Element an i-ter Stelle zurück (1≤i≤n) – Speicherung als Array der Dimension maxN – Position wird durch Feldindex angegeben • GET(i): ai • Leeres Feld: n:=0 • CONCATENATE(Seq S´) – Hängt die Sequence S´ hinten an S an (müssen gleichen Grundtyp besitzen) 1 • CONCATENATE(S´): Falls S´=<a´1,a´2,…,a´m>, dann: <a1,a2,…an,a´1,…,a´m> Petra Mutzel DAP2 SS08 2 3 i n a1 a2 a3 … ai … an 7 Petra Mutzel 2 3 4 5 6 7 D A 2 P n= 8 9 10 – Speicherung als doppelt verkettete Liste – vorwärts und rückwärts ringförmig verkettet I S T G U T Procedure INSERT(val x, int t):int if n=maxN then throw Overflow Exc. for i:=n downto t { A[i+1]:=A[i] } A[t]:=x n:=n+1 return t Petra Mutzel head DAP2 SS08 a1 x … … a1 Laufzeitanalyse des ADT Sequence Best-Case a2 an … • Leere Liste: head→nil • 1-elementige Liste: head p q … a2 9 Beispiel: INSERT(x,p):q a1 8 • Interne Repräsentation: maxN Realisierung der Operationen: s. TeX-Folien bzw. Skript head DAP2 SS08 Realisierung durch Listen Beispiel: INSERT(P,3):3 1 maxN an Realisierung der Operationen: s. TeX-Folien bzw. Skript Ausschnitt: … if head=nil then head:=q.next:=q.prev:=q else if p=head then head:=q if p=nil then p:=head // hinten einfügen = vor head q.next:=p; q.prev:=p.prev q.next.prev:=q.prev.next:=q … Operation Felder Average-Case Worst-Case Listen Felder Listen Initialisierung Θ(1)+Alloc Θ(1) Θ(1)+Alloc Θ(1) INSERT Θ(1) Θ(1) Θ(n) Θ(1) DELETE Θ(1) Θ(1) Θ(n) Θ(1) GET Θ(1) Θ(1) Θ(1) Θ(n) CONCAT Θ(1+S´.n) Θ(1) Θ(1+S´.n) Θ(1) ⇒ bei Einfügen und Entfernen: Listen besser als Arrays 2 Der ADT Stack Operationen des ADT Stack „Stack“: Stapelspeicher, LIFO-Speicher • PUSH(val x) • Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. Leerer Stack: < > • S=<a1,a2,…,an> • PUSH(x): S=<a1,a2,…an,x> • POP() : val – Gibt das oberste Element des Stacks zurück und entfernt es (n>0). • Operationen: – Im folgenden betrachten wir den Stack S=<a1,a2,…,an> mit Grundtyp val Petra Mutzel – Legt ein neues Element x auf den Stack • POP(): an • ISEMPTY() : bool DAP2 SS08 14 – Gibt true zurück, falls S leer ist; sonst false. Beispiel: PUSH(P) Realisierung des ADT Stack durch Felder 1 • Interne Repräsentation: 2 3 4 5 6 7 D A 2 – Speicherung als Array der Dimension maxN – Position wird durch Feldindex angegeben P 2 3 i n a1 a2 a3 … ai … an Procedure PUSH(val x) if n=maxN then throw Overflow Exception n:=n+1 A[n]:=x maxN wie bei ADT Sequence, nur einfacher (s. Skript) Petra Mutzel DAP2 SS08 Realisierung der Operationen: s. TeX-Folien bzw. Skript 16 Beispiel: PUSH(x) Realisierung des ADT Stack durch Listen • Interne Repräsentation: head – Speicherung als doppelt einfach verkettete Liste – vorwärts und rückwärts ringförmig verkettet an an an-1 an-1 • Leere Liste: head→nil • 1-elementige Liste: head Petra Mutzel … … a1 a1 nil a1 DAP2 SS08 an an-1 … a1 nil p head maxN I S T G U T • Leeres Feld: n:=0 1 n= 8 9 10 nil 18 x Procedure PUSH(val x) var SListEl p:=new SListEl p.value:=x p.next:=head head:=p Realisierung der Operationen: s. TeX-Folien bzw. Skript 3 Queue Der ADT Stack Laufzeitanalyse des ADT Stack Worst-Case , Best-Case, Average Case „Stack“: „Queue“: Stapelspeicher, Warteschlangen, LIFO-Speicher) FIFO-Speicher Operation Felder Listen Θ(1)+Alloc Θ(1) • Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. ISEMPTY Θ(1) Θ(1) • S=<a1,a2,…,an> PUSH Θ(1) Θ(1) • Operationen: POP Θ(1) Θ(1) Initialisierung LeererQueue: Stack: < > – Im folgenden betrachten wir den Stack S=<a1,a2,…,an> mit Grundtyp val die Queue: ⇒ falls maxN bekannt: Arrays besser, da dynamische Speicherallokierung (wie Listen) langsamer ist. 20 Petrabei Mutzel DAP2 SS08 Queue Operationen des ADT Stack Petra Mutzel 22 Realisierung des ADT Queue durch Felder • Interne Repräsentation: • PUSH(val x) PUT – Speicherung als Array der Dimension maxN – Trick: Queue ist zyklisch im Feld gespeichert – Position wird durch Feldindizes front und back angegeben – Legt ein neues Element x oben auf den der Stack an das Ende Queue • PUSH(x): PUT S=<a1,a2,…an,x> • GET POP() : val 1 – Gibt das oberste Stacks zurück und erste Element des der Queue entfernt es (n>0). p 2 3 a5 a6 • GET POP(): an1 – Gibt true zurück, falls S leer ist; sonst false. Beispiel: PUT(P) 2 3 4 5 6 7 T G U 2 TI 8 9 10 D A 2 back m= maxN+1 maxN+1 a1 a2 a3 a4 back • ISEMPTY() : bool 1 DAP2 SS08 front Bei maxN Feldern wäre back=front, wenn Array „voll“, aber „back=front“ ist Abbruchbedingung für SS08 leere Liste24 Petra Mutzel DAP2 Realisierung des ADT Queue durch Listen • Interne Repräsentation: – Speicherung als einfach verkettete Liste – Zeiger head und tail auf Anfang und Ende I S front P Procedure PUT(val x) A[back]:=x if back=m then back:=1 else back:=back+1 if front=back then throw Overflow Exception Realisierung der Operationen: s. Skript head a1 … a2 an tail Petra Mutzel DAP2 SS08 nil 26 4 Beispiel: PUT(x) Laufzeitanalyse des ADT Queue Worst-Case , Best-Case, Average Case p head a1 … a2 Operation an tail x nil nil Procedure PUT(val x) var SListEl p:=tail tail:=new SListEl tail.value:=x; tail.next:=nil if head=nil then head:=tail else p.next:=tail Felder Listen Θ(1)+Alloc Θ(1) ISEMPTY Θ(1) Θ(1) PUT Θ(1) Θ(1) GET Θ(1) Θ(1) Initialisierung Vergleichen Sie diese Tabelle mit der von ADT Stack Realisierung der Operationen: s. Skript Operationen des ADT Dictionary Der ADT Dictionary • INSERT(K k,V v) „Dictionary“: Wörterbuch – Falls k nicht schon in D ist, dann wird ein neuer Schlüssel k mit Wert v in D eingefügt, andernfalls wird der Wert des Schlüssels k auf v geändert. • Wertebereich: D⊆KxV, wobei K Schlüssel (key) bezeichnet und V die Werte. Dabei ist jedem k∈K höchstens ein v∈V zuordnet. • Operationen: – Einfügen, Entfernen, Suchen (s. nächste Folie) – Im folgenden sei Q ein Dictionary vor Anwendung der Operationen. Petra Mutzel DAP2 SS08 30 INSERT(k,v): Falls k neu: D:=D ∪ (k,v), sonst D:=D \ (k,v´) ∪ (k,v) • DELETE(K k) – Entfernt Schlüssel k mit Wert aus D (falls k in D) • SEARCH(K k): V – Gibt den bei Schlüssel k gespeicherten Wert zurück (falls k in D) Der ADT Dictionary • Wörterbuchproblem: Finde eine Datenstruktur mit möglichst effizienten Implementierungen für die Operationen eines Dictionary. • Naive Lösung: als Paar von Feldern: → Lineare Laufzeit für alle Operationen • Im Laufe der Vorlesung: einige weitaus bessere Verfahren! Petra Mutzel DAP2 SS08 32 5