Bäume 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1
Inhalt Grundbegriffe: Baum, Binärbaum Binäre Suchbäume (Definition) Typische Aufgaben Suchaufwand Löschen allgemein, Methode Schlüsseltransfer Programmiertechnik 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 2
Baum: Grundbegriffe #1 Graph: gerichtet, ungerichtet Komponenten: Knoten Elemente: Eigenschaften Kanten Beziehungen zwischen Elementen Baum: 1. Spezielfall eines Graphen 2. Verallgemeinerung der Liste Liste: 1 Element: 1 Nachfolger Baum: 1 Element: 1 Nachfolger d t-ärer Baum, Baum der Ordnung t zu jedem Element sind höchstens t Nachfolger festgelegt t=1 Spezialfall: Liste; t=2 Binärbaum; t=3 Ternärbaum,... 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 3
Baum: Grundbegriffe #2 Knotensorten Vorgänger = Vater Nachfolger = Sohn = Kind Wurzel Blatt=äußerer K. innerer Knoten Randknoten Knoten ohne Vorgänger Knoten ohne Nachfolger Knoten mit Vorgänger und Nachfolger Knoten mit < t Nachfolger Pfad Weg von der Wurzel zu jedem Knoten Pfadlänge Anzahl von Knoten im Pfad Voller Baum alle Blätter haben die gleiche Pfadlänge Quasivoller Baum nur die unterste Ebene ist nicht voll besetzt 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 4
Varianten von Bäumen Zahl der Nachfolger: fest oder beliebig Sortierung: Ungeordneter Baum: Nachfolger unsortiert Geordneter Baum: 1., 2.,...,k-ter Nachfolger; beim Binärbaum: linker, rechter Nachfolger Ebene 1 W W Ebene 2 1. 2. 3. L R Ebene 3 1. 2 3 4. 1. 2. 1. 2. L R L R Beide Beispielsbäume: Höhe h=3 Linker Teilbaum von W 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 5
Implementierung von Bäumen Einige Beispiele: als 2 Felder 1 Knoten: 2 3 v(1) v(2) v(3) Kanten: e(1,1)=0 e(1,2)=1 e(1,3)=1 e(1,1)=0 e(2,1)=0 e(1,2)=0 e(2,2)=0 e(1,3)=0 e(2,3)=0 e(3,1)=0 e(3,2)=0 e(3,3)=0 e[i][j]==1 g.d.w. e[j] Nachfolger von e[i] als Struktur (C++:Klasse) mit Zeigern... natürlich Knoten-Nr.=1 1 2 3 Knoten-Daten Knoten-Nr.=2 Knoten-Daten null null Knoten-Nr.=3 Knoten-Daten null null 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 6
Zusammenhänge Mit der Graphentheorie Ein Baum ist ein gerichteter zusammenhängender kreisfreier Graph mit einer speziellen Eigenschaft: Jeder Knoten hat bis auf einen (Wurzelknoten) genau einen Vorgänger. Mit der linearen Algebra Baum ~ Basis kreisfrei ~ linear unabhängig zusammenhängend ~ Erzeugendensystem Kantenzahl ~ Dimension eines Vektorraumes 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 7
Bäume und lineare Algebra Satz: Charakterisierung von Bäumen Es sei G = (V,E) ein endlicher Graph; V... Knotenmenge, E... Kantenmenge. Folgende Eigenschaften sind äquivalent: (1) G ist ein Baum (2) G ist kreisfrei, und das Hinzufügen einer beliebigen Kante zu E erzeugt einen Kreis (G ist maximal kreisfrei) (3) Zwischen je zwei Knoten gibt es genau einen einfachen Weg in G (4) G ist zusammenhängend, und die Wegnahme einer beliebigen Kante aus E zerstört den Zusammenhang von G (G ist minimal zusammenhängend) (5) G ist kreisfrei und seine Kantenzahl ist E = V - 1 (6) G ist zusammenhängend und E = V - 1 analoge Eigenschaften in Vektorräumen (2) Eine Basis ist eine maximal linear unabhängige Menge, d.h. bei Hinzufügen eines Vektors wird die Unabhängigkeit zerstört (4) Eine Basis ist eine minimale Erzeugendenmenge, d.h. bei Wegnahme eines Vektors hat man kein Erzeugendensystem mehr (5),(6) In Vektorräumen haben alle Basen eines (endlichdimensionalen) Vektorraumes die gleiche Größe, nämlich die Dimension des Vektorraumes 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 8
Binärbaum: Grundbegriffe linker, rechter Nachfolger linker, rechter Teilbaum (Unterbaum) eines Knotens Ebenen Höhe des Baums: Anzahl der Ebenen; im Bild: h = 3 Ebene 1 W Ebene 2 L R Ebene 3 L R L R Linker Teilbaum von W 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 9
Abbildung Datenstruktur, wobei jedes Datum = Wertepaar: Schlüssel: nach dem Schlüssel wird gesucht Wert: Zielinformation Beispiel: Telefonbuch: Namen = Schlüssel, Telefonnummer = Werte Zusammenhang mit der Mathematik: A: S W, A...partielle Abbildung, S...Schlüsselmenge, W...Wertemenge Partiell: i.d.r nur ein (geringer) Teil der Schlüssel hat einen zugeordneten Wert Sonderform Wörterbuch Abbildung, bei der das gesamte zu speichernde Datum ein Schlüssel ist 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 10
Binäre Suchbäume Besonders geeignet für Speicherung von Daten, nach denen später gesucht werden soll: Sie sind speziell auf Suchoperationen hin optimiert. Definition: Ein binärer Suchbaum ist ein binärer Baum mit folgenden Eigenschaften: (1) Jedem Knoten ist ein Schlüssel key zugeordnet (2) Sei x ein beliebiger Knoten und y ein Knoten i seinem linken Unterbaum, so gilt key(y) < key(x) (3) Sei x ein beliebiger Knoten und y ein Knoten in seinem rechten Unterbaum, so gilt key(y) > key(x) Wertepaare Schlüssel-Wert Englisch: Binary Search Tree, BST 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 11
Typische Aufgaben Typische Operationen mit den Wertepaaren Schlüssel-Wert sind Suchen Feststellen, ob ein angegebener Schlüssel im Baum enthalten ist, bzw. den zugehörigen Wert liefern. Einfügen Ein Paar Schlüssel-Wert als einen neuen Knoten an geeignete Stelle im binären Suchbaum einfügen Entfernen Einen Knoten entfernen, wobei der Baum muss auch nach dem Löschen die Eigenschaft beibehalten, binärer Suchbaum zu sein. 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 12
Annahme: alle Schlüssel haben die gleiche Wahrscheinlichkeit, dass sie gesucht werden. Dann: Der Suchaufwand ist minimal, wenn alle Knoten Pfade möglichst gleicher Länge haben (Vollbaum, quasivoller Baum) Beispiel 1: Mit einem vorhandenen (Schlüssel-) Datenbestand ist ein binärer Suchbaum ausgehend vom leeren Baum aufzubauen. Zuerst wird folgende Schlüsselreihenfolge gewählt: 57,23,37,15,30,27,79,33,45 Ergebnis: Pfadlängen-Differenz = 3 Suchaufwand #1 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 13 57 23 79 15 37 30 45 27 33
Suchaufwand #2 Beispiel 2: Eine andere Reihenfolge ergibt eine andere Suchbaum-Struktur: 33,23,45,15,27,30,37,57,79 33 23 45 15 27 37 57 Ergebnis: Pfadlängen-Differenz = 1 30 79 Die Baumstruktur ist von der Schlüsselreihenfolge abhängig. 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 14
BST programmieren:löschen Für Knoten mit 0-1 Nachfolger ist das Löschen einfach: 31 31 25 39 25 7 27 45 27 45 Bei anderen Knoten ist es schwieriger. Z.B. 33 23 15 27 23 45 30 15 27 37 57 37 30 79 Funktioniert, aber... 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 15 45 57 79
BST programmieren:löschen Bessere Lösch-Methode: Schlüsseltransfer 33 30 23 45 23 45 15 27 37 57 15 27 37 57 30 79 79 oder 33 37 23 45 23 15 27 37 57 15 27 30 79 30 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 16 45 57 79
Beispiel: Einfügen Neuer Knoten: 15 25 23 25 27 33 37 45 Programmiertechnik 57 1 2 3 Einf Ein_r(nS, nw, root) RET Einf_r dk ex? J ns<dk.s? N ns>dk.s? N RET New Kn(nS,nW,NULL,NULL) Ein_r(nS, nw, LN) Ein_r(nS, nw, RN) 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 17 N J J dk...ist dieser Knoten bereits drin? ns... neuer Schlüssel nw... neuer Wert LN... linker Nachfolger RN... rechter Nachfolger dk.s... S.v. diesem Knoten 1 2 1 2 3 1 2 1 dk = 33 dk ex? J 25 < 33? J Ein_r(..., LN) dk = 23 dk ex? J 25 < 23? N 25 > 23? J Ein_r(..., RN) dk = 27 dk ex? J 25 < 27? J Ein_r(...,LN) dk = NULL dk ex? N New Kn (ns,nw, NULL,NULL)
BST: andere Aufgaben #1 Bisher: Suchen, Einfügen, Löschen. Was gibt es noch? Durchlauf durch einen Binärbaum - In-Ordnungen LWR-Ordnung: aufgesucht wird: 1. linker Unterbaum, 2. Wurzel, 3. rechter Unterbaum RWL-Ordnung: aufgesucht wird: 1. rechter Unterbaum, 2. Wurzel, 3. linker Unterbaum - Prä-Ordnung: WLR, WRL - Post-Ordnung: LRW, RLW Aufgaben z.b.: - Bestimmen aller Blätter, der Anzahl aller Blätter, aller Knoten - Bestimmen der rechtesten Ecke im linken Unterbaum - Kopieren, Löschen des Baums 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 18
BST: andere Aufgaben #2 Fädelung Beim Durchlauf eines Baums sind stets Rückläufe notwendig. Der Durchlauf kann beschleunigt werden, indem die Leerzeiger in den Blättern mit entsprechenden Zieladressen belegt werden. Bsp: Fädelung bei LWR 15 23 27 30 33 37 45 57 79 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 19
Alternative graphische Darstellung von Bäumen 1 2 3 (1 (2 (4, 5 (9,10), 6), 3 (7, 8))) 1 2 4, 5 9, 10, 6, 3 7, 8 4 5 6 7 8 9 10 1 1 2 4 5 9 10 2 5 4 6 9 10 3 7 8 3 6 7 8 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 20
Ausgeglichenheit der Bäume Definition 1 (Classic): Binäre Baume sind vollständig ausgeglichen, wenn sich für jeden Knoten die ZAHL der Knoten in seinem linken und rechten Teilbaum um höchstens eins unterscheiden. Definition 2 (AVL-Bäume): Ein Baum ist genau dann ausgeglichen, wenn sich für jeden Knoten die HÖHE der Teibäume um höchstens eins unterscheiden 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 21
AVL-Bäume Adelson-Velski, Landis: Neudefinition der Ausgeglichenheit Länge des Suchpfades: O(log 2 n) 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 22
Einfügen in AVL-Bäume Bsp: Einfügen im linken Teilbaum 3 Fälle: h l = h r => hl > hr 1. H(lTb) = H(rTb) H(lTb) > H(rTb), Baum bleibt ausgeglichen Einfügen ausgeglichen 2. H(lTb) < H(rTb) H(lTb) = H(rTb) Baum bleibt ausgeglichen h l < h r => h l < h r ausgeglichen Einfügen 3. H(lTb) > H(rTb) die Ausgeglichenheit wird zerstört, der Baum muß neu strukturiert werden hl > hr hl >> hr Einfügen unausgeglichen 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 23
Rotation bei AVL-Bäumen Wiederherstellung der Ausgeglichenheit LR(b,a) RR(b,a) Ziel: Ebene(b)-- //höher Ebene(a)++ //tiefer Dabei: (1) Falls Vater(a) vorhanden: Vater(a) abhängen, er wird zum Vater(b) (2) Falls LSohn(b) vorhanden: Falls RSohn(b) vorhanden: LSohn(b) abhängen und RSsohn(b) abhängen und als RSohn(a) anhängen als LSohn(a) anhängen n a n+1 b DR=LR+RR 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 24
Rotationsbeispiele#1 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 25
Rotationsbeispiele#2 n+1 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 26
Rotationsbeispiele#3 4 + 7 = a 5 5 2 4 7 + 1 = a 5 2 RR 7 DR => 1 LR 4 3 na 4 2 7 DR => 1 3 5 RR LR 6 na 4 5 < LR => LR 5 4 7 + 2 = > na 7 a 5 5 4 > 2 RR 1 < 4 2 1 3 4 2 1 3 5 7 a 7 RR => 2 7 + 3 = 1 4 na a 4 + 6 = 5 2 5 LR => 7 1 3 LR 7 a 6 na 6 mit: a=ausgeglichen, na=nicht ausgeglichen 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 27
Vielweg-Bäume Anzahl Nachfolger eines Knotens: >2 4 Nachfolger Anwendung: Verwaltung großer Datenmengen Zeiger auf Knoten: Plattenadressen Abb. 29astatt Speicheradressen Zugriffszeiten: (Faktor 10 6 ) Platte: ca. 10 ms Speicher: 10 ns 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 28
Aufteilung eines Baumes in Seiten Seite = Teibaum entspricht: Abb. 30 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 29
Bayer-Bäume (B-Bäume) Eingeführt 1970 von Bayer und McCreight Eigenschaften von Bayer-Bäumen der Ordnung n: Jeder Knoten (Seite) bis auf den Wurzelknoten enthält m Einträge (Schlüssel), mit n<=m<=2*n Die Wurzel enthält 1<=m<=2*n Einträge Jeder Knoten (Seite) hat 0 oder m+1 Nachfolger, d.h. Anzahl der Nachfolger = Anzahl der Einträge + 1 Alle Blätter (Blattseiten) haben die gleiche Höhe h. 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 30
Beispiel für einen B-Baum 25 Wurzel Ordnung n=2 10 20 Seite m=2 30 40 m+1=3 2 5 7 8 10 13 14 15 18 20 22 24 25 26 27 28 30 32 35 38 40 41 42 45 Blattseiten 2n=4 n=2 n <= m <= 2n Abb.31 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 31
Suchen in einem B-Baum 1. Man lese eine Seite in den Hauptspeicher ein (falls existiert). Hat die angegebene Referenz (Zeiger) den Wert Null, dann existiert der Schlüssel S nicht. 2. Man prüfe, ob der gesuchte Schlüssel S vorhanden ist. Diese Suchzeit ist im allgemeinen kleiner als die Zeit zum Einlesen der Seite vom Hintergrundspeicher. 3. Hat die Suche keinen Erfolg, so liegen folgende Situationen vor: 3.1. K i < S < K i+1, für 0 <= i < m-1 mit K i Schlüssel an der Stelle i. Dann setzen wir die Suche auf der Seite P i fort. 3.2. K m-1 < S. Die Suche wird auf der Seite P m fortgesetzt. 3.3. S < K 1. Die Suche wird auf der Seite P 0 fortgesetzt. P 0 K P K 1 P P 1 2 2. P m-2 K m-1 m-1 D 1 D 2 D x m-1 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 32
Löschen aus dem B-Baum#1 Situation 1: Suchargument ist im Blatt: 1.1 Blatt hat mehr als n Elemente (normal): lösche Element zu löschen: 10 20 30 n=2 7 10 15 18 22 26 35 40 41 20 30 7 15 18 22 26 35 40 41 Abb. 33a 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 33
Löschen aus dem B-Baum#2 1.2 Blatt hat genau n Elemente (Unterlauf): betrachte linken (rechten) Bruder 1.2.1 linker (rechter) Bruder hat mehr als n Elemente: dann verschiebe Wurzel ins Blatt und Blatt in die Wurzel n=2 20 30 zu löschen: 22 7 15 18 22 26 35 40 41 löschen Unterlauf droht: Ein Knoten muss min. 2 Elemente haben 20 35 7 15 18 26 30 40 41 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 34 Abb. 33b
Löschen aus dem B-Baum#3 1.2.2 linker und rechter Bruder hat genau n Elemente: dann verkette n=2 20 35 zu löschen: 26 7 15 26 30 40 41 20 7 15 30 35 40 41 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 35 Abb. 33c
Löschen aus dem B-Baum#4 Situation 2: Suchargument ist nicht im Blatt: rechtes Element im linken Teilbaum hochziehen zu löschen: 30 n=2 20 30 löschen 7 15 18 22 26 35 40 41 20 26 7 15 18 22 35 40 41 dann Unterlauf, weiter wie unter 2 18 26 7 15 20 22 35 40 41 2006 Jiri Spale, Algorithmen und Datenstrukturen - Bäume 36 Abb. 33d