Durchlaufen eines Binärbaumes

Slides:



Advertisements
Ähnliche Präsentationen
8. Termin Teil B: Wiederholung Begriffe Baum
Advertisements

Randomisierte Algorithmen Präfix Suche und Konsistentes Hashing
Vorbereitung: struct knoten { int x; struct knoten *l, *r; } *b, *bh, **bp; b: Zeiger auf Wurzel bh: Hilfszeiger bp: Zeiger auf Zeiger auf knoten b bp.
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Mindesthöhe: |_log2 n_|, maximale Höhe: n-1
Claudio Moraga; Gisbert Dittrich
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (22 – B-Bäume)
Kapitel 6: Klassifizierung von Sortiertechniken
7. Natürliche Binärbäume
Gewichtsbalancierte Suchbäume
Kapitel 6. Suchverfahren
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Balancierte Bäume Effizienz der Wörterbuchoperationen auf Bäumen hängt direkt von der Baumhöhe ab. Baum mit n Knoten: Mindesthöhe: |_log2 n_|, maximale.
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Digitales Suchen / Digitale Suchbäume
5. Sortier-Algorithmen Vorbemerkungen:
Synonyme: Stapel, Keller, LIFO-Liste usw.
Sortieren mit Binären Bäumen
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 - Bäume: Durchlaufreihenfolgen, Analyse nat. Bäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Minimum Spanning Tree: MST
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Kapitel 2: Datenstrukturen
Rekursion Richard Göbel.
Splay Trees Von Projdakov Benjamin.
Einführung in die Programmierung
Effiziente Algorithmen
Diskrete Mathematik II
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Binäre Bäume Louis Moret und Reto Huber, 5. 11
1.6 Die Datenstruktur Stapel Ein Stapel (Stack) ist ein Sonderfall einer Liste. Die Elemente werden nach dem Prinzip LIFO (Last In First Out) angefügt.
Vorlesung Binärer Suchbaum II-
Graphen und Bäume.
Algorithmen und Datenstrukturen Übungsmodul 8
Kapitel 6: Suchbäume und weitere Sortierverfahren
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Binärer Suchbaum IV AVL-Baum I
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Binärbäume.
2. Die rekursive Datenstruktur Baum 2.1 Von der Liste zum Baum
2.4 Durchlaufen von Bäumen
 Präsentation transkript:

Durchlaufen eines Binärbaumes - Baumdurchlauf (tree traversal): Verarbeitung aller Baumknoten gemäß vorgegebener Strukturierung - Rekursiv anzuwendende Schritte 1) Verarbeitete Wurzel: W 2) Durchlaufe linken UB: L 3) Durchlaufe rechten UB: R - Durchlaufprinzip impliziert sequentielle, lineare Ordnung auf der Menge der Knoten. 6 Möglichkeiten 1 2 3 4 5 6 W L L W R R L W R R W L R R W L L W Konvention: linker UB vor rechten UB

Preorder: besuche Wurzel, traversiere linken Teilbaum, 3 Strategien 1) Vorordnung ( preorder ): WLR 2) Zwischenordnung (inorder): LWR 3) Nachordnung (postorder): LRW Preorder: besuche Wurzel, traversiere linken Teilbaum, traversiere rechten Teilbaum Postorder: traversiere linken Teilbaum, traversiere rechten Teilbaum, besuche Wurzel Inorder : traversiere linken Teilbaum, besuche Wurzel, traversiere rechten Teilbaum Inorder heißt auch symmetrische Ordnung.

Beispiel: 28 12 34 16 19 49 8 29 15 31 Preorder: 28, 16, 12, 8, 15, 19, 34, 31, 29, 49 Postorder: 8, 15, 12, 19, 16, 29, 31, 49, 34, 28 Inorder: 8, 12, 15, 16, 19, 28, 29, 31, 34, 49 Hinweise: wenn man Baum von der Wurzel aus umfährt, erhält man Preorder durch Besuch aller Knoten, an deren linker Seite man vorbeikommt Postorder durch Besuch aller Knoten, an deren rechter Seite man vorbeikommt Inorder durch Besuch aller Knoten, an deren unterer Seite man vorbeikommt

