Baum

Werbung
Datenstrukturen und
Algorithmen
VO INF.02031UF
Bäume
[email protected]
1
Inhalt der Vorlesung
1. Motivation, Einführung, Grundlagen
2. Algorithmische Grundprinzipien
3. Sortierverfahren
4. Halden
5. Gestreute Speicherung
6. Suchen in linearen Feldern
7. Bäume
Bäume
[email protected]
2
In der letzten Vorlesung
1. Statische, kleine Menge: Feld als Datenstruktur
• Ohne Vorsortierung, z.B. A=[34, 4, 99, 13, 42]
– Sequentielle Suche
– Selbstanordnende Felder
• Mit Vorsortierung, z.B. A=[4, 13, 34, 42, 99]
–
–
–
–
Binärsuche
Interpolationssuche
Quadratische Binärsuche
Fastsearch
Suchen in linearen Feldern
[email protected]
3
In dieser Vorlesung
2. Dynamisch, große Menge , effiziente Zugriffe notwendig
• z.B. große Produktdatenbanken, Suchmaschinen, …
• Lösung: Baum als dynamische Datenstruktur (einfügen,
löschen), organisiert als binärer Suchbaum. Suchen in O(h),
wobei h die Baumhöhe ist.
• Effizientes Suchen: Binärer Suchbaum, der eine möglichst
geringe Höhe h garantiert. Sollte möglichst balanziert sein,
z.B. 2-4 Baum, Rot-Schwarz Baum usw.
Suchen in linearen Feldern
[email protected]
4
Bäume
• Definition:
Ein Baum ist eine Menge, die durch eine sog.
Nachfolgerrelation strukturiert ist.
Elemente: Knoten
• In einem Baum gilt:
1
–  Knoten w ohne Parent(w)  (w=Wurzel)
1
–  Knoten k≠w  Knotenfolge k0, k1, …, kt
mit k0=k, kt=w und ki=Parent(ki-1) für i=1, 2, …, t.
(Ast zwischen k und w, Länge t,
t … Tiefe des Knotens k)
Parent(x)
Kind(k)
Bäume
[email protected]
5
Bäume
•
Ordnung eines Knotens: Anzahl seiner Kinder
•
Ordnung eines Baumes: maximale Ordnung aller Knoten
•
Höhe eines Baumes: Länge des längsten Astes.
•
Die Knoten eines Baumes sind entweder
– Blätter (Knoten ohne Kinder, Ordnung 0) oder
– Innere Knoten (Ordnung >0)
•
Jeder Knoten ist Wurzel eines Teilbaumes
•
Voller Baum der Ordnung k: Jeder Knoten
hat genau k Kinder oder ist ein Blatt
•
Vollständiger Baum: Voller Baum, bei dem
jedes Blatt gleiche Tiefe hat
Bäume
[email protected]
Parent(k)
Kind(k)
6
Bäume
• Baumartige Strukturen treten häufig auf:
– Hierarchische Strukturen:
– Inklusionsstrukturen:
Bäume
[email protected]
7
Bäume
Bäume
[email protected]
8
Bäume
• Anwendungen in der Informatik:
–
–
–
–
–
–
Rekursionsbäume
Entscheidungsbäume
Suchbäume
Haldenbäume
Codebäume u.v.a.
Hierarchisches Clustering von Daten
/
Beispiel (Syntaxbäume):
Arithmetische Ausdrücke
Blätter (= Knoten ohne Kinder) enthalten
Zahlen, innere Knoten speichern
Operatoren (+, -, *, /).
*
+
2
Bäume
[email protected]
+
3
4
3
5
9
Binärbäume
• Jeder Knoten hat maximal zwei Nachfolger
• Grundlegende Operationen:
–
–
–
–
–
Wurzel(B):
Links(k):
Rechts(k):
Parent(k):
Wert(k):
Liefert den Wurzelknoten des Baumes B
Liefert das linke Kind von Knoten k
Liefert das rechte Kind von Knoten k
Liefert Parent-knoten von Knoten k
Liefert den in Knoten k gespeicherten Wert
Parent
Existiert ein Kind- oder ein Parent-knoten nicht,
wird nil zurückgeliefert
Bäume
[email protected]
10
Binärbäume
• Auslesereihenfolge der Knoten:
– Symmetrische Reihenfolge (SR, inorder):
linker Teilbaum in SR, Wurzel, rechter Teilbaum in SR
Aufruf: SR(Wurzel(B))
T(n) = Θ(n)
n…Anzahl der Knoten
Beispiel:
/
*
+
2
Bäume
+
3
4
3
Infix-Notation
5
[email protected]
11
Binärbäume
• Reihenfolge der Knoten:
– Hauptreihenfolge (HR, preorder):
Wurzel, linker Teilbaum in HR, rechter Teilbaum in HR
– Nebenreihenfolge (NR, postorder):
linker Teilbaum in NR, rechter Teilbaum in NR, Wurzel
/
*
+
(HR)
+
3
4
3
(NR)
2
Bäume
5
Postfix-Notation
[email protected]
12
Sortierte Binärbäume
• Binäre Suchbäume sind in symmetrischer Reihenfolge sortiert
Knoten im linken Teilbaum
≤ Wurzel ≤ Knoten im
rechten Teilbaum
Bäume
[email protected]
13
Sortierte Binärbäume
• Suchen (binäre Suche):
b … gesuchter Wert
k … Wurzel des Teilbaums
Aufruf: SUCHE(b, Wurzel(B))
Suchzeit: O(h)
h … Höhe des Baumes (= Länge des längsten Astes)
Bäume
[email protected]
14
Sortierte Binärbäume
• Minimum und Maximum:
BAUM_MINIMUM(k)
1: WHILE links(k)≠nil
2:
k ← links(k)
3: RETURN wert(k)
BAUM_MAXIMUM(k)
1: WHILE rechts(k)≠nil
2:
k ← rechts(k)
3: RETURN wert(k)
Bäume
[email protected]
k … Wurzel des Teilbaums
Aufruf:
BAUM_MINIMUM(Wurzel(B))
BAUM_MAXIMUM(Wurzel(B))
Laufzeit:
jeweils O(h)
15
Sortierte Binärbäume
• Einfügen:
Wert suchen,
Dann entsprechend als Blatt
anhängen.
Bäume
[email protected]
16
Sortierte Binärbäume
Laufzeit: O(h)
• Einfügen:
EINFÜGEN(B,k)
1: y ← nil; x ← wurzel(B)
2: WHILE x≠nil
3:
y←x
4:
IF wert(k) < wert(x) THEN
5:
x ← links(x)
6:
ELSE
7:
x ← rechts(x)
8: parent(k) ← y
9: IF y=nil THEN
10: wurzel(B) ← k
11: ELSE IF wert(k) < wert(y) THEN
12:
links(y) ← k
13: ELSE rechts(y) ← k
Bäume
Fügt den Knoten k in den Binärbaum B ein
Simuliere eine Suche nach k, bis zu einer
freien Stelle (x=nil).
y…zukünftiger Parent
Dort fügen wir das Element als Kind von y
ein.
Baum B war leer
[email protected]
17
Sortierte Binärbäume
• Aufbau eines sortierten Binärbaumes:
– durch wiederholtes Einfügen (⇒ natürliche Bäume)
– Binärbaum hängt von der Reihenfolge der Elemente ab
T(n) = O(n*h)
= Θ(n2), wenn h = Θ(n)
Einige
Reihenfolgen
liefern entartete
Bäume (= Listen)
Fügt man randomisiert ein, ist 𝐸 ℎ = Θ log 𝑛
Bäume
[email protected]
18
Sortierte Binärbäume
• Entfernen:
Suchen ⇒ Knoten k
a) k ist Blatt: abhängen
b) k hat nur ein Kind:
Teilbaum von diesem Kind an Parent(k) anhängen
c)
Bäume
k hat 2 Kinder: Finde k': nächster
Knoten in der sortierten Knotenfolge
(gehe einmal rechts, dann immer links)
→ k' hat kein linkes Kind!
Setze WERT(k) = WERT(k' )
Entferne k'‚ (Fall a oder b)
Laufzeit: O(h)
[email protected]
19
Sortierte Binärbäume
• Vorgänger und Nachfolger:
Nachfolger von k: Nächster Knoten in der (nach Werten) sortierten Reihenfolge
(= nächstgrößerer Wert im Baum oder gleicher Wert)
NACHFOLGER(k)
1: IF rechts(k) ≠ nil
2:
return BAUM_MINIMUM(rechts(k))
3: y ← parent(k)
4: WHILE y ≠ nil AND k = rechts(y)
5:
k←y
6:
y ← parent(y)
7: return(y)
Wenn ein rechtes Kind existiert,
suche das Minimum in diesem
Teilbaum, …
… sonst suche den niedrigsten
Knoten, bei dem sich k im
linken Teilbaum befindet
Laufzeit: O(h)
Bäume
[email protected]
20
Sortierte Binärbäume
• Vorgänger und Nachfolger:
Vorgänger von k: Vorgängerknoten in der (nach Werten) sortierten Reihenfolge
VORGÄNGER(k)
1: IF links(k) ≠ nil
2:
return BAUM_MAXIMUM(links(k))
3: y ← parent(k)
4: WHILE y ≠ nil AND k = links(y)
5:
k←y
6:
y ← parent(y)
7: return(y)
Wenn ein linkes Kind existiert,
suche das Maximum in diesem
Teilbaum, …
… sonst suche den niedrigsten
Knoten, bei dem sich k unter
dem rechten Kind befindet
Laufzeit: O(h)
Bäume
[email protected]
21
Sortierte Binärbäume
• Zusammenfassung:
–
–
–
–
–
–
–
Minimum
Maximum
Vorgänger
Nachfolger
Einfügen
Löschen
Suchen
Alle Operationen in O(h) Zeit
h … Baumhöhe
• Vorteil: dynamische Lösung des Wörterbuchproblems
• Nachteil: Zeiten bis zu Θ(n) (bei entarteten Bäumen).
Bäume
[email protected]
22
Herunterladen