Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundlagen der Algorithmen und Datenstrukturen Kapitel 3.3-3.5 Prof. Dr. Christian Scheideler.

Ähnliche Präsentationen


Präsentation zum Thema: "Grundlagen der Algorithmen und Datenstrukturen Kapitel 3.3-3.5 Prof. Dr. Christian Scheideler."—  Präsentation transkript:

1 Grundlagen der Algorithmen und Datenstrukturen Kapitel Prof. Dr. Christian Scheideler

2 Sequenzen Sequenz: s = Arten, auf Element zuzugreifen: Feldrepräsentation: absoluter Zugriff über s[i] Listenrepräsentation: relativer Zugriff über Nachfolger und/oder Vorgänger s[0]: e 0 s[1]s[2]s[3]s[4]s[5]…. e0e0 e1e1 Nachf. Vorg. e2e2 Nachf. Vorg. e3e3 Nachf. Vorg. Nachf. Vorg. …. s

3 Doppelt verkettete Liste Type Handle=Pointer to Item Class Item of Element e: Element next: Handle prev: Handle Class List of Item h: Handle …weitere Variablen und Operationen… Invariante: (this: Zeiger auf aktuelles Element) next! prev = prev! next = this eee … …

4 Doppelt verkettete Liste Einfache Verwaltung: durch Dummy-Element mit Inhalt ?: Anfangs: e1e1 ? … e2e2 enen ?

5 Doppelt verkettete Liste Zentrale Operation: splice splice entfernt aus Sequenz und fügt sie hinter einem t an. Bedingung: muss eine Teilse- quenz sein, b ist nicht vor a, und t darf nicht in sein. Splice (, a, b, t) =

6 Doppelt verkettete Liste Procedure splice(a,b,t: Handle) // schneide heraus a´ := a!prev b´ := b!next a´!next := b´ b´!prev := a´ // füge hinter t ein t´ := t!next b!next := t´ a!prev := t t!next := a t´!prev := b … … … … a´abb´ … … tabt´ … …

7 Doppelt verkettete Liste h: Handle auf ?-Item in List Function head(): Handle return h Function isEmpty: {0,1} return h.next = h Function first(): Handle return h.next Function last(): Handle return h.prev e1e1 ? … enen ? Kann evtl. auf ?-Element zeigen!

8 Doppelt verkettete Liste h: Handle to ?-Item of List Procedure moveAfter(b,a: Handle) splice(b,b,a) // schiebe b nach a Procedure moveToFront(b: Handle) moveAfter(b,head()) // schiebe b nach vorne Procudure moveToBack(b: Handle) moveAfter(b,last()) // schiebe b nach hinten e1e1 ? … enen

9 Doppelt verkettete Liste Löschen und Einfügen von Elementen: mittels extra Liste freeList Procedure remove(b:Handle) moveAfter(b, freeList.head()) Procedure popFront() remove(first()) Procedure popBack() remove(last()) … … hb … … … freeList freeList: gut für Lauf- zeit, da Speicher- allokation teuer

10 Doppelt verkettete Liste Function insertAfter(x: Element, a: Handle): Handle checkFreeList a´ := freeList.first() moveAfter(a´, a) a´!e := x return a´ Function insertBefore(x: Element, b: Handle): Handle return insertAfter(e, pred(b)) Procedure pushFront(x: Element) insertAfter(x, head()) Procedure pushBack(x: Element) insertAfter(x, last()) … … ha … a´ x

11 Doppelt verkettete Liste Manipulation ganzer Listen: Procedure concat(L: List) // L darf nicht leer sein! splice(L.first(), L.last(), last()) Procedure makeEmpty() freeList.concat(this) … … h last … … L

12 Doppelt verkettete Liste Suche nach einem Element: Trick: verwende Dummy-Element Function findNext(x:Element, from: Handle): Handle h.e := x while from! e <> x do from := from!next return from e1e1 x … enen

13 Einfach verkettete Liste Type SHandle=Pointer to SItem Class SItem of Element e: Element next: Handle Class SList of SItem h: SHandle …weitere Variablen und Operationen… e … ee …

14 Einfach verkettete Liste Procedure splice(a´, b, t: SHandle) a´!next := b!next t!next := a´!next b!next := t!next a´ … bb´a tt´

15 Stacks und Queues Grundlegende Datenstrukturen für Sequenzen: Stack FIFO-Queue:

16 Stack Operationen: pushBack:.pushBack(e) = popBack:.popBack = last: last( ) = e n Implementierungen auf vorherigen Folien.

17 FIFO-Queue Operationen: pushBack:.pushBack(e) = popFront:.popFront = first: first( ) = e 0 Implementierungen auf vorherigen Folien

18 Beschränkte FIFO-Queue Class BoundedFIFO(n: IN) of Element b: Array[0..n] of Element h=0: IN // Index des ersten Elements t=0: IN // Index des ersten freien Eintrags Function isEmpty(): {0,1} return h=t Function first(): Element return b[h] Function size(): IN return (t-h+n+1) mod (n+1) 0 n ht b pop push

19 Beschränkte FIFO-Queue Class BoundedFIFO(n: IN) of Element b: Array[0..n] of Element h=0: IN // Index des ersten Elements t=0: IN // Index des ersten freien Eintrags Procedure pushBack(x: Element) assert size

20 Fazit Listen sind sehr flexibel, wenn es darum geht, Elemente in der Mitte einzufügen Felder können in konstanter Zeit auf jedes Element zugreifen Listen haben kein Reallokationsproblem bei unbeschränkten Größen ! beide Datenstrukturen einfach, aber oft nicht wirklich zufriedenstellend

21 Beispiel: Sortierte Sequenz Problem: bewahre nach jeder Einfügung und Löschung eine sortierte Sequenz insert(5) remove(14)

22 Beispiel: Sortierte Sequenz S: sortierte Sequenz Jedes Element e identifiziert über Key(e). Operationen:.insert(e) = für das i mit Key(e i ) < Key(e) < Key(e i+1 ).remove(k) = für das i mit Key(e i )=k.find(k) = e i für das i mit Key(e i )=k

23 Beispiel: Sortierte Sequenz Realisierung als Liste: –insert, remove und find auf Sequenz der Länge n kosten im worst case (n) Zeit Realisierung als Feld: –insert und remove kosten im worst case (n) Zeit –find kann so realisiert werden, dass es im worst case nur O(log n) Zeit benötigt (! binäre Suche!)

24 Beispiel: Sortierte Sequenz Kann man insert und remove besser mit einem Feld realisieren? folge Beispiel der Bibliothek! verwende Hashtabellen (Kapitel 4)

25 Beispiel: Sortierte Sequenz Bibliotheksprinzip: lass Lücken! Angewandt auf sortiertes Feld: insert(5) remove(14)

26 Beispiel: Sortierte Sequenz Durch geschickte Verteilung der Lücken: amortierte Kosten für insert und remove (log 2 n) insert(5) remove(14)

27 Nächste Woche Weiter mit Kapitel 4: Hashtabellen Midterm am 29. Mai! Anmeldung über Grundstudiumstool


Herunterladen ppt "Grundlagen der Algorithmen und Datenstrukturen Kapitel 3.3-3.5 Prof. Dr. Christian Scheideler."

Ähnliche Präsentationen


Google-Anzeigen