Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundlagen der Algorithmen und Datenstrukturen Kapitel

Ähnliche Präsentationen


Präsentation zum Thema: "Grundlagen der Algorithmen und Datenstrukturen Kapitel"—  Präsentation transkript:

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

2 Sequenzen Sequenz: s = <e0,…,en-1>
Arten, auf Element zuzugreifen: Feldrepräsentation: absoluter Zugriff über s[i] Listenrepräsentation: relativer Zugriff über Nachfolger und/oder Vorgänger s[0]: e0 s[1] s[2] s[3] s[4] s[5] …. e0 e1 Nachf. Vorg. e2 e3 …. 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 e e e

4 Doppelt verkettete Liste
Einfache Verwaltung: durch „Dummy“-Element mit Inhalt ?: Anfangs: ? e1 e2 en ?

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

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

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 ? e1 en ? Kann evtl. auf ?-Element zeigen! 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 ? e1 en

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()) h b 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()) h 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 x e1 en

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 e e

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

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

16 Stack Operationen: pushBack: <e0,…,en>.pushBack(e) = <e0,…,en,e> popBack: <e0,…,en>.popBack = <e0,…,en-1> last: last(<e0,…,en>) = en Implementierungen auf vorherigen Folien.

17 FIFO-Queue Operationen:
pushBack: <e0,…,en>.pushBack(e) = <e0,…,en,e> popFront: <e0,…,en>.popFront = <e1,…,en> first: first(<e0,…,en>) = e0 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) b n 1 h t 2 3 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<n b[t] := x t := (t+1) mod (n+1) Procedure popFront() assert (not isEmpty()) h := (h+1) mode (n+1) b n 1 h t 2 3 pop push . . .

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 1 3 10 14 19 insert(5) 1 3 5 10 14 19 remove(14) 1 3 5 10 19

22 Beispiel: Sortierte Sequenz
S: sortierte Sequenz Jedes Element e identifiziert über Key(e). Operationen: <e0,…,en>.insert(e) = <e0,…,ei,e,ei+1,…,en> für das i mit Key(ei) < Key(e) < Key(ei+1) <e0,…,en>.remove(k) = <e0,…,ei-1,ei+1,…,en> für das i mit Key(ei)=k <e0,…,en>.find(k) = ei für das i mit Key(ei)=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: 1 3 10 14 19 insert(5) 1 3 5 10 14 19 remove(14) 1 3 5 10 19

26 Beispiel: Sortierte Sequenz
Durch geschickte Verteilung der Lücken: amortierte Kosten für insert und remove (log2 n) 1 3 10 14 19 insert(5) 1 3 5 10 14 19 remove(14) 1 3 5 10 19

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


Herunterladen ppt "Grundlagen der Algorithmen und Datenstrukturen Kapitel"

Ähnliche Präsentationen


Google-Anzeigen