Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp/B. Nebel

Ähnliche Dokumente
Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp

(06 - Anwendungen von Stapeln und Schlangen)

12. Dynamische Datenstrukturen

ALP II Dynamische Datenmengen Datenabstraktion

16. Dynamische Datenstrukturen

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

13. Dynamische Datenstrukturen

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Übung Algorithmen und Datenstrukturen

5.3 Doppelt verkettete Listen

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

3 Dynamische Datenstrukturen

ALP II Dynamische Datenmengen

11. Elementare Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Konkatenation zweier Listen mit concat

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Skip-Listen Autor: Sven Schuierer

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Datenstrukturen

Algorithmen und Datenstrukturen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Schnittstellen, Stack und Queue

7. Verkettete Strukturen: Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Verkettete Datenstrukturen: Listen

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

Spezielle Datenstrukturen

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Informatik II Übung 5 Gruppe 3

Informatik II, SS 2014

8 Elementare Datenstrukturen

Algorithmen und Datenstrukturen

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Programmieren 2 Übung Semesterwoche 2

1 Abstrakte Datentypen

4.2 Daten und Datenstrukturen

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Vorlesung Datenstrukturen

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Einführung in die Informatik

3. Übungsblatt zu Algorithmen I im SoSe 2017

Informatik II Prüfungsvorbereitungskurs

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (07 - Skiplisten) Prof. Dr. Susanne Albers

1 of :17:14

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Software Entwicklung 1

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Übung Algorithmen und Datenstrukturen

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

LISTEN ALS ABSTRAKTE DATENTYPEN

Tutoraufgabe 1 (Implementierung eines ADTs):

Software Entwicklung 1

ADT: Verkettete Listen

Algorithmen und Datenstrukturen Kapitel 4 Neue Datenstrukturen, besseres (?) Sortieren

Abstrakte Datentypen und Datenstrukturen

ADT: Verkettete Listen

Grundlagen: Algorithmen und Datenstrukturen

Teil IV. Grundlegende Datenstrukturen

Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 132

Algorithmen und Programmierung III

SS10 Algorithmen und Datenstrukturen 2. Kapitel Fundamentale Datentypen und Datenstrukturen

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Informatik II Prüfungsvorbereitungskurs

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

LISTEN ALS ABSTRAKTE DATENTYPEN

Advanced Programming in C

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

ADT: Verkettete Listen

Anwendungsbeispiel MinHeap

Fallstudie: Online-Statistik

Algorithmen und Datenstrukturen 1

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

Informatik II, SS 2016

Listen. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer)

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

13. Bäume: effektives Suchen und Sortieren

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

13. Bäume: effektives Suchen und Sortieren

Programmieren I. Kapitel 13. Listen

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

12.3 Ein Datenmodell für Listen

Aufgaben NF 11; Seite 1

Grundlagen der Informatik

Transkript:

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp/B. Nebel Institut für Informatik Georges-Köhler-Allee Albert-Ludwigs-Universität Freiburg

1 Überblick Überblick Datenstrukturen Arrays/Felder Listen Stapel/Stack Schlange/Queue: Mengen Überblick 1-1

2 Datenstrukturen Motivation: Wozu sind Datenstrukturen nützlich? Arrays mit Adressierung Listen mit - 4 verschiedenen Implementierungen Stapel/Schlangen - Anwendung Schlange: Topologische Sortierung Mengen dargestellt als - Bitvektoren - Andere Implementationen Datenstrukturen 2-1

Algorithmen und Datenstrukturen Algorithmus: Endliche Sequenz von Instruktionen, die angeben, wie ein Problem gelöst werden soll. Datenstrukturen (DS): Dienen zur Organisation von Daten, um bestimmte Operationen (effizient) zu unterstützen. Hier und heute: Werden DS isoliert betrachtet, in der Praxis sind sie wichtige Bestandteile von Algorithmen. Verbindung: Datenstrukturen lassen sich vielfältig ineinander schachteln. Eignung: Demnach ist es stets nützlich, sich Anwendungs- und Nichtanwendungssituationen zu überlegen Unabhängigkeit: Darstellung im Grunde unabhängig von der Programmiersprache Konkretisierung: Imperative Programmiersprachen, speziell: Programmiersprache Java Datenstrukturen 2-2

0 3 Arrays/Felder 1-dimensional: Array für den Bereich sieht Positionen für Daten des gewählten Typs vor. Darstellung im Rechner: Array der Länge blegt die Speicherplätze an den Positionen. Mit sprechen wir das Datum an Position an. Wesentlich: Arrays erlauben den Zugriff auf Komponenten über einen (berechenbaren) Index Zugriffe: In Zeit. Keine Unterstützung von Operationen vom Typ Nimm und füge es zwischen! " und # $ ein. 2-dimensional: Array &%')( +*,. Arrayelement A[i][j] findet man an der Speicherplatzposition -+. /+* -dimensional: Array 12&%')( 3( 4 25768 Element -%9:; 6 findet sich an Speicherplatzposition < =?> %;@BA;@ 6DC % -EA. A;FHGE@ 6 GJI?K L M6 Arrays/Felder 3-1

