18.11.2013 Aufrufe

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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 />

Höhe eines Knotens in t: Abstand (Kantenzahl) zur Wurzel<br />

Höhe hoehe(t) des Baumes t: maximale Knotenhöhe in t<br />

Größe size(t) des Baumes t: Anzahl aller Knoten in t<br />

◮ Binäre Suchbäume:<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(hoehe(t))<br />

122


Balancierte binäre Suchbäume<br />

Laufzeit für Suche, Einfügen, Löschen in Baum t mit n Knoten:<br />

O(hoehe(t))<br />

Ziel: Laufzeit für Suche, Einfügen, Löschen O(log(n))<br />

Idee: balancierte Suchbäume, in denen die Höhe jedes Blattes<br />

(etwa) gleich ist<br />

123


Vollständig balancierte Bäume<br />

Binärer Suchbaum t heißt vollständig balanciert, wenn in jedem<br />

Knoten Node(x, l, r) in t gilt:<br />

|size(l) − size(r)| ≤ 1<br />

Tiefe jedes Knotens ≤ ⌊log(n)⌋ + 1<br />

Beispiel (Tafel)<br />

124


Operationen in vollständig balancierten Bäumen<br />

◮ Suche O(log(n))<br />

◮ Einfügen <strong>und</strong> Löschen:<br />

zunächst Einfüge- <strong>und</strong> Löschoperation für binäre<br />

Suchbäume<br />

danach muss vollständige Balance wieder hergestellt<br />

werden (Rebalacieren)<br />

i.A. aufwendig<br />

125


AVL-Bäume<br />

(Adelson-Velskii, Landis, 1962)<br />

Binärer Suchbaum t heißt AVL-Baum, wenn in jedem Knoten<br />

Node(x, l, r) in t gilt:<br />

|hoehe(l) − hoehe(r)| ≤ 1<br />

(AVL-Eigenschaft)<br />

Optimierung: Speichern der Balance hoehe(l) − hoehe(r) in<br />

jedem Knoten erlaubt schnellen Test<br />

◮ Suche O(log(n))<br />

◮ Einfügen <strong>und</strong> Löschen:<br />

zunächst Einfügeoperationen für binäre Suchbäume<br />

danach Wiederherstellung der AVL-Eigenschaft<br />

126


Rebalacieren in AVL-Bäumen<br />

nach Einfügen (als neues Blatt) oder<br />

Löschen (Ersetzen durch einziges Kind oder Minimum im<br />

rechten Teilbaum)<br />

Verletzung der AVL-Eigenschaft im Knoten (x, l, r) mit<br />

|hoehe(l) − hoehe(r)| = 2<br />

evtl. Verletzung in mehreren Vorgängern des eingefügten<br />

Knotens<br />

Fälle:<br />

◮ hoehe(l) = hoehe(r)<br />

nach Einfügen keine Verletzung der AVL-Eigenschaft<br />

◮ hoehe(l) = hoehe(r) + 1<br />

◮ nach Einfügen in l keine Verletzung der AVL-Eigenschaft<br />

◮ nach Einfügen in r evtl. Verletzung der AVL-Eigenschaft<br />

◮ hoehe(l) + 1 = hoehe(r)<br />

◮ nach Einfügen in r keine Verletzung der AVL-Eigenschaft<br />

◮ nach Einfügen in l evtl. Verletzung der AVL-Eigenschaft<br />

127


(Einfache) Rotation in AVL-Bäumen<br />

bei Verletzungen der AVL-Eigenschaft im tiefsten Knoten k der<br />

Form<br />

k = Node(x, Node(y, l, r), s)<br />

mit hoehe(l) − 1 = hoehe(r) = hoehe(s)<br />

(Markierung von x: −2, Markierung von y: −)<br />

Ersetzung durch lrotate(k) = Node(y, l, Node(x, r, s))<br />

(Linksrotation)<br />

analog:<br />

Verletzungen der AVL-Eigenschaft im tiefsten Knoten k der<br />

Form<br />

k = Node(x, l, Node(y, r, s))<br />

mit hoehe(l) = hoehe(r) = hoehe(s) − 1<br />

(Markierung von x: +2, Markierung von y: +)<br />

Ersetzung durch rrotate(k) = Node(y, Node(x, l, r), s)<br />

(Rechtsrotation)<br />

128


Doppel-Rotation in AVL-Bäumen<br />

bei Verletzungen der AVL-Eigenschaft im tiefsten Knoten der<br />

Form<br />

Node(x, Node(y, l, Node(z, r, s)), t) mit (Markierungen x: −2, y:<br />

+)<br />

Ersetzung durch<br />

lrrotate(k) = Node(z, Node(y, l, r), Node(x, s, t))<br />

Links-Rechts-Rotation:<br />

zwei aufeinanderfolgende Rotationen: (y, z), danach (x, z)<br />

symmetrischer Fall:<br />

Node(x, t, Node(y, Node(z, l, r), s)) mit (Markierungen x: +2, y:<br />

−)<br />

Ersetzung durch<br />

rlrotate(k) = Node(z, Node(x, t, l), Node(y, r, s))<br />

Rechts-Links-Rotation: (y, z), danach (x, z)<br />

129


Laufzeit der Operationen in AVL-Bäumen<br />

Rebalancieren (Rotationen): O(1)<br />

Tiefe von AVL-Bäumen mit n Knoten: O(log(n))<br />

◮ Suche: O(log(n))<br />

◮ Einfügen: O(log(n))<br />

◮ Löschen: O(log(n))<br />

130

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!