Gliederung Motivation / Grundlagen Sortierverfahren

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

Klassen - Verkettete Liste -
Man bestimme den „minimalen aufspannenden Baum“ des Graphen.
Minimum Spanning Tree: MST
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Sortieren I - Bubblesort -
Claudio Moraga; Gisbert Dittrich
7. Natürliche Binärbäume
Prioritätswarteschlangen
Kapitel 5. Stacks und Queues
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Synonyme: Stapel, Keller, LIFO-Liste usw.
der Universität Oldenburg
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 – Dynamische Tabellen) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Fibonacci-Heaps – Analyse) Tobias Lauer.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 11 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Einführung Wat jibt´s denn? Mit Computa kenn´ ick mir aus! Guten Tag,
Operationen auf verketteten Listen
Heaps und Priority Queues
Vortrag: Ingo Gensch, Mathias Reich am:
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Kapitel 2: Datenstrukturen
Stacks Referat im Fach Basisinformationstechnologien von Venelina Koleva.
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Effiziente Algorithmen
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Grundlagen der Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
1.6 Die Datenstruktur Stapel Ein Stapel (Stack) ist ein Sonderfall einer Liste. Die Elemente werden nach dem Prinzip LIFO (Last In First Out) angefügt.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Analyse der Laufzeit von Algorithmen
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Fortsetzung Datenstrukturen Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Vorbesprechung Klausur Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Tutorium Software-Engineering SS14 Florian Manghofer.
Schlange und Stapel.
1. Die rekursive Datenstruktur Liste 1.6 Die Datenstruktur Stapel
1. Die rekursive Datenstruktur Liste 1
 Präsentation transkript:

Gliederung Motivation / Grundlagen Sortierverfahren Elementare Datenstrukturen / Anwendungen Bäume / Graphen Hashing Algorithmische Geometrie

„unser“ Blick auf Datenstrukturen Einleitung „unser“ Blick auf Datenstrukturen ... werden charakterisiert durch Menge der zu verwaltenden Objekte Menge der zu unterstützenden Operationen einfache Beispiele Warteschlangen (/* Queues */) Kellerspeicher (/* Stacks */) Prioritätswarteschlangen (/* Priority Queues */)

Warteschlangen / Kellerspeicher Aufgabenstellung Menge von zu verwaltenden Objekten Objekte können hinzugefügt bzw. entfernt werden zeitliche Reihenfolge des Einfügens ist entscheidend FIFO-Prinzip ... (/* first in, first out */)  Warteschlange LIFO-Prinzip ... (/* last in, first out */)  Kellerspeicher Implementierungsvarianten Array von Objekten verkettete Liste von Objekten

Warteschlangen / Kellerspeicher Operationen Erzeugen einer leeren Warteschlange bzw. eines leeren Kellerspeichers (/* create(Q) bzw. create(S) */) Einfügen eines Objekts o in eine Warteschlange Q bzw. einen Kellerspeicher S (/* insert(Q,o) bzw. insert(S,o) */) Test, ob eine Warteschlange Q bzw. ein Kellerspeicher S leer ist (/* empty?(Q) bzw. empty?(S) */) Zugriff auf das zuerst in die Warteschlange Q bzw. das zuletzt in den Kellerspeicher S eingefügte Objekt (/* access(Q) bzw. access(S) */) Entfernen des zuerst in die Warteschlange Q bzw. des zuletzt in den Kellerspeicher S eingefügte Objekt (/* delete(Q) bzw. delete(S) */)

Warteschlangen / Kellerspeicher Beschreibung der Operationen mindestens zwei Möglichkeiten Möglichkeit 1 (/* implementierungsabhängig */) festlegen, wie die Objekte intern verwaltet werden (/* etwa mit Hilfe eines Arrays oder einer verketteten Liste */) „ausprogrammieren“ der Operationen Möglichkeit 2 (/* implementierungsunabhängig */) gewünschte Eigenschaften der Operationen formal beschreiben; de facto wird das „Zusammenspiel“ zwischen den Operationen festgelegt offen: Welche Beschreibungsmittel verwendet man hier?

