Abstrakte Datentypen und Datenstrukturen/ Einfache Beispiele HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken. Datenstruktur (DS): Realisierung eines ADT (als Algorithmus/Programm) Ziel: Organisation der Objekte im Speicher derart, dass die Operationen effizient ausführbar sind. Prioritätswarteschlange /1 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Beispiel: Prioritätswarteschlange (Priority Queue) Die Objekte sind Mengen von Elementen eines Grundtyps T, auf dem eine vollständige Ordnung (≤) definiert ist. T können z.B. Integers, Strings sein. Folgende Operationen gehören zum ADT Priority Queue. Create (S): Insert (S, x): Maximum (S): Extract-Max (S): Erzeugt leere Menge S. Fügt Element x vom Typ T zu S hinzu (S ← S ∪ {x}). Gibt das größte Element aus S aus. Gibt größtes Element x von S aus und entfernt es aus S (S ← S - {x}). Prioritätswarteschlange /2 Datenstruktur: HEAP HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide (|S| = n) Create (S): Maximum(S): Lege leeren Heap an. Gebe A[1] aus. Insert (S, x): A [n +1] ← x; füge x an der „richtigen“ Position auf dem Weg A [n + 1] → A [1] ein. Extract-Max (S): Maximum (S); A [1] ← A [n]; Heapify (n-1, 1) → Zeit O (log (n)) Zeit O (1) für Insert, Extract-Max, für Create, Maximum. Nutzen von Datenstrukturen HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Bereitstellung von Operationen auf Objekten, die in einem Algorithmus häufig genutzt werden. Beispiel: Falls eine Prioritätswarteschlange implementiert ist, kann man einfach folgende Variante von Heapsort beschreiben: Eingabe: x1, ..., xn Für i =1, ..., n Für i =1, ..., n : : Insert (S, xi); Gebe Extract-Max(S) aus. Stack (Stapel, Keller) /1 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide ADT: Operationen: Create (S): Stack-Empty: Push (S, x): Pop (S): Erzeugt eine leere Menge S. Liefert den Wahrheitswert von „S = Ø“. Fügt x in S ein. Löscht das zuletzt eingefügte Element aus S. Stack / 2 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Datenstruktur: Array A, Integer-Variable TOP Create (S): Push (S,x): Pop (S): Erzeuge leeres Array A. TOP ← 0. TOP ← TOP + 1; A [TOP] ← x. Falls TOP =0 gebe Fehlermeldung aus („Underflow“) sonst TOP ← TOP -1 Zeit: O (1) pro Operation Schlange (Queue) /1 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide ADT: Create (S): Erzeugt eine leere Menge S. Enqueue (S, x): Fügt x zu S hinzu. Dequeue (S): Entfernt das am längsten in S befindliche Element und gibt es aus. Schlange /2 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Datenstruktur: Array A, Integer Variablen TAIL and HEAD Create (S): Enqueue (S, x): Dequeue (S): Zeit: Erzeuge Array A; HEAD ← 1; TAIL ← 1. A[TAIL] ← x; Falls TAIL = n, dann TAIL ← 1 sonst TAIL ← TAIL + 1. Gebe A[HEAD] aus; Falls HEAD = n, dann HEAD ← 1 sonst HEAD ← HEAD + 1 O (1) pro Operation Lineare Listen / 1 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide ADT: Create(L): Legt leere Liste L an. Im folgenden sei L die Liste a1, ..., an. Insert (x, p, L): Delete (x, L): Search (x, L): Füge x zwischen ap und ap + 1 ein, falls p = n ist, hinter ap bzw., falls p = 0 ist, vor a1. Entfernt das erste ap mit x = ap aus L, falls ein solches ap in L ist. Gebe (i, ai) für das kleinste i mit ai = x aus. Falls es nicht existiert, gebe „gibt es nicht“ aus. Lineare Listen /2 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Für die folgenden Operationen wird vorausgesetzt, dass die Position k von ap bekannt ist. Next (p, L): Falls p = 0: Gebe a1 aus. Falls p ≥ n: Gebe nil aus. Falls 0 < p < n: Gebe ap+1 aus. Prev (p, L): Falls p ≤ 1: Gebe nil aus. Falls p > n + 1: Gebe nil aus. Falls 2 < p ≤ n + 1: Gebe ap-1 aus. HEINZ NIXDORF INSTITUT Lineare Listen /3 Theoretische Informatik Friedhelm Meyer auf der Heide Datenstruktur: Doppelt verkettete Liste Beispiel: L (9, 16, 4) Nil (L) 9 16 4 dummy 1 6 7 16 9 4 PREV 7 6 1 4 NEXT 6 7 4 1 KEY nil 2 3 4 5 In diesem Fall ist Nil (L) =1, LENGTH (L) = 3. 8 9 Lineare Liste /3 Insert (x, p, L): HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Falls p < 0 oder p > LENGHT (L) ist, gebe Fehlermeldung aus. Sonst: KEY [NEW] ← x; Laufe von Nil (L) aus mit Hilfe der next-Zeiger bis zur Position k von ap. NEXT [NEW] ← NEXT [k]; PREV [NEXT [k]] ← NEW; NEXT [k] ← NEW; PREV [NEW] ← k. HEINZ NIXDORF INSTITUT Lineare Liste /4 Theoretische Informatik Friedhelm Meyer auf der Heide Beispiel: Insert (8,2,L) ergibt: Nil (L) 9 16 8 4 Lineare Liste / 5 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Laufzeiten: • Create, Next, Prev benötigen konstante Zeit. • Insert (x, p, L), Delete (x, L) benötigen Zeit O(p). • Search (x, L), Delete (x, L) benötigen Zeit O (LENGTH (L)) im worst case. Falls x = ap ist, benötigen sie Zeit O (p). Über den Nutzen guter Datenstrukturen: Topologisches Sortieren /1 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide G = (V, E) gerichteter Graph. Eine Nummerierung v1, ... vn der Knoten von S heißt topologische Nummerierung von G, falls für jedes i gilt: Die Vorgänger von vi haben kleinere Nummer als vi. Satz: G kann topologisch nummeriert werden, genau dann wenn G kreisfrei (azyklisch, ein acyclic, directed graph, DAG ) ist. Topologisches Sortieren / 2 Datenstruktur: HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Array A [1:n], A[i] enthält Integer V(i) und Zeiger auf lineare Liste L(i), Queue Q. Algorithmus: (1) Initialisiere die Datenstruktur wie folgt: Jedes V(i) enthält den Ingrad von i, L(i) die Nachfolger von i (d.h. alle j mit (i, j) ∈ E), und Q enthält alle Quellen von G. (2) Solange Q ≠ ∅ ist: (a) Gebe j = Dequeue (Q) aus. (b) Durchlaufe L(j) , für jedes i in L(j) subtrahiere eine 1 von V(i); falls V(i) = 0 wird: Enqueue (Q,i). Topologisches Sortieren / 3 HEINZ NIXDORF INSTITUT Theoretische Informatik Friedhelm Meyer auf der Heide Laufzeit: (1) Initialisierung: O (n + m) (2) Schleifendurchlauf für j = Dequeue (Q): 0 (1 + |L(j)|) Gesamtzeit: O (n + m + Σ1 ≤ j ≤ n (|L (j)| +1) = O (n + m) Satz: Topologisches Sortieren benötigt Zeit O (n + m)