Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

3/1, Folie 1 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Gliederung 1.Motivation / Grundlagen.

Ähnliche Präsentationen


Präsentation zum Thema: "3/1, Folie 1 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Gliederung 1.Motivation / Grundlagen."—  Präsentation transkript:

1 3/1, Folie 1 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Gliederung 1.Motivation / Grundlagen 2.Sortierverfahren 3.Elementare Datenstrukturen / Anwendungen 4.Bäume / Graphen 5.Hashing 6.Algorithmische Geometrie

2 3/1, Folie 2 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Einleitung unser Blick auf Datenstrukturen Menge der zu verwaltenden Objekte Menge der zu unterstützenden Operationen... werden charakterisiert durch Warteschlangen (/* Queues */) Kellerspeicher (/* Stacks */) Prioritätswarteschlangen (/* Priority Queues */) einfache Beispiele

3 3/1, Folie 3 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Menge von zu verwaltenden Objekten Objekte können hinzugefügt bzw. entfernt werden zeitliche Reihenfolge des Einfügens ist entscheidend Aufgabenstellung FIFO-Prinzip... (/* first in, first out */) LIFO-Prinzip... (/* last in, first out */) Warteschlange Kellerspeicher Implementierungsvarianten Array von Objekten verkettete Liste von Objekten Warteschlangen / Kellerspeicher

4 3/1, Folie 4 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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) */) Operationen Warteschlangen / Kellerspeicher

5 3/1, Folie 5 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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 Beschreibung der Operationen offen: Welche Beschreibungsmittel verwendet man hier? Warteschlangen / Kellerspeicher

6 3/1, Folie 6 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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 */)

7 3/1, Folie 7 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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

8 3/1, Folie 8 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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 */) (/* Realisierung 1 */) (/* Realisierung 2 */)

9 3/1, Folie 9 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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

10 3/1, Folie 10 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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

11 3/1, Folie 11 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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

12 3/1, Folie 12 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Kellerspeicher Realisierung alle Operationen benötigen die Zeit O(1)

13 3/1, Folie 13 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen 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

14 3/1, Folie 14 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Realisierung rekursiver Funktionen Auswertung arithmetischer Ausdrücke nur binäre Operationen vollständig geklammerte Ausdrücke Anwendungen von Kellerspeichern Beispiele Auswertung arithmetischer Ausdrücke (/* Randbedingungen */)

15 3/1, Folie 15 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Infix-Notation (x+y) ((x*y)+z) ((x*(x+y))+z) Klammern in der Infix-Notation dienen zur Repräsentation von Prioritäten von Operatoren (/* hier machen wir uns das Leben einfacher */) Postfix-Notation xy+ xy+z* xxy+*z+ Auswertung arithmetischer Ausdrücke Grundlagen (/* Infix- versus Postfix-Notation */)

16 3/1, Folie 16 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks... Auswertung gemäß Baumstruktur (/* aufbauen + auswerten */) ((x*(x+y))+z) + val(z)* + val(y)val(x) Auswertung arithmetischer Ausdrücke Auswertung eines arithmetischen Ausdrucks in Infix-Notation

17 3/1, Folie 17 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Auswertung arithmetischer Ausdrücke 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

18 3/1, Folie 18 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks von links nach rechts durchlaufen; unter Verwendung eines Stacks auswerten Auswertung arithmetischer Ausdrücke Auswertung eines arithmetischen Ausdrucks in Postfix-Notation 223+*1+ Ausgabe: 11 Auszuwertender Ausdruck: ((2*(2+3))+1)

19 3/1, Folie 19 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks von links nach rechts durchlaufen; unter Verwendung eines Stacks auswerten aaaaddf aace b a = val(x) b = val(y) e = val(z) f = d+e c = a+b d = a+c Abkürzungen: Auswertung arithmetischer Ausdrücke Auswertung eines arithmetischen Ausdrucks in Postfix-Notation xxy+*z+ Ausgabe: f Auszuwertender Ausdruck: ((x*(x+y))+z)

20 3/1, Folie 20 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks 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 Regeln für Schritt 2

21 3/1, Folie 21 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks ******++ ++ Ausgabe: Auswertung arithmetischer Ausdrücke von links nach rechts durchlaufen; unter Verwendung eines Stacks ausgeben Umwandlung von Infix-Notation in Postfix-Notation xxy+*z+ ((x*(x+y))+z)

22 3/1, Folie 22 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks 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 Auswertung arithmetischer Ausdrücke Regeln für Schritt 2

23 3/1, Folie 23 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen 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 Aufgabenstellung... betrachten Varianten der Realisierung mit Hilfe eines Arrays, d.h. die Anzahl der zu verwaltenden Objekte ist a priori begrenzt

24 3/1, Folie 24 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen 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) */)

25 3/1, Folie 25 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen Anwendungen Steuerung von Druckerwarteschlangen (/* den Benutzern werden Gruppen zugeordnet,... */) als zugrunde liegende Datenstruktur diverser Algorithmen (/* sehen wir später */)

26 3/1, Folie 26 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen 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

27 3/1, Folie 27 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen 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 */)

28 3/1, Folie 28 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Stacks Prioritätswarteschlangen 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 eg db fc Ein Knoten o mit den Söhnen o l und o r hat die Heap-Eigenschaft, falls p(o) p(o l ) und p(o) p(o r ) gilt.... jeder Knoten muß die Heap- Eigenschaft haben aegdbfc

29 3/1, Folie 29 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen insert()-Operation ++anz; pqueue[anz] = o auf dem Weg von pqueue[1] zu pqueue[anz] das neue Objekt o an die richtige Position steigen lassen... geht in Zeit O(log(n)) 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 gf ce b a gf ce bd d ga ce bf agfcebagfcebddgacebf Prioritätswarteschlangen

30 3/1, Folie 30 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen acc_del()-Operation y = pqueue[1]; pqueue[1] = pqueue[anz]; --anz Objekt an Position pqueue[1] an die richtige Position sinken lassen; return(y)... geht in Zeit O(log(n)) aegdbfc 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 eg db fc c eg db f g ec db f cegdbfgecdbf Prioritätswarteschlangen

31 3/1, Folie 31 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen init()-Operation 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 */)... geht in Zeit O(n) abcdefgdagbefc Prioritätswarteschlangen 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 bc de fg d ag be fc


Herunterladen ppt "3/1, Folie 1 © 2010 Prof. Steffen Lange - HDa/FbI - Datenstrukturen Kapitel 3: Elementare Datenstrukturen / Anwendungen Gliederung 1.Motivation / Grundlagen."

Ähnliche Präsentationen


Google-Anzeigen