Algorithmen und Datenstrukturen - Humboldt

Werbung
Übung Algorithmen und Datenstrukturen
Sommersemester 2016
Kim Völlinger
Humboldt-Universität zu Berlin
2
3
Binäre Suchbäume
• Knoten
• beinhaltet „Schlüssel“ ( label(v) )
• hat Verweis auf linkes ( v.leftChild() ) und rechtes Kind ( v.rightChild() )
• Sortierung/Sucheigenschaft
• Schlüssel des linken Teilbaums eines Knotens sind kleiner als Schlüssel des Knotens
selbst
• Schlüssel des rechten Teilbaums eines Knotens sind größer als Schlüssel des Knotens
selbst
• betrachten nur binäre Suchbäume ohne Duplikate
10
15
6
1
8
13
19
14
4
Symmetrischer Vorgänger
Der symmetrische Vorgänger ist der Knoten mit dem größten Schlüsselwert
kleiner als v. Er kann gefunden werden, ohne einen einzigen Vergleich der
Schlüsselwerte durchzuführen.
v
5
Symmetrischer Vorgänger
Algorithmus π‘†π‘¦π‘šπ‘šπ‘ƒπ‘Ÿπ‘’π‘‘π‘’π‘π‘’π‘ π‘ π‘œπ‘Ÿ (𝑣)
Algorithmus π‘‘π‘Ÿπ‘’π‘’π‘€π‘Žπ‘₯π‘–π‘šπ‘’π‘š(𝑣)
Input: Node 𝑣
Input: Node 𝑣
(1)
(2)
(3)
(4)
(1)
(2)
(3)
(4)
if (𝑣.leftChild()!= null) then
return treeMaximum(v.leftChild());
endif
return null
while(v.rightChild() != null) do
v = v.rightChild();
endwhile
return label(v)
Algorithmus π‘‘π‘Ÿπ‘’π‘’π‘€π‘Žπ‘₯π‘–π‘šπ‘’π‘š(𝑣)
Input: Node 𝑣
(1)
(2)
(3)
(4)
if (𝑣. rightChild() != null) then
return treeMaxmimum(𝑣. π‘Ÿπ‘–π‘”β„Žπ‘‘πΆβ„Žπ‘–π‘™π‘‘());
endif
return label(v)
6
Baumtraversierung
• Häufig müssen alle Knoten eines Baumes besucht werden, um bestimmte
Operationen auf ihnen durchführen zu können.
• Traversierungsarten
• Methoden unterscheiden sich in der Reihenfolge, in der Knoten besucht werden.
• Preorder: Wurzel, Linker TB, Rechter TB:
A, B, C, D
• Inorder: Linker TB, Wurzel, Rechter TB:
C, B, A, D
• Postorder: Linker TB, Rechter TB, Wurzel:
C, B, D, A
A
B
• Komplexität: 𝑂(|𝑉|)
D
C
7
Baumtraversierung
Gegeben Sei der nachfolgende Baum.
Gib die Schlüssel in Inorder- und Preorder-Reihenfolge an.
30
22
55
20
44
66
33
8
Baumtraversierung
• Inorder-/Preorder-/Postorder-Traversierung können elegant rekursiv
ausgedrückt werden.
Algorithmus π‘π‘Ÿπ‘’π‘œπ‘Ÿπ‘‘π‘’π‘Ÿ(𝑣)
Algorithmus π‘–π‘›π‘œπ‘Ÿπ‘‘π‘’π‘Ÿ(𝑣)
Algorithmus π‘π‘œπ‘ π‘‘π‘œπ‘Ÿπ‘‘π‘’π‘Ÿ(𝑣)
Input: Node 𝑣
Input: Node 𝑣
Input: Node 𝑣
(1)
(2)
(3)
(4)
(5)
(1)
(2)
(3)
(4)
(5)
(1)
(2)
(3)
(4)
(5)
if (𝑣!= null) then
print label(v);
preorder(𝑣. π‘™π‘’π‘“π‘‘π‘β„Žπ‘–π‘™π‘‘());
preorder(𝑣. π‘Ÿπ‘–π‘”β„Žπ‘‘π‘β„Žπ‘–π‘™π‘‘());
endif
if (𝑣!= null) then
inorder(𝑣. π‘™π‘’π‘“π‘‘π‘β„Žπ‘–π‘™π‘‘());
print label(v);
inorder(𝑣. π‘Ÿπ‘–π‘”β„Žπ‘‘π‘β„Žπ‘–π‘™π‘‘());
endif
if (𝑣!= null) then
postorder(𝑣. π‘™π‘’π‘“π‘‘π‘β„Žπ‘–π‘™π‘‘());
postorder(𝑣. π‘Ÿπ‘–π‘”β„Žπ‘‘π‘β„Žπ‘–π‘™π‘‘());
print label(v);
endif
9
Preorder-Traversierung: Iterativ & Rekursiv
• Zum Vergleich ist der iterative Algorithmus der Preorder-Traversierung
deutlich schlechter lesbar.
Algorithmus π‘π‘Ÿπ‘’π‘œπ‘Ÿπ‘‘π‘’π‘Ÿ(𝑣)
Algorithmus π‘π‘Ÿπ‘’π‘œπ‘Ÿπ‘‘π‘’π‘Ÿ(𝑣)
Input: Node 𝑣
Input: Node 𝑣
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(1)
(2)
(3)
(4)
(5)
if (v == null) then return endif;
Stack<Node> stack;
stack.push(v)
while (NOT stack.empty()) do
v = stack.pop();
print label(v);
if (v.rightChild() != null) then v = v.rightChild() endif
if (v.leftChild() != null) then v = v.leftChild() endif
end while
return list;
if (𝑣!= null) then
print label(v);
preorder(𝑣. π‘™π‘’π‘“π‘‘π‘β„Žπ‘–π‘™π‘‘());
preorder(𝑣. π‘Ÿπ‘–π‘”β„Žπ‘‘π‘β„Žπ‘–π‘™π‘‘());
endif
10
11
AVL-Bäume
• Problem: Komplexität von Such-/Einfüge-/Lösch-Operationen abhängig von
der Höhe des binären Suchbaums - maximal 𝑂(|𝑉|).
• Lösung: Balancierte Suchbäume wie AVL-Baum garantieren logarithmische
Höhe und damit Komplexität 𝑂(log |𝑉|).
• AVL-Baum: In jedem Knoten unterscheidet sich die Höhe der beiden
Teilbäume um höchstens Eins.
• Rebalancierung (Rotation) beim Einfügen und Löschen.
• Definition:
• Sei u Knoten in binärem Baum.
• bal(u) : Differenz zwischen Höhe
des rechten Teilbaums von u und
Höhe des linkes Teilbaums von u
• Ein binärer Baum heißt AVL-Baum,
falls für alle Knoten u gilt: |bal(u)| ≤ 1
10 1
6 0
15 –1
1 0 8 0 13 1 19 0
14 0
12
Rebalancierung von AVL-Bäumen
• Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe
• 4 Rotationsoperationen auf AVL-Bäumen:
1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u)
u
+2
v
v
0
+1
h
h
h+1
h+1
h+2
h+2
0
u
13
Rebalancierung von AVL-Bäumen
• Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe
• 4 Rotationsoperationen auf AVL-Bäumen:
1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u)
2. bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u)
u
v
-2
v
-1
0
u 0
h
h
h+1
h+1
h+2
h+2
14
Rebalancierung von AVL-Bäumen
• Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe
• 4 Rotationsoperationen auf AVL-Bäumen:
1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u)
2. bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u)
3. bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u)
u
0
+2
v
h
w
0
-1
u
w
v
0
h
h+1
h+1
h+2
h+2
15
Rebalancierung von AVL-Bäumen
• Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe
• 4 Rotationsoperationen auf AVL-Bäumen:
1.
2.
3.
4.
bal(u) = 2, bal(v) = 1: Einfachrotation Links(u)
bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u)
bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u)
bal(u) = -2, bal(v) = 1: Doppelrotation Links(v) + Rechts(u)
u
v
h
0
-2
0
1
w
v
w
u
0
h
h+1
h+1
h+2
h+2
16
Rebalancierung von AVL-Bäumen
• Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe
• 4 Rotationsoperationen auf AVL-Bäumen:
1.
2.
3.
4.
bal(u) = 2, bal(v) = 1: Einfachrotation Links(u)
bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u)
bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u)
bal(u) = -2, bal(v) = 1: Doppelrotation Links(v) + Rechts(u)
• Komplexität: Rotationen sind lokale Operationen, die nur Umsetzen einiger
Zeiger erfordern, und in Zeit π’ͺ(1) erfolgen.
• Aufgabe: Sei T ein leerer AVL-Baum. Fügen Sie nacheinander die Elemente
30, 20, 22, 55, 66, 44, 33
ein
17
Aufgabe zu AVL-Bäumen
Sei T folgender AVL-Baum:
30 1
22 -1
20 0
55 -1
44 -1 66 0
33 0
Fügen Sie nacheinander die Schlüssel
39, 42
in T ein und zeichnen Sie den jeweiligen AVL-Baum nach jeder insertOperation.
18
Einfügen von 39
bal(44) = -2, bal(33) = 1: Doppelrotation Links(33) + Rechts(44)
30 1
22 -1
20 0
30
55 -1
22
44 -1 66 0
55
20
44
33 0
66
39
33
30 2
22 -1
20 0
30 1
55 -2
44 -2 66 0
33 1
39 0
22 -1
20 0
55 -1
39 0
33 0
66 0
44 0
19
Einfügen von 42
bal(55) = -2, bal(39) = 1: Doppelrotation Links(39) + Rechts(55)
30 1
22 -1
20 0
30
55 -1
39 0
33 0
22
66 0
55
20 0
66 0
44
44 0
39
33
42
30 2
22 -1
20 0
30 1
55 -2
39 1
33 0
66 0
44 -1
42 0
22 -1
20 0
44 0
39 0
33 0
55 1
42 0
66 0
20
Herunterladen