Übung 7

Werbung
Übung Algorithmen I
3.6.15
Christoph Striecks
[email protected]
(Mit Folien von Julian Arz, Timo Bingmann und Sebastian Schlag.)
Roadmap
I
Hinweise zur Übungsklausur
I
(Weitere) Traversierungen von Binärbäumen
I
Die Anzahl binärer Suchbäume
I
Rot-Schwarz-Bäume
Organisation
I
Übungsklausur am Montag, dem 8.6.15, um 15.45, im Audimax
I
Freiwillig, keine Prüfungsleistung, aber zur Selbstkontrolle
I
Deckt den ersten Teil der Vorlesung und Übung (bis 27.5.15) ab
I
(Nicht vergessen: Neues Übungsblatt ab heute)
(Weitere) Traversierungen von Binärbäumen
Traversierungen von Binärbäumen
Beispiel:
n = 15 Knoten
b = 8 Blätter
c = 7 innere Knoten
h = 3 Höhe
Traversierungen von Binärbäumen
1
2
4
8
3
5
9
10
6
11
12
Beispiel:
n = 15 Knoten
b = 8 Blätter
c = 7 innere Knoten
h = 3 Höhe
7
13
(Level-order-Traversierung.)
14
15
Traversierungen von Binärbäumen
1
2
3
4
9
6
5
7
10
8
11
Beispiel:
n = 15 Knoten
b = 8 Blätter
c = 7 innere Knoten
h = 3 Höhe
13
12
(Pre-order-Traversierung.)
14
15
Traversierungen von Binärbäumen
8
4
2
1
12
6
3
5
10
7
9
(In-order-Traversierung.)
Beispiel:
n = 15 Knoten
b = 8 Blätter
c = 7 innere Knoten
h = 3 Höhe
14
11
13
15
Traversierungen von Binärbäumen
15
7
3
1
14
6
2
4
10
5
8
Beispiel:
n = 15 Knoten
b = 8 Blätter
c = 7 innere Knoten
h = 3 Höhe
13
9
(Post-order-Traversierung.)
11
12
Die Anzahl binärer Suchbäume
Binäre Suchbäume
Wiederholung
I
In der Vorlesung: Daten nur an Blättern
I
Hier in der Übung: Daten in allen Knoten
8
4
18
3
1
7
2
6
12
8 11
25
15 24
Invariante: Für alle Knoten v :
∀w ∈ left(v ) : w ≤ v und
∀w ∈ right(v ) : w > v
49
Alle binäre Suchbäume mit n = 1, 2, 3:
n = 1:
n = 2:
1
1
2
2
1
n = 3:
1
1
2
2
3
3
2
1
3
3
3
1
2
2
1
Alle binäre Suchbäume mit n = 4:
1
1
1
2
2
2
3
4
4
3
4
1
4
4
2
1
2
4
2
1
4
3
2
4
4
3
3
3
1
4
1
2
3
3
2
4
1
2
3
3
4
4
3
2
3
1
4
3
2
1
1
3
1
2
2
1
Die Anzahl binärer Suchbäume Cn
x
<x
>x
Bekannte Startwerte: C0 = 0, C1 = 1, C2 = 2, C3 = 5, C4 = 14.
Durch Partitionieren der sortieren Folge:
Cn = C0 Cn−1 + C1 Cn−2 + · · · + Cn−2 C1 + Cn−1 C0 ,
Wende erzeugende Funktionen an:
C (z) =
∞
X
n=0
n
Cz z = C (z) · zC (z) + 1 .
n > 0.
Cn heißen die Catalan-Zahlen.
=⇒
1
2n
Cn =
.
n+1 n
Balancierte binäre Suchbäume: Rot-Schwarz-Bäume
Binäre Suchbäume
Wiederholung
8
4
18
3
1
7
2
6
12
8 11
25
15 24
Invariante: Für alle Knoten v :
∀w ∈ left(v ) : w ≤ v und
∀w ∈ right(v ) : w > v
49
I
Problem von binären Suchbäumen: können unbalanciert sein
I
Lösung der Vorlesung: (a, b)-Bäume
I
Weitere Lösung hier in der Übung: Rot-Schwarz-Bäume
Warum balancierte Bäume?
1
2
3
4
5
Warum balancierte Bäume?
1
2
3
I
Höhe: h ∈ O(n)
I
Suchen: O(n) im Worst Case
I
Löschen: O(n) im Worst Case
I
Einfügen: O(n) im Worst Case
I
Geht das besser?
4
Ja, Rot-Schwarz-Bäume garantieren Höhe
von O(log n).
5
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume sind binäre Suchbäume mit folgenden Eigenschaften:
I
Jeder Knoten ist entweder rot oder schwarz. (1 Bit mehr an
Information pro Knoten.)
I
Die Wurzel ist schwarz.
I
Jedes Blatt ist schwarz und enthält keine Werte. (Nur innere
Knoten enthalten Werte.)
I
Ist ein Knoten rot, so sind beide Kinder schwarz.
I
Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Anzahl schwarzer Knoten.
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume sind binäre Suchbäume mit folgenden Eigenschaften:
I
I
I
I
I
Jeder Knoten ist entweder rot oder schwarz. (1 Bit mehr an Information pro Knoten.)
Die Wurzel ist schwarz.
Jedes Blatt ist schwarz und enthält “keine Werte”. (Nur innere Knoten enthalten Werte.)
Ist ein Knoten rot, so sind beide Kinder schwarz.
Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Anzahl schwarzer
Knoten.
33
15
47
10
5
20
18
38
36
51
39
49
Höhe von Rot-Schwarz-Bäumen
Satz: Ein Rot-Schwarz-Baum mit n inneren Knoten hat die Höhe
h ≤ 2 log2 (n + 1).
Beweis.
I
Betrachte Teilbaum tx an einem Knoten x
I
Sei sh(x) die Anzahl der schwarzen Knoten auf dem Pfad von x zu
einem Blatt ohne x selbst (Schwarzhöhe)
I
Lemma: tx hat mindestens 2sh(x) − 1 innere Knoten.
I
Beweis. Induktion über Höhe h von tx
I
IA: h = 0 =⇒ sh(x) = 0 und 20 − 1 = 0
I
IS: Aussage gilt für Kinder x1 , x2 von x mit h(x) > 0
I
Wir bemerken: sh(xi ) ≥ sh(x) − 1 =⇒ txi hat mind. 2sh(x)−1 − 1
innere Knoten
I
Also hat tx mindestens 2(2sh(x)−1 − 1) + 1 = 2sh(x) − 1 innere
Knoten
√
Höhe von Rot-Schwarz-Bäumen
Satz: Ein Rot-Schwarz-Baum mit n inneren Knoten hat die Höhe
h ≤ 2 log2 (n + 1).
I
Weiter im Beweis . . .
I
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
Lemma. tx hat mindestens 2sh(x) − 1 innere Knoten.
I
Nach Eigenschaft 4 eines Rot-Schwarz-Baumes sind auf allen Pfaden
unterhalb der Wurzel mindestens die Hälfte der Knoten schwarz
I
Einsetzen in vorheriges Ergebnis ergibt n ≥ 2h/2 − 1 und damit
h ≤ 2 log2 (n + 1)
Höhe von Rot-Schwarz-Bäumen
Anders ausgedrückt: Die Höhe eines Rot-Schwarz-Baums ist
logarithmisch in der Anzahl der inneren Knoten, also h ≤ 2 log2 (n + 1).
I
Suchen offensichtlich in O(log n) möglich.
I
Einfügen, Löschen auch in O(log n), wenn Aufwand nur von der
Höhe des Baums abhängt.
Einfügen in Rot-Schwarz-Bäumen
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Einfügen:
I
Einfügen wie in “normalen” binären Suchbäumen
I
Einfügen kann Rot-Schwarz-Eigenschaften verletzen.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Herstellen der Eigenschaften durch zwei grundlegende Operationen:
1. Umfärbung von Knoten
2. Rotation von Teilbäumen
Was ist eine Rotation?
I
Lokale Operation, die die binäre Suchbaumeigenschaft erhält
I
“Umhängen” einer konstanten Zahl an Pointern pro Teilbaum
Linksrotation
a
b
Rechtsrotation
a
b
≤a
∈ (a, b]
>b
>b
≤a
∈ (a, b]
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Die Wurzel ist schwarz.
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Kein Vorgänger −→ Neuer Knoten ist Wurzel
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Die Wurzel ist schwarz.
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Kein Vorgänger −→ Neuer Knoten ist Wurzel −→ Umfärben
N
Umfärben
N
√
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Ist ein Knoten rot, so sind beide Kinder schwarz.
4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Schwarzer Vorgänger
oder
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Ist ein Knoten rot, so sind beide Kinder schwarz.
4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
√
I Schwarzer Vorgänger −→ Nichts zu tun
I
oder
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Ist ein Knoten rot, so sind beide Kinder schwarz.
4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Roter Vorgänger
oder
N
oder
N
oder
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Ist ein Knoten rot, so sind beide Kinder schwarz.
4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Roter Vorgänger −→ 4 mögliche Strukturen, aber: durch Spiegelung
und max. eine Rotation identisch
N
N
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
3. Ist ein Knoten rot, so sind beide Kinder schwarz.
4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
I
Vorgehen: Roten Knoten in binären Suchbaum einfügen und
danach Eigenschaften wieder herstellen
I
Roter Vorgänger −→ 4 mögliche Strukturen, aber: durch Spiegelung
und max. eine Rotation identisch
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Umfärben
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Umfärben
Rotieren
N
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Umfärben
N
N
Einfügen in Rot-Schwarz-Bäume
Zur Erinnerung:
4. Ist ein Knoten rot, so sind beide Kinder schwarz.
5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die
gleiche Zahl schwarzer Knoten.
Umfärben
N
N
Rekursion
N
Rot-Schwarz-Bäume
Aufwandsabschätzung
Speicher:
I
1 Bit pro Knoten für die Farbe
I
Parent-Pointer ist nötig
Zeit:
I
Konstanter Aufwand pro Knoten (Färben und Rotieren)
I
Maximal O(log n) Rekursionstiefe
Ziel erreicht: O(n) Platz und alle Operationen in O(log n).
Datenstrukturen in der Wirklichkeit
Datenstrukturen in der Wirklichkeit
Java Collections
C++ STL
java.util.LinkedList<T>
java.util.ArrayList<T>
java.util.ArrayDeque<T>
java.util.PriorityQueue<T,C>
java.util.TreeMap<K,V>
java.util.TreeSet<K>
java.util.HashTable<K,V>
java.util.HashMap<K,V>
java.util.HashSet<K>
std::list<T>
std::vector<T>
std::deque<T>
std::priority_queue<T,C>
std::map<K,V>
std::set<K>
std::unordered_map<K,V>
std::unordered_set<K>
Notizen zu (a, b)-Bäumen
B-Bäume sind fast ( m2 , m)-Bäume
mit m = B ein Festplatten-Block.
Microsekunden pro Insert
Insert-Geschwindigkeit (Integer, C++)
Red-Black Tree
verkettete Hashtabelle
(2, 4)-Baum
(16, 32)-Baum
(32, 64)-Baum
(64, 128)-Baum
1.5
1
0.5
0
26
28
210
212 214 216 218 220
Anzahl von Elementen
222
224
226
Locate-Geschwindigkeit (Integer, C++)
Microsekunden pro Locate
1.5
Red-Black Tree
verkettete Hashtabelle
(2, 4)-Baum
(16, 32)-Baum
(32, 64)-Baum
(64, 128)-Baum
1
0.5
0
26
28
210
212 214 216 218 220
Anzahl von Elementen
222
224
226
Herunterladen