elementare Datenstrukturen

Werbung
elementare Datenstrukturen
Wie die Daten das Laufen lernten
Andreas Ferber
[email protected]
elementare Datenstrukturen – p.1/40
KISS
elementare Datenstrukturen – p.2/40
KISS
(Keep It Simple, Stupid)
Immer die einfachste mögliche Datenstruktur
benutzen!
elementare Datenstrukturen – p.2/40
(Container-)Datenstrukturen
•
speichern große und variable Mengen
zusammengehöriger Daten
elementare Datenstrukturen – p.3/40
(Container-)Datenstrukturen
•
speichern große und variable Mengen
zusammengehöriger Daten
•
erleichtern deren Handhabung
elementare Datenstrukturen – p.3/40
(Container-)Datenstrukturen
•
speichern große und variable Mengen
zusammengehöriger Daten
•
erleichtern deren Handhabung
•
präsentieren die Daten in einer geeigneten Form
für einen Algorithmus
elementare Datenstrukturen – p.3/40
(Container-)Datenstrukturen
•
speichern große und variable Mengen
zusammengehöriger Daten
•
erleichtern deren Handhabung
•
präsentieren die Daten in einer geeigneten Form
für einen Algorithmus
•
Hilfsmittel bei Effizienzabschätzungen
elementare Datenstrukturen – p.3/40
Arrays und Vektoren
•
einfache Handhabung
•
in den meisten Sprachen eingebaut
•
Vektor = eindimensionales Array
•
Beispiel Java:
int a[] = new int[42];
a[23] = 4711;
int koelnisch_wasser = a[23];
elementare Datenstrukturen – p.4/40
Terminologie: Graphen
•
Knoten und Kanten
a
f
b
c
d
e
elementare Datenstrukturen – p.5/40
Terminologie: Graphen
•
Knoten und Kanten
a
c
•
f
b
d
e
gerichtete Kanten (Pfeile)
elementare Datenstrukturen – p.5/40
Terminologie: Graphen
•
Knoten und Kanten
a
c
•
f
b
d
e
gerichtete Kanten (Pfeile)
elementare Datenstrukturen – p.5/40
Listen
elementare Datenstrukturen – p.6/40
Listen
•
gerichtete Graphen
•
einfach verkettet: jeder Knoten besitzt einen Pfeil
zu seinem Nachfolger
•
doppelt verkettet: Pfeile zu Nachfolger und
Vorgänger
elementare Datenstrukturen – p.7/40
Darstellung von Knoten in Java
public class SListNode {
public Object data;
public SListNode next;
}
public class DListNode {
public Object data;
public DListNode prev, next;
}
elementare Datenstrukturen – p.8/40
Einfügen in eine Liste
•
gegeben: Knoten N , Vorgänger S
S
S
N
N
N.next = S.next;
S.next = N;
elementare Datenstrukturen – p.9/40
Einfügen in eine Liste
•
gegeben: Knoten N , Vorgänger S
S
S
N
N
N.next = S.next;
S.next = N;
N.prev = S;
N.next.prev = N;
elementare Datenstrukturen – p.9/40
Entfernen von Listenelementen
•
gegeben: Vorgänger S
S
S
S.next = S.next.next;
elementare Datenstrukturen – p.10/40
Entfernen von Listenelementen
•
gegeben: Vorgänger S
S
S
S.next = S.next.next;
S.next.prev = S;
elementare Datenstrukturen – p.10/40
Durchlaufen von Listen
•
gegeben: Knoten N
•
Nachfolger:
N = N.next;
•
Vorgänger:
N = N.prev;
elementare Datenstrukturen – p.11/40
Komplexität: Vektor vs. Liste
Vektor
Liste
einfach doppelt
Speicherbedarf
O(n)
O(n)
O(n)
Aufbau
Einfügen
Löschen
Nachfolger
Vorgänger
Zugriff
Suche
O(n)
O(n)
O(n)
O(1)
O(1)
O(1)
O(n)
O(n)
O(1)
O(1)
O(1)
O(n)
O(n)
O(n)
O(n)
O(1)
O(1)
O(1)
O(1)
O(n)
O(n)
elementare Datenstrukturen – p.12/40
Overhead von Datenstrukturen
•
Aufwand zur Speicherung und Pflege der
Datenstrukturen selbst
•
geht ein in konstante Faktoren bei
Komplexitätsbetrachtungen
elementare Datenstrukturen – p.13/40
(Mikro-)Optimierungen bei Listen
•
zusätzlich gemerkte Referenz auf das Ende
ermöglicht Anhängen in O(1)
•
Länge der Liste merken
•
unbenutzter Knoten am Anfang oder Ringbildung
erspart Spezialfälle
elementare Datenstrukturen – p.14/40
Bäume
elementare Datenstrukturen – p.15/40
Bäume
•
gerichtete azyklische Graphen
•
jeder Knoten besitzt höchstens einen Vorgänger
(parent)
•
jeder Knoten besitzt keinen, einen oder mehrere
Nachfolger (childs)
elementare Datenstrukturen – p.16/40
Terminologie: Bäume
•
Blattknoten (leaf):
kein Nachfolger
•
innere Knoten: alle außer den
Blättern
•
Wurzelknoten (root): einziger
Knoten ohne Vorgänger
•
•
Zweig (branch): Pfad von der
Wurzel bis zu einem Blatt
R
L
L
L
L
Schlüssel (key): in einem Knoten gespeicherter Wert
elementare Datenstrukturen – p.17/40
binäre Bäume
•
jeder Knoten besitzt höchstens zwei Nachfolger
•
Sortierung z.B.:
• Werte in den Blättern speichern
• Schlüssel von inneren Knoten so wählen, daß
gilt:
• linker Teilbaum: alle Schlüssel kleiner oder
gleich dem des Knotens
• rechter Teilbaum: alle Schlüssel größer als
der des Knotens
elementare Datenstrukturen – p.18/40
Suche in binären Bäumen
•
gegeben: gesuchter Schlüssel S , Wurzel R
C←R
while (C 6= null) ∧ (C is not leaf) do
if S ≤ C.key then
C ← C.lef t
else
C ← C.right
end if
end while
if (C 6= null) ∧ (C.key = S) then
found
else
not found
end if
elementare Datenstrukturen – p.19/40
Entartung von Bäumen
•
Baum wird effektiv zu einfach verketteter Liste:
R
• ⇒
Baum muß ausbalanciert werden
elementare Datenstrukturen – p.20/40
balancierte Bäume
•
spezielle Algorithmen für Veränderungen am
Baum
•
der Baum bleibt immer (annähernd) ausbalanciert
•
Beispiele:
• AVL-Trees
• 2-3-Trees
• 2-3-4-Trees
• Red/Black-Trees
elementare Datenstrukturen – p.21/40
Red/Black-Trees
•
„rote“ und „schwarze“ Kanten
•
Invarianten:
• alle Zweige haben die gleiche Anzahl
schwarzer Kanten
• alle Blätter sind durch schwarze Kanten
angebunden
• auf keinem Pfad folgen zwei rote Kanten direkt
aufeinander
längster Zweig höchstens doppelt so lang wie
kürzester Zweig
• ⇒
elementare Datenstrukturen – p.22/40
RB-Trees: Beispiel
R
c
a
b
d
g
e
h
f
elementare Datenstrukturen – p.23/40
RB-Trees: Beispiel
R
c
a
b
d
g
h
?
e
elementare Datenstrukturen – p.23/40
RB-Trees: Beispiel
R
c
a
b
d
g
e
h
f
elementare Datenstrukturen – p.23/40
RB-Tree-Knoten in Java
public class RBTreeNode {
Object key;
RBTreeNode left, right, parent;
boolean isBlack;
}
elementare Datenstrukturen – p.24/40
Einfügen in RB-Trees Phase I
•
gegeben: neuer Knoten S
•
1. S suchen, fertig falls gefunden
2. letzten besuchten Knoten S 0 merken
3. S 0 durch neuen roten Knoten R mit S und S 0 als
Nachfolger ersetzen (Schlüssel von R: kleinerer
der Werte S und S 0 )
Q
Q
S’
R
S
S’
elementare Datenstrukturen – p.25/40
Einfügen in RB-Trees Phase II
P
Q
1
R
2
S
S’
(Fall 1)
elementare Datenstrukturen – p.26/40
Einfügen in RB-Trees Phase II
P
P
Q
1
R
2
Q
1
S
(Fall 1)
R
2
S’
S
S’
(Fall 2)
elementare Datenstrukturen – p.26/40
Einfügen in RB-Trees Phase II
P
P
Q
1
Q
1
R
2
S
(Fall 1)
P
R
2
S’
Q
1
S
(Fall 2)
R
2
S’
S
S’
(Fall 3)
elementare Datenstrukturen – p.26/40
Einfügen in RB-Trees Phase II
P
P
Q
1
Q
1
R
2
3
(Fall 1)
P
R
2
4
Q
1
3
(Fall 2)
R
2
4
3
4
(Fall 3)
elementare Datenstrukturen – p.26/40
Einfügen in RB-Trees Phase II (2a)
•
Fall 2a: Links-Rotation
P
Q
1
R
2
3
4
elementare Datenstrukturen – p.27/40
Einfügen in RB-Trees Phase II (2a)
•
Fall 2a: Links-Rotation
Q
P
Q
1
P
R
2
3
1
R
2
3
4
4
elementare Datenstrukturen – p.27/40
Einfügen in RB-Trees Phase II (2a)
•
Fall 2a: Links-Rotation
Q
P
Q
1
P
R
2
3
1
R
2
3
4
4
elementare Datenstrukturen – p.27/40
Einfügen in RB-Trees Phase II (2b)
•
Fall 2b: Rechts-Links-Rotation
P
Q
1
R
2
4
3
elementare Datenstrukturen – p.28/40
Einfügen in RB-Trees Phase II (2b)
•
Fall 2b: Rechts-Links-Rotation
P
P
Q
1
R
R
1
4
Q
2
3
2
3
4
elementare Datenstrukturen – p.28/40
Einfügen in RB-Trees Phase II (2b)
•
Fall 2b: Rechts-Links-Rotation
P
P
Q
1
R
2
4
3
R
1
Q
2
3
4
elementare Datenstrukturen – p.28/40
Einfügen in RB-Trees Phase II (2b)
•
Fall 2b: Rechts-Links-Rotation
P
Q
1
R
2
R
P
4
3
R
1
P
Q
2
3
1
Q
2
3
4
4
elementare Datenstrukturen – p.28/40
Einfügen in RB-Trees Phase II (2b)
•
Fall 2b: Rechts-Links-Rotation
P
Q
1
R
2
R
P
4
3
R
1
P
Q
2
3
1
Q
2
3
4
4
elementare Datenstrukturen – p.28/40
Einfügen in RB-Trees Phase II (3)
•
Fall 3: neu kolorieren und aufwärts bewegen
P
Q
1
R
2
3
4
elementare Datenstrukturen – p.29/40
Einfügen in RB-Trees Phase II (3)
•
Fall 3: neu kolorieren und aufwärts bewegen
P
P
Q
1
R
2
3
Q
1
R
2
4
3
4
elementare Datenstrukturen – p.29/40
Einfügen in RB-Trees Phase II (3)
•
Fall 3: neu kolorieren und aufwärts bewegen
P
Q
1
P’
P
R
2
3
Q
1
R
2
4
3
Q’
1’
2’
4
R’ =P
3’ =1 4’
elementare Datenstrukturen – p.29/40
Einfügen in RB-Trees Phase II (3)
•
Fall 3: neu kolorieren und aufwärts bewegen
P
Q
1
P’
P
R
2
3
Q
1
R
2
4
3
Q’
1’
2’
4
R’ =P
3’ =1 4’
elementare Datenstrukturen – p.29/40
Entfernen aus RB-Trees Phase I
•
gegeben: zu entfernender Wert S
•
1. Wert S im Baum suchen
2. Knoten S und Vorgänger P entfernen
Q
P
S
Q
Q
S’
S’
P
S
Q
S’
S’
S’
short node
elementare Datenstrukturen – p.30/40
Entfernen aus RB-Trees Phase II
(1)
Q
R
X
1
2
elementare Datenstrukturen – p.31/40
Entfernen aus RB-Trees Phase II
(1)
(2)
Q
R
X
1
Q
R
X
S
2
1
3
2
elementare Datenstrukturen – p.31/40
Entfernen aus RB-Trees Phase II
(1)
(2)
Q
R
X
1
(3)
Q
R
X
S
2
1
Q
R
X
3
1
2
2
elementare Datenstrukturen – p.31/40
Entfernen aus RB-Trees Phase II
(1)
(2)
Q
R
X
1
(3)
Q
R
X
S
2
1
(4)
Q
R
X
3
1
2
2
Q
R
X
1
2
elementare Datenstrukturen – p.31/40
Entfernen aus RB-Trees Phase II (1)
•
Fall 1: Rotation und umfärben
Q
R
X
1
2
elementare Datenstrukturen – p.32/40
Entfernen aus RB-Trees Phase II (1)
•
Fall 1: Rotation und umfärben
Q
R
R
X
1
Q
2
X
2
1
elementare Datenstrukturen – p.32/40
Entfernen aus RB-Trees Phase II (1)
•
Fall 1: Rotation und umfärben
Q
R
R
X
1
Q
2
X
2
1
elementare Datenstrukturen – p.32/40
Entfernen aus RB-Trees Phase II (1)
•
Fall 1: Rotation und umfärben
Q
R
R
X
1
Q
2
X
2
1
elementare Datenstrukturen – p.32/40
Entfernen aus RB-Trees Phase II (2)
•
Fall 2: Doppel-Rotation und umfärben
Q
R
X
S
1
3
2
elementare Datenstrukturen – p.33/40
Entfernen aus RB-Trees Phase II (2)
•
Fall 2: Doppel-Rotation und umfärben
Q
Q
R
X
S
1
3
2
S
X
R
1
2
3
elementare Datenstrukturen – p.33/40
Entfernen aus RB-Trees Phase II (2)
•
Fall 2: Doppel-Rotation und umfärben
Q
Q
R
X
S
1
2
S
X
3
S
Q
R
1
2
X
R
1
2
3
3
elementare Datenstrukturen – p.33/40
Entfernen aus RB-Trees Phase II (2)
•
Fall 2: Doppel-Rotation und umfärben
Q
Q
R
X
S
1
2
S
X
3
S
Q
R
1
2
X
R
1
2
3
3
elementare Datenstrukturen – p.33/40
Entfernen aus RB-Trees Phase II (2)
•
Fall 2: Doppel-Rotation und umfärben
Q
Q
R
X
S
1
2
S
X
3
S
Q
R
1
2
X
R
1
2
3
3
elementare Datenstrukturen – p.33/40
Entfernen aus RB-Trees Phase II (3)
•
Fall 3: neu kolorieren
Q
R
X
1
2
Q
R
X
1
2
elementare Datenstrukturen – p.34/40
Entfernen aus RB-Trees Phase II (3)
•
Fall 3: neu kolorieren
Q
Q
R
X
1
2
1
Q
1
2
Q
R
X
R
X
R
X
2
1
2
elementare Datenstrukturen – p.34/40
Entfernen aus RB-Trees Phase II (3)
•
Fall 3: neu kolorieren
Q
Q
R
X
1
2
1
Q
1
2
Q
R
X
R
X
R
X
2
1
2
elementare Datenstrukturen – p.34/40
Entfernen aus RB-Trees Phase II (3)
•
Fall 3: neu kolorieren
Q
Q
R
X
1
2
1
Q
1
2
Q
R
X
R
X
R
X
2
1
2
elementare Datenstrukturen – p.34/40
Entfernen aus RB-Trees Phase II (4)
•
Fall 4: Rotation
Q
R
X
S
1
3
2
elementare Datenstrukturen – p.35/40
Entfernen aus RB-Trees Phase II (4)
•
Fall 4: Rotation
Q
R
R
X
S
1
Q
3
2
3
S
X
1
2
elementare Datenstrukturen – p.35/40
Entfernen aus RB-Trees Phase II (4)
•
Fall 4: Rotation
Q
R
R
X
S
1
Q
3
2
3
S
X
1
2
elementare Datenstrukturen – p.35/40
Komplexität: RB-Tree
Speicherbed.
Aufbau
Einfügen
Löschen
Nachfolger
Vorgänger
Suche
RB-Tree
Liste
sortierter
Vektor
O(n)
O(n)
O(n)
O(n log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(n)
O(1)
O(1)
O(1)
O(1)
O(n)
O(n log n)
O(n)
O(n)
O(1)
O(1)
O(log n)
elementare Datenstrukturen – p.36/40
(Mikro-)Optimierungen bei Bäumen
•
Nutzdaten auch in inneren Knoten speichern
•
z.B. mit Liste kombinieren
elementare Datenstrukturen – p.37/40
to boldly go . . .
•
Heaps
•
Hash-Tabellen
•
Radix-Bäume
•
Range-Trees, Quad-Trees etc.
•
...
elementare Datenstrukturen – p.38/40
Fazit
•
jede Datenstruktur hat spezifische Vor- und
Nachteile
•
es gibt keine universell einsetzbare Datenstruktur
•
Datenstrukturen sind Baukästen
•
Overhead nicht vergessen!
elementare Datenstrukturen – p.39/40
Viel Spaß am Gerät!
elementare Datenstrukturen – p.40/40
Herunterladen