Rekursive und Iterative Version: LWR - Rekursive Version : LWR LWR(Knotenzeiger Wurzel) { if (Wurzel != NULL) { LWR (Wurzel --> Lsohn); Verarbeite (Wurzel --> Info); LWR (Wurzel --> Rsohn); } } /* End LWR */

- Iterative Version: LWR Ziel: effizientere Ausführung durch eigene Stapelverarbeitung Vorgehensweise: Nimm, solange wie möglich linke Abzweigung und speichere den zurückgelegten Weg auf einen Stapel. Aktion 1: PUSH (S , Current); Current = Current --> Lsohn ; Wenn es links nicht mehr weiter geht, wird der oberste Knoten des Stapels ausgegeben und vom Stapel entfernt. Der Durchlauf wird mit dem rechten Unterbaum des entfernten Knotens fortgesetzt. Aktion 2: WriteString (TOP(S) --> Info) ; /*Verarbeite Info */ Current = TOP(S) --> Rsohn; POP(S);

Gefädelte Binärbäume - Weitere Verbesserung von iterativen Durchlaufalgorithmen - Methode benutzt einen „Faden“, der die Baumknoten in der Folge der Durchlaufordnung verknüpft. Zwei Typen von Fäden Rechtsfaden verbindet jeden Knoten mit seinem Nachfolgerknoten in Durchlaufordnung. Linksfaden stellt die Verbindung zum Vorgängerknoten in Durchlaufordnung her.

Einfügen Neue Knoten werden immer als Blätter eingefügt Aussehen des Baumes wird durch die Folge der Einfügungen bestimmt (Reihenfolge der Eingabeelemente!) Einfügen in binären Suchbäumen typedef struct Knoten { struct Knoten *Lsohn; Schluesseltyp Key; struct Knoten *Rsohn; } ; typedef struct Knoten *Kptr; Kptr Wurzel;

void Einfuegen (Knotenzeiger p, int k) { if ( p == NULL ) /* Leerer Baum */ p = (struct Knoten *) malloc (sizeof *p); p --> leftson = NULL; p --> rightson = NULL; p --> key = k; } else if (k < p --> key) Einfuegen( p --> leftson, k ) ; else if (k > p --> key ) Einfuegen ( p --> rightson, k ) ; else printf („Schluessel bereits vorhanden \n“);

Problem: es können "degenerierte" Bäume entstehen (etwa Listen). Entfernen eines Knotens: Sehr einfach: Entfernen eines Blattes Einfach: Entfernen eines Knotens p mit 1 Nachfolger: Knoten einfach durch Nachfolger ersetzen Schwieriger: Entfernen eines Knotens p mit 2 Nachfolgern: Suche am weitesten links stehenden Knoten q im rechten Teilbaum (symmetrischen Nachfolger). Ersetze p durch q, streiche q aus seiner ursprünglichen Position.

Knotenzeiger vatersymnach ( Knotenzeiger p) /* Liefert Zeiger auf Vater des symmetrischen */ /* Nachfolgers von p --> */ { if ( p --> rightson --> leftson == NULL) p = p --> rightson; while ( p --> leftson --> leftson == NULL) p = p --> leftson; } vatersymnach = p; return vatersymnach;