Warteschlangen / Kellerspeicher Randbedingungen (/* implementierungsabhängig */) die zu verwaltenden Objekte werden in einem Array gespeichert (/* damit ist klar, daß die Anzahl der zu verwaltenden Objekte a priori beschränkt ist */) über die Indizes kann man auf die aktuell verwalteten Objekte zugreifen die Anzahl der verwalteten Objekte ist von Relevanz (/* wird sich „gemerkt“, um die Operationen einfacher zu realisieren */)

Realisierung 1 (/* ungeschickt */) Warteschlangen Realisierung 1 (/* ungeschickt */) Array queue zum Verwalten von maximal n Objekten Variable anz, um sich die Anzahl der verwalteten Objekte zu merken create(Q): Anlegen eines Arrays queue der Größe n; anz = 0 empty?(Q): if ( anz == 0 ) return(true) else return(false) insert(Q,o): ++anz; queue[anz] = o access(Q): return(queue[1]) delete(Q): for ( i = 1; i <= anz; ++i ) { queue[i] = queue[i+1]; }; --anz ... insert(), access() und delete() bedürfen noch eines Tests auf Anwendbarkeit

Realisierung 1 (/* ungeschickt */) Warteschlangen Realisierung 1 (/* ungeschickt */) Operation delete() benötigt die Zeit O(n) alle anderen Operationen benötigen die Zeit O(1) Verbesserungsmöglichkeit, um alle Operationen in Zeit O(1) zu realisieren: der Index des zuerst gespeicherten Objekts ändert sich (/* muß sich aber explizit „gemerkt“ werden */) 5 3 2 (/* Realisierung 1 */) 2 5 3 (/* Realisierung 2 */)

Realisierung 2 (/* geschickter */) Warteschlangen Realisierung 2 (/* geschickter */) Array queue zum Verwalten von maximal n Objekten Variable anz, um sich die Anzahl der verwalteten Objekte zu merken Variable first, um sich den Index des zu erst eingefügten Objekts zu merken create(Q): ...; anz = 0; first = 1 insert(Q,o): ++anz; z = first+anz-1; if ( z <= n ) queue[z] = o else queue[z-n] = o delete(Q): if ( first == n) first = 1 else ++first ... insert(), access() und delete() bedürfen noch eines Tests auf Anwendbarkeit

Beschreibung (/* implementierungsunabhängig */) Warteschlangen Beschreibung (/* implementierungsunabhängig */) gewünschte Eigenschaften der Operationen formal beschreiben; de facto wird das „Zusammenspiel“ zwischen den Operationen festgelegt ... wählen bedingte Gleichungen (/* Theorie der Abstrakte Datentypen */) empty?(create(Q)) = true empty?(insert(Q,o)) = false empty?(Q) = true  access(insert(Q,o)) = o empty?(Q) = false  access(insert(Q,o)) = access(Q) empty?(Q) = false  delete(insert(Q,o)) = insert(delete(Q),o) empty?(Q) = true  delete(insert(Q,o)) = Q

Kellerspeicher Realisierung Array stack zum Verwalten von maximal n Objekten Variable anz, um sich die Anzahl der verwalteten Objekte zu merken create(S): Anlegen eines Arrays stack der Größe n; anz = 0 empty?(S): if ( anz = 0 ) return(true) else return(false) insert(S,o): ++anz; stack[anz] = o access(S): return(stack[anz]) delete(S): --anz ... insert(), access() und delete() bedürfen noch eines Tests auf Anwendbarkeit

Kellerspeicher Realisierung alle Operationen benötigen die Zeit O(1)

Beschreibung (/* implementierungsunabhängig */) Kellerspeicher Beschreibung (/* implementierungsunabhängig */) gewünschte Eigenschaften der Operationen formal beschreiben; de facto wird das „Zusammenspiel“ zwischen den Operationen festgelegt ... wählen bedingte Gleichungen (/* Theorie der Abstrakte Datentypen */) empty?(create(S)) = true empty?(insert(S,o)) = false access(insert(S,o)) = o delete(insert(S,o)) = S

Anwendungen von Kellerspeichern Stacks Beispiele Realisierung rekursiver Funktionen Auswertung arithmetischer Ausdrücke Auswertung arithmetischer Ausdrücke (/* Randbedingungen */) nur binäre Operationen vollständig geklammerte Ausdrücke