4 Listen Definition: Sei N O P Q%RP S*1 UTB geordnete Folge von Objekten eines bestimmten Typs, dann heißt: Q% Anfangsobjekt (Kopf), UT Endobjekt (Schwanz), UVXW % Nachfolger von V, V Vorgänger von,vxw %. Nachfolger von T und Vorgänger von Q% ist null. Falls O Y heißt die Liste leer. Operationen: insert JZH[N\ : Füge das Objekt Z in N ein. Ergebnis ist eine Liste. find JZH-N\ : Falls Z ] N ist Antwort true, sonst false delete JZH[N\ : Entferne Z aus N. Falls Z ] ^ N Fehlerbehandlung. Ergebnis ist eine Liste. Weiterhin: pred JZH-N\, succ JZ_-N\, null PN\, firstpn\, lastpn\, lengthpn\, union PN %`PNa*1N\, copy PN [N&bc, split JZH[N PN %"Na*9 Objekt-orientierte Realisierung: Operationen werden Methoden auf den Objekten, die oben jeweils als 2. Parameter auftauchen. Listen 4-1

Listenoperationen mit Zeigern Zeiger (Handle): d zum Zugriff, z.b. vom Typ Object Operationen: insert JZHedfN\ : Füge das Objekt Z an Stelle d in N ein. Ergebnis ist eine Liste. delete d+[n\ : Entferne Element an Stelle d aus N. Ergebnis ist eine Liste. search JZH[N\ : Liefert die erste Position als Zeiger, an der Z in N vorkommt, und null, falls Z in N nicht vorkommt Weiterhin: pred d+-n\, succ d+-n\, null PN\, firstpn\, lastpn\, lengthpn\, union PN %`PNa*1N\, copy PN [N&bc, split d+[n PN %"Na*9 Listen 4-2

k h p h h j h j on k m Implementationen von Listen g Version 1: Als Array. Zeiger d vom Typ int (in search: d O Y falls nicht vorhanden). g Version 2: Einfach verkettet, Listenende null N h i% h S* g Version 3: Einfach verkettet, am Listenanfang und -ende ein dummy Element h % h * h head g Version 4: Doppelt verkettet, Listenanfang und Listenende null j Q% khead p S* p h UT ktail UT h UT h l tail Listen 4-3

Grundtypen und Knoten Der Grundtyp beinhaltet Schlüssel bzw. Datensatz public class Grundtyp { int key; // eventuell weitere Komponenten Grundtyp() { this.key = 0; Grundtyp(int key) { this.key = key; public boolean equals(grundtyp dat) { return this.key == dat.key; public String tostring() { StringBuffer st = new StringBuffer(""+key); return st.tostring(); Knoten dient zur Speicherung des Dateninhaltes und der (einfachen) Verkettung von Listenelementen. Wird ausschliesslich in der zugehörigen Listenklasse genutzt. class Knoten { Grundtyp dat; Knoten next; // Grundtyp // Zeiger auf Nachfolgerknoten Knoten(Grundtyp dat, Knoten next) { this.dat = dat; this.next = next; Listen 4-4

Arraydarstellung Liste repräsentiert als Array: public class Liste { Grundtyp[] L; int elzahl; Liste(int maxelzahl) { L = new Grundtyp[maxelzahl+1]; elzahl = 0; public int search(grundtyp x) { L[0] = x; int pos = elzahl; while (!L[pos].equals(x)) pos--; return pos; public void insert(grundtyp x, int p) { for (int pos=elzahl; pos >= p; pos--) L[pos+1] = L[pos]; L[p] = x; elzahl++; public void delete(int p) { elzahl--; for(int pos=p;pos<=elzahl;pos++) L[pos] = L[pos+1]; public String tostring () { StringBuffer st = new StringBuffer(""); for (int pos = 1; pos <= elzahl; pos++) st.append(pos == elzahl? L[pos].toString(): L[pos].toString()+", "); return st.tostring(); Listen 4-5

Dynamisch Liste implementiert als einfach verkettete Struktur: public class Liste { Knoten head; // Kopfelement Liste() { head = null; // leere Liste public void insert (Grundtyp x) { head = new Knoten(x,head); public boolean find(grundtyp x) { for (Knoten i = head;i!= null;i = i.next) if (i.dat.equals(x)) return true; return false; public void delete(grundtyp x) throws Exception { if (head.dat.equals(x)) head = head.next; %%FEHLER: else-zweig noetig! else { for (Knoten i = head;i.next!= null;i = i.next) if (i.next.dat.equals(x)) { i.next = i.next.next; return throw new Exception("x kommt nicht vor"); public String tostring() { StringBuffer st = new StringBuffer(""); for (Knoten i = head;i!= null;i = i.next) st.append(i.next == null? i.dat.tostring() : i.dat.tostring()+", "); return st.tostring(); Listen 4-6

Verfeinerung... nach (Ottmann / Widmayer): public class Liste { Knoten head, tail; Liste() { Grundtyp dummy = new Grundtyp(); head = new Knoten(dummy,null); tail = new Knoten(dummy,head); head.next = tail; public void insert (Grundtyp x, Knoten p) { Knoten hilf; if (p == tail) hilf = tail; else hilf = p.next; p.next = new Knoten(p.dat,hilf); p.dat = x; if (p == tail) tail = tail.next; if (hilf == tail) tail.next = p.next; public void delete (Grundtyp x) throws Exception { tail.dat = x; Knoten pos = head; while(!pos.next.dat.equals(x)) pos = pos.next; if (pos.next!= tail) pos.next = pos.next.next; else throw new Exception("x kommt nicht vor"); if (pos.next == tail) tail.next = pos; public Knoten search(grundtyp x) { tail.dat = x; Knoten pos = head; do pos = pos.next; while (!pos.dat.equals(x)); if (pos == tail) return null; return pos; Listen 4-7

h h h h h sr h sr Veranschaulichung von Listenoperationen Einfache Verkettung Vor dem Einfügen khead h Q% h q C % h q h UT t o tail k Nach dem Einfügen khead h Q% h `q C % h Z h q : h UT t o tail k Doppelte Verkettung Löschen in doppelt verketteter Liste: p h q C % p h q k d p h q W % p h Listen 4-8

Doppelte Verkettung public class Knoten { Grundtyp dat; // Grundtyp Knoten next; // Zeiger auf Nachfolgerknoten Knoten prev; // Zeiger auf Vorgaengerknoten... public class Liste { Knoten head, tail; Liste() { head = null; tail = null; public void insert (Grundtyp x) { if (head == null) head = tail = new Knoten(x,null,null); else insert(x,head); public void insert (Grundtyp x, Knoten p) { Knoten hilf = new Knoten(x,p.next,p); p.next = hilf; if (hilf.next == null) tail = hilf; else hilf.next.prev = hilf; public void delete (Grundtyp x, Knoten p) { if (p == head) head = p.next; p.prev.next = p.next; if (p == tail) tail = p.prev; p.next.prev = p.prev; public Knoten search(grundtyp x) { for (Knoten i = head;i!= null;i = i.next) if (i.dat.equals(x)) return i; return null; Listen 4-9

L u 5 Stapel/Stack LIFO Speicher Operationen empty, push, pop (, peek) maxelzahl top jjjj 2 1 0 I?uK IuuuuuuK L uuuuuu frei Stapel Implementation: In Java in der Klassenbibliothek vorhanden: java.util.stack public class Stack extends Vector { // Default Constructor: public Stack() // Public Instance methods public boolean empty(); public Object peek() throws EmptyStackException; public Object pop() throws EmptyStackException; public Object push(object item); public int search(object o) Stapel/Stack 5-1

v Y ww wl v l 6 Schlange/Queue: FIFO Speicher: empty, enqueue, dequeue frei y z { size-1 m n tail k Schlange khead x xx m n class Queue { Object element[]; int lastop, tail, head, size; static final int deque = 1; static final int enque = 0; Queue(int sz) { size = sz; head = 0; tail = size-1; lastop = deque; element = new Object[sz]; public boolean empty(){return head==(tail+ 1)%size; public void enqueue(object elem) throws Exception... public Object dequeue() throws Exception... Schlange/Queue: 6-1

Operationen public void enqueue(object elem) throws Exception { if ((head == (tail+1)%size) && lastop == enque) throw new Exception("Queue full"); lastop = enque; tail = (tail + 1) % size; element[tail] = elem; public Object dequeue() throws Exception { if ((head == (tail+1)%size) && (lastop == deque)) throw new Exception("Queue empty"); Object temp = element[head]; lastop = deque; head = (head + 1) % size; return temp; Test public static void main(string argv[]) { Queue Q = new Queue(10); try { Q.enqueue(new String("Haus")); Q.enqueue(new Integer(10)); Object o = Q.dequeue(); System.out.println(o); catch (Exception e) { System.out.println(e); Schlange/Queue: 6-2

Anwendung: Topologische Sortierung Definition: Die Relation ist eine vollständige bzw. partielle Ordnung auf ~, wenn (1)-(4) bzw. (2)-(4) gelten. (1) iz_ ] ~ : Z oder Z (Vollständigkeit) (2) iz ] ~ : Z Z (Reflexivität) (3) iz_ ] ~ : Z und Z Z O (Antisymmetrie) (4) iz_ ƒ ] ~ : Z und Z (Transitivität) Beispiel: Potenzmenge einer Menge ~ bezüglich Teilmengenrelation partiell aber nicht vollständig geordnet. Topologische Sortierung: Gegeben ~ und partiell. Gesucht: Einbettung in vollständige Ordnung, d.h. die Elemente von ~ sind in eine Reihenfolge %ˆ- T zu bringen, wobei V A für Š gilt. Lemma: Jede partiell geordnete Menge läßt sich topologisch sortieren. Beweisidee: Es genügt, die Existenz eines minimalen zu zeigen. muß nicht eindeutig sein. Elements in ~ Wähle % O und sortiere ~. D Œ topologisch. Schlange/Queue: 6-3

Ž 0 O 0 0 0 0 0 0 Verwendete Datenstrukturen : Array der Länge, Ž natürliche Zahl N : Liste von Zahlenpaaren : Queue (Schlange), die ebenfalls Zahlen enthält Algorithmus: Eingabe: d Paare -J, mit Z V Z A und ~ O :Z % [Z T Œ Ž (1) Setze alle auf 0, alle N und seien leer (2) Wird $ Ž gelesen, wird N!" eingetragen. Ž (3) Durchlaufe 0 Ž : Schreibe alle mit &O Y in (4) While ^ $Œ =.dequeue() Gebe ZSA aus Durchlaufe N!" : Wird $ Ž gefunden, wird um 1 verringert. Falls Ž O um 1 erhöht und in Y ist,.enqueue Satz: Der Algorithmus löst das Problem Topologische Sortierung in - d Zeit. Schlange/Queue: 6-4

Beispiel: Eingabe: (1,3), (3,7), (7,4), (4,6), (9,2), (9,5), (2,8), (5,8), (8,6), (9,7), (9,4) Datenstruktur nach der Vorverarbeitung: 1 2 3 4 5 6 7 8 9 A:[0 1 1 2 1 2 2 2 0] L:1,3 2,8 3,7 4,6 5,8 7,4 8,6 9,2 9,5 9,7 9,4 Ablauf des Algorithmus: Q 1 2 3 4 5 6 7 8 9 -----------+--------------------------- {1,9 0 1 1 2 1 2 2 2 0 Schlange/Queue: 6-5

Ž 7 Mengen Unterscheidung: Bitvektorimplementation und Listenimplementation Eignung: Bitvektorimplementation für feste (kleine) Grundmenge O 9 1- Œ. Bitvektor-Darstellung: ~ Operationen: - Š] ~? - füge zu ~ hinzu? - entferne aus ~? durch Array Ž - mit O &] ~, und Ž O Y sonst. - ~ O ~ %š ~ *? - ~ O ~ %š ~ *? - ~ O ~ %. ~ *? Machinenwortdarstellung: œ Bits in einem Maschinenwort. Komplexität entweder oder ž7ÿ`œ $ Mengen 7-1

Andere Mengendarstellungen Große Grundmengen: Hier kann man im Normalfall nur Listen einsetzen. Spezielle Mengen mit eingeschränkten Operationen: Falls nur Enthaltenseinstest, Einfügen und Löschen von Interesse sind, spricht man auch von Wörterbüchern. Andere mögliche Implmentationen sind dann z.b. Hashtabellen. Weitere Spezialfälle: Arbeitet man mit disjunkten Mengen, die vereinigt und gesplittet werden können, und sucht oft die Menge, in der ein Element enthalten ist, können sog. Union-Find-Strukturen weiter helfen. Mengen 7-2

Überblick, 2 Algorithmen und Datenstrukturen, 4 Anwendung: Topologische Sortierung, 23 Arraydarstellung, 10 Arrays, 5 Aufrufbaum, 18 Beispiel:, 25 Beispiel: Tower-of-Hanoi Problem, 16 Datenstrukturen, 3 Doppelte Verkettung, 14 Dynamisch, 11 Grundtypen und Knoten, 9 Implementationen von Listen, 8 Listen, 6 Listenoperationen mit Zeigern, 7 Mengen, 26 Operationen, 22 Rekursive Lösung, 17 Schlange/Queue:, 21 Spezielle Stackimplementierung für TOH, 19 Stapel/Stack, 15 Testen: Tower-of-Hanoi-Stack, 20 Veranschaulichung von Listenoperationen, 13 Verfeinerung, 12 Verwendete Datenstrukturen, 24