void Entfernen (Knotenzeiger p, int k) /* Entfernt Knoten mit Schluessel k aus Baum mit Wurzel p */ Knotenzeiger q ; { if (p == NULL) printf („Schluessel nicht im Baum \n“); if (k < p-->key) Entfernen ( p--> leftson, k); else if ( (k > p --> key) Entfernen (p --> rightson, k ); else if ( p --> leftson == NULL) p = p --> rightson ; else if (p --> rightson == NULL) p = p --> leftson ; else /* zwei Nachfolger */ { q = vatersymnach (p); if ( q == p ) { p --> key = q --> rightson.key ; q --> rightson = q --> rightson.rightson; } else { p --> key = q --> leftson.key; q --> leftson = q --> leftson.rightson ; } }

Suche in binären Suchbäumen Direkte Suche: (Vorgehensweise wie bei Suche nach Einfügeposition Suchen eines Knotens (rekursive Version) Suche ( Kptr Wurzel, Schluesseltyp Skey) { if (Wurzel == NULL) return NULL; else if (Wurzel --> Skey < Key) return Suche(Lsohn, Skey); else if (Wurzel --> Skey > Key) return Suche(Rsohn, Skey); else return Wurzel; }

Suchen eines Knotens (iterative Version) Finde (Ktpr Wurzel, Schluesseltyp Skey) { int Gefunden; Gefunden = FALSE; do { if (Wurzel == NULL) Gefunden = TRUE; else if(Wurzel --> Skey < Key) Wurzel = Lsohn; else if (Wurzel --> Skey > Key) Wurzel = Rsohn; else Gefunden = FALSE; } while (Gefunden = TRUE); return Wurzel; } Sequentielle Suche Einsatz eines Durchlauf-Algorithmus (Zwischenordnung)

Binäre Suchbäume: Zugriffskosten Kostenmaß: Anzahl der aufgesuchten Knoten bzw. Anzahl der benötigten Suchschritte oder Schlüsselvergleiche. sequentielle Suche direkte Suche Mittlere Zugriffskosten z eines Baumes B erhält man durch Berechnung seiner gesamten Pfadlänge PL als Summe der Längen der Pfade von der Wurzel bis zu jedem Knoten Ki. n PL ( B )=  Stufe (Ki) i = 1

Die mittlere Pfadlänge ergibt sich zu l = PL / n . Maximale Zugriffskosten Die längsten Suchpfade und damit die maximalen Zugriffskosten ergeben sich, wenn der binäre Suchbaum zu einer linearen Liste entartet. Höhe: h = lmax + 1 = n

Maximale mittlere Zugriffskosten: zmax = 1/n *  ( i + 1 ) * 1 = n * -------- = -------- = O (n) 2 2n i = 0 Minimale ( mittlere ) Zugriffskosten Sie können in einer fast vollständigen oder ausgeglichenen Baumstruktur erwartet werden. Gesamtzahl der Knoten: 2 h-1 -1 < n  2 h -1 Höhe h = [ log 2 n ] + 1 Minimale mittlere Zugriffskosten: z min  log 2 n - 1

Durchschnittliche Zugriffskosten Extremfälle der mittleren Zugriffskosten sind wenig aussagekräftig. Differenz der mittleren zu den minimalen Zugriffskosten ist ein Maß für die Dringlichkeit von Balancierungen. Bestimmung der mittleren Zugriffskosten zn i B l B r i - 1 Knoten n - i Knoten zi-1 zn - i

n verschiedene Schlüssel mit den Werten 1, 2, ..., n seien in zufälliger Reihenfolge gegeben. Die Wahrscheinlichkeit, dass der erste Schlüssel den Wert i besitzt, ist 1/n. (Annahme: gleiche Zugriffswahrscheinlichkeit auf alle Knoten) Für den Baum mit i als Wurzel erhalten wir zn ( i ) = 1/n * ( ( zi-1 + 1 ) * ( i - 1) + 1 + ( zn-1 + 1) * ( n - i ) ) Die Rekursions-Gleichung lässt sich in nicht-rekursiver, geschlossener Form mit Hilfe der harmonischen Funktion n 1 i Hn =  darstellen. i =1

zn = 2 * ----------* Hn - 3 = 2 ln ( n) - c . n Es ergibt sich: ( n + 1 ) zn = 2 * ----------* Hn - 3 = 2 ln ( n) - c . n Relative Mehrkosten: z n 2 ln ( n ) - c 2 ln ( n ) - c --------- = ---------------  --------------- = 2 ln ( 2 ) = 1.386... z min log 2 ( n ) - 1 log 2 ( n ) Der ausgeglichene binäre Suchbaum verursacht für alle Grundoperationen die geringsten Kosten. Perfekte Balancierung zu jeder Zeit kommt jedoch sehr teuer.