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

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!