28.12.2013 Aufrufe

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!