Abstrakte Datentypen und Datenstrukturen

Ähnliche Dokumente
Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Kap. 4.2: Binäre Suchbäume

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

13. Binäre Suchbäume

Grundlegende Datentypen

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Institut für Informatik

Programmiertechnik II

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Algorithmen und Datenstrukturen

Suchen und Sortieren Sortieren. Heaps

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

Einführung in die Informatik 1

Programmierung und Modellierung

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Datenstrukturen & Algorithmen

Grundlagen der Programmierung Prof. H. Mössenböck. 11. Objektorientierung

Suchen und Sortieren

Datenstrukturen und Algorithmen

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

4. Objektorientierung I Grundlagen der Programmierung 1 (Java)

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Über Arrays und verkettete Listen Listen in Delphi

3. Übung Algorithmen I

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

Sortierte Folgen 250

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Inhalte Informatik. I1 Grundprinzip des objektorientierten Modellierens I3 Modellieren von Netzwerkanwendungen

Algorithmen und Datenstrukturen Suchbaum

Kapitel 11: Wiederholung und Zusammenfassung

Abstrakte Datentypen.

Beispiel für eine rekursive Funktion

3 Amortisierte Analyse

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Abschnitt: Algorithmendesign und Laufzeitanalyse

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Beispielblatt VU Algorithmen und Datenstrukturen 1 VU 6.0

Uebersicht. Webpage & Ilias. Administratives. Lehrbuch. Vorkenntnisse. Datenstrukturen & Algorithmen

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

16. All Pairs Shortest Path (ASPS)

Struktur am Beispiel einer Liste

Klausur in Programmieren

Kapitel 9 Suchalgorithmen

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Kapitel 6: Graphalgorithmen Gliederung

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / Vorlesung 9, Dienstag 18.

Kapitel 7 des Buches, von Java-Selbstbau nach Scala-Library portiert Christoph Knabe

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Grundlagen der Informatik Generische Klassen

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Tutorium Algorithmen & Datenstrukturen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

HEUTE. Datenstrukturen im Computer. Datenstrukturen. Rekursion. Feedback Evaluation. abstrakte Datenstrukturen

Seminarausarbeitung Entwurf und Analyse von Datenstrukturen. Splay Trees. Mirco Lukas und Alexander Werthmann. Datum:

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Programmieren in Haskell

Java Einführung Collections

1 Polymorphie (Vielgestaltigkeit)

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

VBA-Programmierung: Zusammenfassung

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Algorithmen & Datenstrukturen

Praktikum Betriebssysteme 1. Aufgabe (1)

8 Zugriffstypen ( Zeiger )

Lösungvorschlag zum Übungsblatt 6: Software-Entwicklung I (WS 2007/08)

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Modul 122 VBA Scribt.docx

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Knasmüller.book Seite vii Mittwoch, 28. März : vii. Inhaltsverzeichnis

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Grundlagen der Künstlichen Intelligenz

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Suchen in Listen und Hashtabellen

10. Kapitel (Teil1) BÄUME GRUNDLAGEN. Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Bachelor-Klausur im WiSe 2013 / Grundlagen der Informatik

Generische Datenstrukturen

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

6 Datenstrukturen und abstrakte Datentypen. Datenstrukturen = Werkzeuge für die Buchhaltung

Algorithmen & Datenstrukturen 1. Klausur

Algorithmen und Datenstrukturen. Große Übung vom Nils Schweer

2 Lösungen "Peptide de novo Sequencing"

Transkript:

Abstrakte Datentypen und Datenstrukturen Professor Dr. Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 3. VO DAP2 SS 2009 21. April 2009 1

Praktikum zu DAP 2 Beginn: Mittwoch 22. April Bitte das 1. Praktikumsblatt vorher durchlesen (nicht schon lösen ) 2

Freiwilliger Linux-Kurs von Wilfried Rupflin und Sven Jörges Termine: Dienstag 14-16 Uhr und alternativ Donnerstag 16-18 Uhr Beginn: 21.04. (heute) GB V R. 014/015 3

Überblick ADT Sequence ADT Stack ADT Queue ADT Dictionary Realisierung mit - Feldern - verketteten Listen Theoretische Laufzeitanalyse 4

Motivation Warum soll ich hier bleiben? Grundlage für alles Weitere!!! Das kenne ich ja schon alles! Auch die Analyse? Tipp: Beliebte Klausuraufgabe: Realisieren Sie den ADT XXX mit einfach verketteten Listen der Form YYY (nicht ringförmig). Analyse! 5

