Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten

Werbung
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)
Herunterladen