Algorithmen und Datenstrukturen, FS17 Uebersicht 2017-04-05

Werbung
Departement Mathematik und Informatik
Algorithmen und Datenstrukturen, FS17
Prof Dr Christian Tschudin
5. April 2017
Suchbäume I
Andrew D. Booth
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 2 / 30
Uebersicht 2017-04-05
Binary MaxHeap-Technik für Sortieren eingeführt: einmaliges
Einfüllen, Bauminhalt selbst ist nur teilweise geordnet.
Neues Ziel:
– vollständig geordnete Bäume für schnelle Suche
– Elemente mit O(log n) zur Laufzeit einfügen, entfernen, etc
– aber ohne die Sortierung zu verlieren.
I
I
I
I
I
Binäre Suchbäume (1960)
ALV-Baum (1962)
Mehrweg-Suchbaum, insb. (2,4)-Baum
Rot-Schwarz-Baum (1972)
B-Baum (1971)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 3 / 30
Wiederholung
I
Was ist der “springende Punkt” von Quicksort?
I
Wie kann man in linearer Zeit sortieren?
– welcher Trick verwendet von Radix-Sort?
– was ist ein Nachteil (z.B. gegenüber
Merge-/Quicksort)?
I
War Heapsort wirklich so schlecht?
zwar keine Rekursion und in-place,
aber schlechte Datenlokalität
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 4 / 30
Vorwegnahme Resultat Suchbäume
“ordered operations” =
suchen, einfügen, Minimum finden, Maximum finden, grösstesElement-kleiner-als-X, kleinstes-Element-grösser-als-X, AnzahlElemente-kleiner-als-X, Zugriff-via-Position, Minimum löschen,
Maximum löschen, löschen, Anzahl-Element-zwischen-X-und-Y.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 5 / 30
Symboltabellen-ADT (key-val store)
Geordnete Suchbäume eigenen sich zur Implementierung von
sog. Symboltabellen, d.h. Schlüsselwert ist ein Symbol.
In Datenbank-Terminologie auch “key-value store”:
1
2
3
4
5
6
7
8
9
10
public class KeyValueStore<Key, Value> {
void
put(Key key, Value val);
Value
get(Key key);
void
delete(Key key);
boolean contains(Key key);
boolean isEmpty();
Key
min();
Key
max();
...
}
Wird auch “assoziatives Feld” genannt: Statt Integer- Index
kann beliebiger Schlüssel verwendet werden, z.B.
a["str"] = "Spiegelgasse";
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 6 / 30
Symboltabelle mit verkett. Liste oder Feld
Schon gesehen:
I
(Doppelt) verkettete Liste
– “Suche” ist O(n)
– “Einfügen” und “Löschen” ebenfalls
I
Verwende zwei Felder (je eines für Schlüssel und
Werte):
– Feld für die Schlüssel wird sortiert gehalten
– “Suche” in O(log n)
– “Einfügen” und “Löschen” weiterhin O(n)
Kann mit Bäumen mehr herausgeholt werden?
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 7 / 30
Definition “Binärer Suchbaum” (BST)
Binärer Suchbaum =
Binärer Baum, bei dem für
jeden internen Knoten K
gilt: alle Schlüssel in
seinem linken Teilbaum
sind kleiner als der
Schlüssel von K , alle
Schlüssel im rechten
Teilbaum grösser als der
Schlüssel von K .
BST = binary search tree
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 8 / 30
Binäre Suche im Baum
1
2
3
4
5
6
7
8
9
10
11
Node findPosition(Node pos, Key key)
{
if (BST.isLeaf(pos))
return pos; // (Kandidat) gefunden
Key curKey = BST.key(pos);
if (key < curKey)
return BST.findPosition(BST.left(pos));
if (key > curKey)
return BST.findPosition(BST.right(pos));
return pos;
// (Kandidat) gefunden
}
Bemerkung: Liefert “Kandidaten”-Knoten – Aufrufer muss
prüfen, ob der angefragte Schlüssel auch wirklich passt.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 9 / 30
Einfügen im binären Suchbaum (1/2)
Zwei Phasen:
I
Phase 1: Suche
ob Knoten vorhanden mittels findPosition()
w sei die zurückgegebene Position.
I
Phase 2: Einfügen
I
I
Falls w ein Blatt ist, kann dort direkt eingefügt werden
(expandExternal())
Sonst existiert schon ein Knoten. Falls anderer
Schlüssel: Aufruf von findPosition() auf rechtem
Kind und rekursives Anwenden von Phase 2.
Algorithmen und Datenstrukturen, FS17
Einfügen im binären Suchbaum (2/2)
5. April 2017 — 10 / 30
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 11 / 30
Löschen im BST (1/3): 3 Fälle
Baustein als Vorbereitung:
deleteMin() rekurs. Prozedur, gibt neuen Unterbaum zurück.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 12 / 30
Löschen im BST (1/2): Hibbards Ansatz
Ansatz (Hibbard): Ersetze Knoten durch seinen “Nachfolger”
1. Sei t Variable mit Zeiger auf zu löschenden Knoten
2. Sei x Variable mit Zeiger auf Nachfolger min(t.right)
3. Setze rechtes Kind von x auf deleteMin(t.right)
(dies entfernt x aus dem Baum)
Die Kinder im rechten Unterbaum sind (weiterin) alle
grösser als x.key
4. Setze linkes Kind von x auf t.left
In diesem Unterbaum sind alle Schlüssel kleiner als x.key
und dessen Nachfolger.
Schliesslich: x ersetzt t (im Elternknoten von t).
Auch mit Vorgänger möglich, am besten zufällig wählen.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 13 / 30
Löschen im BST (2/2): “Nachfolger vor!”
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 14 / 30
“Ordered Operations” im BST
Diskussion:
I
Die Kosten aller Operationen im binären Suchbaum
sind proportional zur Tiefe des Baums.
I
Im Idealfall ist der Baum balanciert
– führt zu O(log n)
I
”Bösartiges” Einfügen und Löschen kann aber dazu
führen, dass der binäre Suchbaum degeneriert
→ “linked List”
I
Deshalb gilt O(n) für BST
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 15 / 30
Andrew Donald Booth (1918 – 2009)
I
Engländer. Verlässt Uni Cambridge ohne Abschluss, dann
“externer Abschluss” Universität London, Promotion Uni
Birmingham in Röntgenkristallographie.
I
Baut dort wegen vielen Rechnungen den ersten Computer von
Grossbritanien.
I
Stipendium für Princeton, USA
– Besuch der Gruppe von John von Neumann
– zurück in England: erster Magnettrommelspeicher (1948)
I
Booth-Multiplizieralgorithmus:
– effiziente Integermultiplikation mit log. Gatter (1951)
I
Arbeiten in Uebersetzung (natürlicher) Sprachen (1955)
I
Erfindet mit Windley, Colin und Hibbard die BST (1960)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 16 / 30
AVL-Suchbaum (1/8)
AVL-Suchbaum
= binärer Suchbaum, der weitgehend ausgeglichen ist.
D.h. für jeden internen Knoten sind die Höhen der Teilbäume
seiner Kinder höchstens um 1 verschieden.
(AVL = Adel‘son-Vel‘skii & Landis, 1962).
I
Verhindern eines degenerierten Baumes durch
sofortiges Korrigieren bei Ungleichgewicht
– bei Einfügen
– bei Löschen
I
Ausgleich muss mit konstantem Aufwand erfolgen
I
(Alternativ: amortisierter Aufwand)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 17 / 30
AVL-Suchbaum (2/8): Beispiel
Beispiel ausgeglichener Baum (Höhen sind rot eingezeichnet)
Betrachte nun Einfügen von Schlüssel 54 . . .
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 18 / 30
AVL-Suchbaum (3/8): Einfügen
I
I
Neues Element führt zuerst zu unbalanciertem Baum
(Knoten 78 und 44 sind nicht ausgeglichen)
Durch “Beförderung” von Knoten 62 (und “Degradierung” von 78) wird Baum wieder ausgeglichen.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 19 / 30
AVL-Suchbaum (4/8): Wie ausgleichen?
Es sei x der erste Knoten auf dem Weg zur Wurzel dessen
Grosselternknoten z nicht ausgeglichen ist. Knoten y sei der
dazwischenliegende Elternknoten von x bzw. Kindknoten von
z. Der Teilbaum, der an y hängt, ist zu “schwer”.
Vier mögliche Konfigurationen:
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 20 / 30
AVL-Suchbaum (5/8): Ausgleich-Algo
I
Sei a, b und c eine Inorder-Nummerierung
der Knoten x, y und z.
I
Sei T0 , T1 , T2 , T3 eine Inorder-Nummerierung
der 4 Teilbäume, die an x, y und z hängen,
aber nicht an diesen Knoten verwurzelt sind.
I
Ersetze den Teilbaum mit Wurzel z
durch einen neuen Teilbaum mit Wurzel b.
I
Knoten a wird linkes Kind,
Knoten c wird rechtes Kind von b.
I
T0 , T1 sind die Teilbäume von a,
T2 , T3 diejenigen von c.
Wir schauen im Folgenden nur zwei der vier Fälle an.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 21 / 30
AVL-Suchbaum (6/8): “Rechte Kette”
Zur Erinnerung: z ist nicht ausgeglichen und der Teilbaum x “ist
zu schwer”. Wie die Höhe verkleinern?
Ansatz: Hänge die drei Knoten z, y, x neu an y auf statt z.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 22 / 30
AVL-Suchbaum (7/8): “Rechter Winkel”
Ansatz:
– zuerst b befördern, d.h. c degradieren
– entstandene Kette in der Mitte statt links anhängen
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 23 / 30
AVL-Suchbaum (8/8): Komplexität, WBT
I
I
I
Einsetzen und Löschen ist nun O(n log n)
Baum kann aber “einseitig” sein
(Geschwisterknoten mit sehr unterschiedlicher
Knotenzahl)
Rot-Scharz-Bäume (siehe später) haben das gleiche
Problem
– → weight-balanced binary trees (WBT)
– WBT von grosser Bedeutung für funktionale
– Sprachen (Haskell, Scheme)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 24 / 30
Mehrweg-Suchbaum (1/6): “multiway”
Geordnete Bäume (i.a. nicht binär)
Eigenschaften von d-Bäumen:
I
Jeder interne Knoten hat mindestens 2 Kinder
I
Jeder interne d-Knoten speichert eine Folge von d − 1
Einträgen < Si , Ei >, wobei S1 ≤ S2 ≤ . . . ≤ Sd−1 .
Es seien ferner S0 = −∞ und Sd = +∞ zwei implizite
Schlüssel.
I
Seien v1 , v2 , . . . , vd die Kinder eines d-Knotens v .
Für alle Einträge < S, E >, die in den Teilbäumen mit
Wurzel vi liegen, gilt: Si−1 ≤ S ≤ Si , i = 1, . . . , d.
Ein BST ist ein 2-Baum (ein Schlüssel und zwei Kinder)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 25 / 30
Mehrweg-Suchbaum (2/6): Beispiel
Beispiel eines 2-3 Baumes (enthält sowohl 2-Knoten
also auch 3-Knoten)
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 26 / 30
Mehrweg-Suchbaum (3/6): (2-4)-Baum
Spezieller Mehrweg-Suchbaum: (2-4) Baum
I
Jeder Knoten hat mind. 2 und höchstens 4 Kinder.
I
Alle Blätter haben dieselbe Tiefe.
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 27 / 30
(2-4)-Suchbaum (4/6): Einfüg-Algo
Normalfall:
– Einfügen in bestehenden Knoten
– Baumtiefe bleibt unverändert
Ueberlauf:
Es sei S1 , S2 , S3 und S4 die fiktive Einordnung des neuen
Schlüssels mit den 3 schon vorhandenen Schlüsseln von
Knoten v .
I Knoten v durch 2 Knoten v1 und v2 ersetzen.
I v1 erhält S1 und S2 ; v2 erhält S4 .
I S3 nach “oben” geben:
– Falls v die Wurzel ist, neuen Knoten erzeugen,
– sonst S3 am Elternknoten einordnen.
Algorithmen und Datenstrukturen, FS17
(2-4)-Suchbaum (5/6): Bsp Einfügen
5. April 2017 — 28 / 30
Algorithmen und Datenstrukturen, FS17
5. April 2017 — 29 / 30
(2-4)-Suchbaum (6/6): Bsp Einfügen
Algorithmen und Datenstrukturen, FS17
Rot-Schwarz-Baum
→ nächste Lektion
5. April 2017 — 30 / 30
Herunterladen