Auswertung arithmetischer Ausdrücke Stacks Grundlagen (/* Infix- versus Postfix-Notation */) Infix-Notation Postfix-Notation (x+y) ((x*y)+z) ((x*(x+y))+z) xy+ xy+z* xxy+*z+ Klammern in der Infix-Notation dienen zur „Repräsentation“ von Prioritäten von Operatoren (/* hier machen wir uns das Leben „einfacher“ */)

Auswertung arithmetischer Ausdrücke Stacks Auswertung eines arithmetischen Ausdrucks in Infix-Notation + ((x*(x+y))+z) * val(z) val(x) + val(x) val(y) ... Auswertung gemäß Baumstruktur (/* aufbauen + auswerten */)

Auswertung arithmetischer Ausdrücke Stacks Aufgabenstellung gegeben ein vollständig geklammerter arithmetischer Ausdruck in Infix-Notation (/* falls nicht, so müssen die Klammern gemäß der Prioritäten der Operatoren eingefügt werden */) gesucht ist der Wert des Ausdrucks (/* ... die Werte der auftretenden Variablen sind bekannt */) Herangehensweise Schritt 1: Umwandlung von Infix-Notation in Postfix-Notation Schritt 2: Auswertung des Ausdrucks in Postfix-Notation

Auswertung arithmetischer Ausdrücke Stacks Auswertung eines arithmetischen Ausdrucks in Postfix-Notation von links nach rechts durchlaufen; unter Verwendung eines Stacks auswerten 2 3 + * 1 2 10 11 5 1 3 Ausgabe: 11 Auszuwertender Ausdruck: ((2*(2+3))+1)

Auswertung arithmetischer Ausdrücke Stacks Auswertung eines arithmetischen Ausdrucks in Postfix-Notation von links nach rechts durchlaufen; unter Verwendung eines Stacks auswerten x y + * z a d f c e b Abkürzungen: a = val(x) b = val(y) e = val(z) f = d+e Ausgabe: f c = a+b d = a+c Auszuwertender Ausdruck: ((x*(x+y))+z)

Auswertung arithmetischer Ausdrücke Stacks Regeln für Schritt 2 führe create(S) aus arithmetischen Ausdruck von links nach rechts durchlaufen falls das aktuelle Zeichen z ein Operand ist, so führe insert(S,val(z)) aus falls das aktuelles Zeichen z ein Operator ist, so bestimme a = access(S), führe delete(S) aus, bestimme b = access(S), führe delete(S) aus, berechne c = z(a,b) und führe insert(S,c) aus falls der Ausdruck vollständig gelesen wurde, so gib access(S) aus

Auswertung arithmetischer Ausdrücke Stacks Umwandlung von Infix-Notation in Postfix-Notation von links nach rechts durchlaufen; unter Verwendung eines Stacks ausgeben ( x * + y ) z * + Ausgabe: x y + * z

Auswertung arithmetischer Ausdrücke Stacks Regeln für Schritt 2 führe create(S) aus arithmetischen Ausdruck von links nach rechts durchlaufen falls das aktuelle Zeichen z das Zeichen “(“ ist, so ignoriere z falls das aktuelle Zeichen z ein Operand ist, so gebe z aus falls das aktuelle Zeichen z ein Operator ist, so führe insert(S,z) aus falls das aktuelles Zeichen z das Zeichen “)“ ist, so bestimme y = access(S), gib y aus und führe delete(S) aus

Prioritätswarteschlangen Stacks Aufgabenstellung Menge von zu verwaltenden Objekten, wobei jedem Objekt eine „Priorität“ zugeordnet ist Objekte können hinzugefügt bzw. entfernt werden in der verwalteten Menge will man schnell ein Objekt mit der höchsten Priorität bestimmen können ... betrachten Varianten der Realisierung mit Hilfe eines Arrays, d.h. die Anzahl der zu verwaltenden Objekte ist a priori begrenzt

