Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Was bisher geschah<br />
rekursive <strong>Datenstrukturen</strong>:<br />
◮ lineare <strong>Datenstrukturen</strong>: Liste, Stack, Queue<br />
◮ hierarchische <strong>Datenstrukturen</strong>: Bäume<br />
◮ allgemeine Bäume<br />
◮ Binäre Bäume<br />
◮ Unäre Bäume = Listen<br />
Tiefe eines Knotens in t: Abstand (Kantenzahl) zur Wurzel<br />
Tiefe tiefe(t) des Baumes t: maximale Knotentiefe in t<br />
Größe size(t) des Baumes t: Anzahl aller Knoten in t<br />
◮ Binäre Suchbäume: Binäre Bäume mit aufsteigend<br />
sortierter Inorder-Folge aller Schlüssel<br />
(Schlüsselwerte aus einer total geordneten Menge)<br />
Laufzeit für Suche, Einfügen, Löschen: O(tiefe(t))<br />
◮ AVL-Bäume (eingeschränkte Balanceeigenschaft):<br />
Binäre Bäume mit aufsteigend sortierter Inorder-Folge aller<br />
Schlüssel<br />
(Schlüsselwerte aus einer total geordneten Menge)<br />
Laufzeit für Suche, Einfügen, Löschen: O(log n)<br />
153
Mehrweg-Suchbäume<br />
Suchbäume mit inneren Knoten verschiedener Knotengrade.<br />
◮ Knoten können mehrere Schlüssel enthalten<br />
◮ Knoten mit n ≥ 2 Schlüsseln (k 1 , . . . , k n ) hat n + 1 Kinder<br />
(t 0 , . . . , t n ).<br />
◮ Suchbaumeigenschaft (für Mehrweg-Bäume): Jeder<br />
Schlüssel ist Separator zwischen Schlüsseln in den<br />
Kindern, d.h. für jeden Knoten u = Node(n, k, t) im Baum t<br />
gilt:<br />
◮ Für alle im Teilbaum t0 vorkommenden Schlüssel v gilt<br />
v < k 1 .<br />
◮ Für alle i ∈ {1, . . . , n − 1} gilt:<br />
für alle im Teilbaum t i vorkommenden Schlüssel v gilt<br />
k i < v < k i+1 .<br />
◮ Für alle im Teilbaum tn vorkommenden Schlüssel v gilt<br />
k n < v.<br />
154
Datenstruktur Mehrweg-Suchbaum<br />
rekursive Datenstruktur Mehrweg-Suchbaum (MST):<br />
◮ leerer Mehrweg-Suchbaum ⊥ (Blatt),<br />
◮ innerer Knoten: Node (n, k, t) mit<br />
◮ Anzahl n ≥ 2 der Schlüssel<br />
◮ Folge (k1 , . . . , k n ) der Schlüssel<br />
◮ Folge (t 0 , . . . , t n ) der Kinder (MST)<br />
155
Inorder-Durchquerung von Mehrweg-Suchbäumen<br />
inorder(t) für MST t:<br />
◮ falls t = ⊥: inorder(⊥) ← []<br />
◮ falls t = Node(n, k, t):<br />
◮ l ← inorder(t 0 )<br />
◮ für alle i ← 1, . . . , n:<br />
l ← l ◦ [k i ] ◦ inorder(t i )<br />
◮ Ausgabe inorder(Node(n, k, t)) = l<br />
In jedem Mehrweg-Suchbaum bilden die Schlüssel in<br />
inorder-Reihenfolge eine aufsteigend sortierte Folge.<br />
156
Suche in Mehrweg-Suchbäumen<br />
contains(t, e) für MST t <strong>und</strong> Wert e:<br />
◮ falls t = ⊥: contains(t, e) ← f<br />
◮ falls t = Node(n, k, t):<br />
finde Schlüssel oder Teilbaum-Index m:<br />
◮ m ← 0<br />
◮ solange km ≤ e: m ← m + 1<br />
◮ falls km = e: Ende mit contains(t, e) = t<br />
sonst contains(t m , e) (rekursiv)<br />
Laufzeit: O(tiefe(t))<br />
157
Beispiel B-Bäume<br />
zur Verwaltung großer Datenmengen<br />
Anwendungen bei Datenbanken<br />
Mehrweg-Suchbäume mit<br />
◮ Kinderzahl jedes Knotens zwischen m <strong>und</strong> 2m<br />
(für zuvor festgelegtes m)<br />
Ausnahme: Wurzel (darf weniger Kinder haben)<br />
◮ Alle Blätter haben denselben Abstand zur Wurzel.<br />
praktisch meist:<br />
◮ Knotengrad m sehr groß<br />
◮ Tiefe des Baumes sehr klein<br />
Optimierung:<br />
binäre Suche zum Finden der Schlüssel oder Teilbaum-Indizes<br />
m innerhalb eines Knotens<br />
158
Spezialfall (2,4)-Bäume<br />
(2,4)-Baum:<br />
Mehrweg-Suchbaum mit Knoten mit 2, 3 oder 4 Kindern<br />
(B-Baum für m = 2)<br />
rekursive Datenstruktur ST24〈Element〉 =<br />
◮ ⊥<br />
◮ Node2 (ST24〈Element〉, Element, ST24〈Element〉)<br />
◮ Node3 (ST24〈Element〉, Element ST24〈Element〉,<br />
Element, ST24〈Element〉)<br />
◮ Node4 (ST24〈Element〉, Element ST24〈Element〉,<br />
Element, ST24〈Element〉, Element, ST24〈Element〉)<br />
159
Einfügen in (2,4)-Bäume<br />
Suche der Einfüge-Position (Blatt)<br />
Fälle:<br />
1. Einfügen in einen Knoten mit 2 oder 3 Kindern<br />
(2,4)-Baum-Eigenschaft nach Einfügen nicht verletzt<br />
2. Einfügen in einen Knoten mit 4 Kindern<br />
(2,4)-Baum-Eigenschaft nach Einfügen evtl. verletzt,<br />
Verschiebung von Schlüsseln oder Teilung von Knoten<br />
notwendig<br />
3. Einfügen als neuen Schlüssel im erreichten Knoten<br />
Idee: Beim Suchen der Einfüge-Position (Richtung: Wurzel →<br />
Blatt) vorsorglich alle 4-Knoten auf dem Pfad teilen.<br />
Einfügen des Elementes ist dann ohne zusätzliche Korrektur<br />
möglich.<br />
160
Teilung von 4-Knoten<br />
4-Knoten: Node4(t 0 , x, t 1 , y, t 2 , z, t 3 )<br />
◮ in der Wurzel:<br />
Node4(t 0 , x, t 1 , y, t 2 , z, t 3 ) ↦→<br />
Node2(Node2(t 0 , x, t 1 ), y, Node2(t 2 , z, t 3 ))<br />
◮ als Kind eines 2-Knotens:<br />
Node2(Node4(t 0 , x, t 1 , y, t 2 , z, t 3 ), v, t 4 ) ↦→<br />
Node3(Node2(t 0 , x, t 1 ), y, Node2(t 2 , z, t 3 ), v, t 4 )<br />
◮ als Kind eines 3-Knotens:<br />
Node3(Node4(t 0 , x, t 1 , y, t 2 , z, t 3 ), v, t 4 , w, t 5 ) ↦→<br />
Node4(Node2(t 0 , x, t 1 ), y, Node2(t 2 , z, t 3 ), v, t 4 , w, t 5 )<br />
161
Löschen aus (2,4)-Bäumen<br />
Löschen aus inneren Knoten:<br />
Ersetzen durch Inorder-Nachfolger (ggf. rekursiv))<br />
Löschen aus Blättern:<br />
◮ Zu löschender Knoten ist Kind eines Knotens mit 3 oder 4<br />
Kindern<br />
(2,4)-Baum-Eigenschaft nach Löschen nicht verletzt<br />
◮ Zu löschender Knoten ist Kind eines Knotens mit 2 Kindern<br />
(2,4)-Baum-Eigenschaft nach Löschen verletzt,<br />
Zusammenfügen notwendig<br />
Idee: Beim Suchen der Löschposition (Richtung: Wurzel →<br />
Blatt) vorsorglich geeignete Schlüsselverschiebungen (von<br />
Nachbarknoten) <strong>und</strong> Verschmelzungen.<br />
162
Rot-Schwarz-Bäume<br />
Idee: Darstellung von (2, 4)-Bäumen als binäre Bäume<br />
Darstellung aller Schlüssel eines Knotens als Binärbaum (rote<br />
Kanten)<br />
Eigenschaften:<br />
◮ nie zwei rote Kanten nacheinander<br />
◮ Schwarz-Tiefe: log n<br />
◮ Tiefe: ≤ 2 log n<br />
◮ Suche wie in binären Bäumen<br />
◮ Einfügen <strong>und</strong> Löschen von 2-4-Bäumen „übersetzt“<br />
◮ evtl. Rotationen (roter Kanten) notwendig<br />
Node(x, Node(y, t 1 , t 2 ), t 3 ) ↦→ Node(y, t 1 , Node(x, t 2 , t 3 ))<br />
163