Rückblick: Asymptotische Laufzeit: O-Notation O(g(n)) ist die Menge aller positiven Funktionen f(n), für die ein c und ein n 0 (beide positiv und unabhängig von n) existieren, so dass für alle n n 0 gilt: f(n) cg(n). Beweis für die Aussage: θ(g(n)) = O(g(n)) Ω(g(n)) (s. Tafel) 6

Abstrakte Datentypen Ein abstrakter Datentyp (ADT) besteht aus einem Wertebereich (d.h. einer Menge von Objekten) und darauf definierten Operationen. Die Menge der Operationen bezeichnet man auch als Schnittstelle des Datentyps. Eine Datenstruktur ist eine Realisierung bzw. Implementierung eines ADT. 7

Der ADT Sequence Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. S=<a 1,a 2,,a n > Leere Sequenz: < > Operationen: Im folgenden betrachten wir die Sequence S=<a 1,a 2,,a n > mit Grundtyp val 8

Operationen des ADT Sequence INSERT(val x, pos p): pos Einfügen eines Elements x vor dem Element an Position p INSERT(x,pos(a i )): S=<a 1,a 2, a i-1,x,a i,,a n > INSERT(x,nil): S=<a 1,a 2,,a n,x> DELETE(pos p) Löscht das Element an Position p (p nil). DELETE(pos(a i )): S=<a 1,a 2, a i-1,a i+1,,a n > 9

Operationen des ADT Sequence GET(int i): val Gibt das Element an i-ter Stelle zurück (1 i n) GET(i): a i CONCATENATE(Seq S ) Hängt die Sequence S hinten an S an (müssen gleichen Grundtyp besitzen) CONCATENATE(S ): Falls S =<a 1,a 2,,a m>, dann: <a 1,a 2, a n,a 1,,a m> 10

Realisierung durch Felder Interne Repräsentation: Speicherung als Array der Dimension maxn Position wird durch Feldindex angegeben Leeres Feld: n:=0 1 2 3 i n maxn a 1 a 2 a 3 a i a n 11

Beispiel: INSERT(P,3):3 n= 1 2 3 4 5 6 7 8 9 10 maxn D A 2 I S T G U T P 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 Realisierung der Operationen: s. TeX-Folien bzw. Skript 12

Realisierung durch Listen Interne Repräsentation: Speicherung als doppelt verkettete Liste vorwärts und rückwärts ringförmig verkettet head a 1 a 2 a n Leere Liste: head nil 1-elementige Liste: head a 1

Beispiel: INSERT(x,p):q p head a 1 a 2 a n q x Realisierung der Operationen: s. TeX-Folien bzw. Skript 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

Beispiel: INSERT(x,p):q p head a 1 a 2 a n q x Realisierung der Operationen: s. TeX-Folien bzw. Skript 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

Laufzeitanalyse des ADT Sequence Best-Case Average-Case Worst-Case Operation Felder 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

Der ADT Stack Stack : Stapelspeicher, LIFO-Speicher Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. S=<a 1,a 2,,a n > Leerer Stack: < > Operationen: Im folgenden betrachten wir den Stack S=<a 1,a 2,,a n > mit Grundtyp val 18

Operationen des ADT Stack PUSH(val x) Legt ein neues Element x auf den Stack PUSH(x): S=<a 1,a 2, a n,x> POP() : val Gibt das oberste Element des Stacks zurück und entfernt es (n>0). POP(): a n ISEMPTY() : bool Gibt true zurück, falls S leer ist; sonst false.

Realisierung des ADT Stack durch Felder Interne Repräsentation: Speicherung als Array der Dimension maxn Position wird durch Feldindex angegeben Leeres Feld: n:=0 1 2 3 i n maxn a 1 a 2 a 3 a i a n ähnlich wie bei ADT Sequence, nur einfacher 21

Beispiel: PUSH(P) n= 1 2 3 4 5 6 7 8 9 10 maxn D A 2 I S T G U T Procedure PUSH(val x) if n=maxn then throw Overflow Exception n:=n+1 A[n]:=x Realisierung der Operationen: s. TeX-Folien bzw. Skript P

