Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
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