Prioritätswarteschlangen Stacks Operationen Erzeugen einer leeren Prioritätswarteschlange P (/* create(P) */) Einfügen eines Objekts o in eine Prioritätswarteschlange P (/* insert(P,o) */) Zugriff auf ein Objekt in der Prioritätswarteschlange P mit minimaler Priorität, wobei dieses Objekt gleichzeitig aus P gestrichen werden soll (/* acc_del(P) */) Erzeugen einer Prioritätswarteschlange P, die alle Objekte einer Objektmenge O enthält (/* init(P,O) */)

Prioritätswarteschlangen Stacks Anwendungen Steuerung von Druckerwarteschlangen (/* den Benutzern werden Gruppen zugeordnet, ... */) als zugrunde liegende Datenstruktur diverser Algorithmen (/* sehen wir später */)

Prioritätswarteschlangen Stacks Realisierung 1 (/* ungeschickt */) Array pqueue zum Verwalten von maximal n Objekten Variable anz, um sich die Anzahl der verwalteten Objekte zu merken create(P): Anlegen eines Arrays pqueue der Größe n; anz = 0 insert(P,o): ++anz; pqueue[anz] = o acc_del(P): bestimme i mit p(pqueue[i]) ist maximal; return(queue[1]); for ( j = i; j < anz; ++j ) { pqueue[j] = pqueue[j+1]; }; --anz init(P,O): führe erst create(P) und dann „nacheinander“ für jedes Objekt o  O die Operation insert(P,o) aus ... insert(), acc_del() und init() bedürfen noch eines Tests auf Anwendbarkeit

Prioritätswarteschlangen Stacks Realisierung 1 (/* ungeschickt */) Operationen create(P) und insert(P,o) gehen in Zeit O(1) Operationen acc_del(P) und init(P,O) benötigen Zeit O(n) Verbesserungsmöglichkeit Array pqueue zum Verwalten von maximal n Objekten Variable anz, um sich die Anzahl der verwalteten Objekte zu merken das Array pqueue, in dem die Objekte verwaltet werden, bildet einen Heap (/* Ordnung der Objekte bzgl. der zugehörigen Prioritäten */)

Prioritätswarteschlangen Stacks Beispiel O = { a,b,c,d,e,f,g } p(a) = p(g) = 5, p(b) = 1, p(c) = p(e) = p(f) = 3, p(d) = 2 a e g a e g d b f c d b f c Ein Knoten o mit den Söhnen ol und or hat die Heap-Eigenschaft, falls p(o) ≥ p(ol) und p(o) ≥ p(or) gilt. ... jeder Knoten muß die Heap- Eigenschaft haben

Prioritätswarteschlangen insert()-Operation ... geht in Zeit O(log(n)) ++anz; pqueue[anz] = o auf dem Weg von pqueue[1] zu pqueue[anz] das neue Objekt o an die richtige Position „steigen“ lassen O = { a,b,c,d,e,f,g } p(a) = p(g) = 5, p(b) = 1, p(c) = p(e) = p(f) = 3, p(d) = 6 a a d g f g f g a c e b c e b d c e b f a g f c e b a g f c e b d d g a c e b f

Prioritätswarteschlangen acc_del()-Operation ... geht in Zeit O(log(n)) y = pqueue[1]; pqueue[1] = pqueue[anz]; --anz Objekt an Position pqueue[1] an die richtige Position „sinken“ lassen; return(y) O = { a,b,c,d,e,f,g } p(a) = p(g) = 5, p(b) = 1, p(c) = p(e) = p(f) = 3, p(d) = 2 a c g e g e g e c d b f c d b f d b f a e g d b f c c e g d b f g e c d b f

Prioritätswarteschlangen init()-Operation ... geht in Zeit O(n) Array pqueue mit allen Objekten in O initialisieren (/* ohne die Ordnung bzgl. der Prioritäten zu beachten */) Array pqueue wie in Phase 1 von HeapSort in einen Heap überführen (/* Ordnung absteigend bzgl. der Prioritäten */) O = { a,b,c,d,e,f,g } p(a) = p(g) = 5, p(b) = 1, p(c) = p(e) = p(f) = 3, p(d) = 6 a d b c a g d e f g b e f c a b c d e f g d a g b e f c