Beispiel: PUSH(P) n= 1 2 3 4 5 6 7 8 9 10 maxn D A 2 I S T G U T P Procedure PUSH(val x) if n=maxn then throw Overflow Exception n:=n+1 A[n]:=x Realisierung der Operationen: s. TeX-Folien bzw. Skript

Realisierung des ADT Stack durch Listen Interne Repräsentation: Speicherung als doppelt einfach verkettete Liste vorwärts und rückwärts ringförmig verkettet head a n a n a n-1 a n-1 a 1 a 1 nil Leere Liste: head nil 1-elementige Liste: head a 1 nil 24

Beispiel: PUSH(x) head p a n a n-1 a 1 x Procedure PUSH(val x) var SListEl p:=new SListEl p.value:=x p.next:=head head:=p nil Realisierung der Operationen: s. TeX-Folien bzw. Skript

Beispiel: PUSH(x) head p a n a n-1 a 1 x Procedure PUSH(val x) var SListEl p:=new SListEl p.value:=x p.next:=head head:=p nil Realisierung der Operationen: s. TeX-Folien bzw. Skript

Laufzeitanalyse des ADT Stack Worst-Case, Best-Case, Average Case Operation Felder Listen Initialisierung Θ(1)+Alloc Θ(1) ISEMPTY Θ(1) Θ(1) PUSH Θ(1) Θ(1) POP Θ(1) Θ(1) falls maxn bekannt: Arrays besser, da dynamische Speicherallokierung (wie bei Listen) langsamer ist.

Der ADT Stack Queue Stack : Queue : Stapelspeicher, Warteschlangen, LIFO-Speicher) FIFO-Speicher Wertebereich: Menge aller endlichen Folgen eines gegebenen Grundtyps. S=<a 1,a 2,,a n > Leerer Stack: < > Operationen: Im folgenden betrachten wir die Queue: Queue: den Stack S=<a 1,a 2,,a n > mit Grundtyp val 28

Operationen des ADT Stack Queue PUSH(val PUT x) Legt ein neues Element x oben an das auf Ende den der Stack Queue PUSH(x): PUT S=<a 1,a 2, a n,x> GET POP() : val Gibt das oberste Element des der Queue Stacks zurück und entfernt es (n>0). POP(): a n GET a 1 ISEMPTY() : bool Gibt true zurück, falls S leer ist; sonst false.

Realisierung des ADT Queue durch Felder Interne Repräsentation: Speicherung als Array der Dimension maxn Trick: Queue ist zyklisch im Feld gespeichert Position wird durch Feldindizes front und back angegeben 1 2 3 p maxn+1 a 5 a 6 a 1 a 2 a 3 a 4 back front back zeigt hinter das letzte Listenelement; um korrekt auf Überlauf zu testen, nutzen wir maxn+1 Felder

1 2 3 T G U 2 T I Beispiel: PUT(P) 4 5 6 7 8 9 D 10 A 2 I S m= maxn+1 back P front Initialisierung: front:=back:=1 Function ISEMPTY():bool return front=back Procedure PUT(val x) A[back]:=x if back=m then back:=1 else back:=back+1 if front=back then throw Overflow Exception

1 2 3 T G U 2 T Beispiel: GET() 4 5 6 7 8 9 D 10 A 2 I S m= maxn+1 back front Procedure GET():val if front=back then throw Underflow Exception x:=a[front] If front=m then front:=1 else front:=front+1 return x Realisierung aller Operationen: s. Skript

Realisierung des ADT Queue durch Listen Interne Repräsentation: Speicherung als einfach verkettete Liste Zeiger head und tail auf Anfang und Ende head a 1 a 2 a n tail nil 33

Beispiel: PUT(x) head a 1 a 2 a n p 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 Realisierung der Operationen: s. Skript

Beispiel: PUT(x) head a 1 a 2 a n p tail x 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 Realisierung der Operationen: s. Skript

Laufzeitanalyse des ADT Queue Worst-Case, Best-Case, Average Case Operation Felder Listen Initialisierung Θ(1)+Alloc Θ(1) ISEMPTY Θ(1) Θ(1) PUT Θ(1) Θ(1) GET Θ(1) Θ(1) Vergleichen Sie diese Tabelle mit der von ADT Stack

Dictionary : Wörterbuch Der ADT Dictionary z.b (Matrikelnummer,Name) 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. 37

Operationen des ADT Dictionary INSERT(K k,v v) 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. 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 z.b (Matrikelnummer,Name) 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! 39