Claudio Moraga; Gisbert Dittrich

Slides:



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

Randomisierte Algorithmen Präfix Suche und Konsistentes Hashing
Punkt-in-Polygon-Verfahren III (R/R+-Baum)
Eine dynamische Menge, die diese Operationen unterstützt,
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
7. Natürliche Binärbäume
Gewichtsbalancierte Suchbäume
Durchlaufen eines Binärbaumes
Kapitel 6. Suchverfahren
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
Effizienz: Indexstrukturen
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 02 - Polynomprodukt und Fast Fourier Transformation Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
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 Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
Claudio Moraga; Gisbert Dittrich
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 Kapitel 5 Claudio Moraga; 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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, 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
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 Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 2 Gisbert Dittrich; Claudio Moraga FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, 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
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
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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 11 Claudio Moraga, 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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Bäume-
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)
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
7.1 Externes Suchen Bisherige Algorithmen: geeignet, wenn alle Daten im Hauptspeicher. Große Datenmengen: oft auf externen Speichermedien, z.B. Festplatte.
Splay Trees Von Projdakov Benjamin.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Effiziente Algorithmen
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
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.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Vorlesung Binärer Suchbaum II-
Graphen und Bäume.
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
Binärer Baum, Binärer Suchbaum 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
 Präsentation transkript:

Claudio Moraga; Gisbert Dittrich EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 8 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de

Gliederung Kapitel 8 Motivation Binärer Suchbaum Suchen in einfach verketteter Liste + deren Nachteile Binärer Suchbaum Grobideen: Suchen, Suchstruktur Idee Baum Binärer Baum, Knotenmarkierung, Implementierung knotenmarkierter bin. Bäume, Suchbaum Suchen Einfügen Analyse 08.01.2001

Suchen in einer Liste Ist L die leere Liste: i kann nicht in L sein. Ist L nicht leer entweder i == L->Element oder i wird in L->weiter gesucht 08.01.2001

Suchen in einer Liste bool Suchen (int i, Liste * L) { if (L == NULL) return false; else return (L->Element == i? true: Suchen(i, L->weiter)); } Die Lösung des Problems, ein Element in einer Liste zu suchen, variiert die bisher zu Listen entwickelten Ideen: Um ein Element zu entfernen, muß man es bekanntlich erst finden. Die Grundidee ist wie folgt: Wenn in einer Liste L eine ganze Zahl i gesucht wird, dann ergibt die Suche das Resultat falsch, falls die leere Liste vorliegt, und den Wert wahr, falls das erste Element der Liste bereits unsere Zahl i enthält. Ist dies nicht der Fall, so wird als Resultat der Suche (in der gesamten Liste) das Ergebnis der Suche i (im Rest der Liste) zurückgegeben. Auch hier ergibt sich eine sehr natürliche Art der rekursiven Formulierung. 08.01.2001

Suchen in einer Liste Problem: langsame Suche jedes Element muß bei einer erfolglosen Suche betrachtet werden also: Suchzeit proportional zur Anzahl der Elemente in der Liste (lineare Suchzeit) Der vorgestellte Suchalgorithmus für das Suchen in einer linearen Liste ist einfach und elegant. Er hat allerdings ein Problem: Falls wir in der Liste erfolglos suchen und falls die Liste nicht geordnet ist, müssen wir die gesamte Liste durchlaufen. Die Anzahl der Vergleichsoperationen ist dann also proportional zur Anzahl der Elemente in dieser Liste. Das hört sich zunächst einmal recht unverbindlich an, daher soll ein Beispiel durchgerechnet werden. 08.01.2001

Suchen in einer Liste Beispiel erfolglose Suche bei 105 Elementen braucht 105 Vergleiche, also (pro Vergleich 10-1 sec.) 104 sec =~ 2,7 h Bei geschickter Anordnung der Daten geht´s mit ~ 35 Vergleichen, also in ~ 3.5 sec. Nehmen wir an, wir haben eine Milliarde Elemente, die durchsucht werden müssen, so benötigen wir eine Milliarde Vergleiche für eine erfolglose Suche. Wenn wir eine Zehntausendstel Sekunde für jeden Vergleich brauchen, so benötigen wir etwa 2 Std. 45 Min. für die Suche. Das ist ziemlich lang, wenn man bedenkt, daß die Suche auch viel schneller vor sich gehen könnte, nämlich in etwa einer Dreitausendstel Sekunde. Das wiederum geht natürlich nur dann, wenn wir die Daten geschickt anordnen, und darüber werden wir uns jetzt Gedanken machen. 08.01.2001

Suche „in einer Hälfte“ Grobidee: Suchen in geordneter "Liste" durch Überprüfen des "mittleren" Elementes + Fortsetzung in einer Hälfte Beispiel: 1 2 3 4 5 6 7 8 9 2 4 6 7 8 17 19 36 40 k: 19 k:5 Seien die neun Zahlen 2,4,6,7,8,17,19,36,40 sortiert , d.h. der Größe nach angeordnet, gegeben. Sei eine Zahl i gegeben . Ist i in der angeordneten Menge der gegebenen Zahlen enthalten? Die Suche nach einer Zahl gestaltet sich dann effizient folgendermaßen: • Prüfe das "mittlere" Element. • Ist dies das gesuchte Element, so ist die Suche erfolgreich beendet. • Ist dies dort gefundene Element größer als das gesuchte, suche nach diesem Verfahren in der unteren Hälfte, ansonsten in der oberen Hälfte weiter. • Wird die zu untersuchende Hälfte "leer", so ist die Suche erfolglos. Dies wird für zwei Zahlen, 19 und 5, auf der Folie durchgespielt. Um dies Verfahren anzuwenden, haben wir die Elemente als sortiert vorausgesetzt. Wie können wir diese Anordnung bei willkürlicher Reihenfolge der angelieferten Zahlen mit wenig Aufwand erreichen? Ein Art ist, eine spezielle Datenstruktur, sog. binäre Suchbäume, zu verwenden. Auf der nächsten Folie bauen wir einen solchen beispielhaft für die oben verwendete Menge von Zahlen auf. OK : nicht vorhanden 08.01.2001

Suchstruktur Aufgabe: Trage die Zahlen 17, 4, 36, 2, 8, 19, 40, 6, 7 in eine baumförmige Struktur so ein: 17 4 36 Dieses Beispiel nimmt an, daß die oben angegebenen Zahlen in der aufgeschriebenen Reihenfolge eingegeben werden. Die Schlüsselidee besteht darin, die Daten nicht linear, wie in einer linearen Liste anzuordnen, sondern in einer baumförmigen Struktur. Wenn Sie die Animation der Folie betrachten, so sehen Sie, daß jede Zahl einen wohlüberlegten Platz im Baum findet. Wenn Sie etwa 17 betrachten, so ist 17 größer als 4, aber kleiner als 36. Diese baumförmigen Strukturen werden den Namen binäre Suchbäume tragen. Die Entwicklung dieses Begriffs erfolgt in mehreren Schritten. 2 8 19 40 6 7 08.01.2001

Ziel: Binärer Suchbaum Zu diesem Ziel nacheinander definieren: (Binärer) Baum Knotenmarkierter binärer Baum Binärer Suchbaum 08.01.2001

Idee von Baum Die Informatiksicht: Abstrahiert 2 Künstlerisch 08.01.2001

Binärer Baum Definition: (Binärer Baum) 1.) Der "leere" Baum  ist ein binärer Baum mit der Knotenmenge . 2.) Seien Bi binäre Bäume mit den Knotenmengen Ki , i = 1,2. Dann ist auch B = (w, B1, B2) ein binärer Baum mit der Knotenmenge K = {w}  K1  K2. ( bezeichnet disjunkte Vereinigung.) . Die Definition eines binären Baums geschieht wieder rekursiv: 1. ein leerer Baum ist ein binärer Baum 2. sind L und R binäre Bäume, so ist auch die Struktur ein binärer Baum, die sich aus einer Wurzel zusammen mit L als linkem umd R als rechtem Unterbaum zusammensetzt. Eine mathematisch saubere Formulierung findet sich auf obiger Folie. Üblicher Weise wird jedoch mit bildhaften Darstellungen operiert, wie wir es auch im nachfolgenden tun werden. 3.) Jeder binäre Baum B läßt sich durch endlich häufige Anwendung von 1.) oder 2.) erhalten. 08.01.2001

Binärer Baum Sprech-/Darstellungsweisen (im Falle 2.)): Wurzel w B1 B2 Sei B = (w, B1, B2) binärer Baum w heißt Wurzel, B1 linker und B2 rechter Unterbaum. Wurzel w B1 B2 linker Unterbaum rechter Unterbaum 08.01.2001

Binärer Baum Darstellung eines Beispiels nach Definition: B1 = (k1, , (k2, (k3, , ), )). k1 k2 k3 08.01.2001

Terminologie Binäre Bäume Wurzel innerer Knoten Blatt Mit binären Bäumen sind einige einfache Begriffe verbunden, die auf dieser Folie zu finden sind. Den Begriff der Wurzel haben wir ja schon vorher eingeführt. Die Wurzel (des Gesamt-)Baumes ist dadurch charakterisiert, daß sie nicht Sohn eines anderen Knotens ist. Umgekehrt gibt es Knoten, die keine Söhne haben: Derartige Knoten heißen Blätter. Sie sind auf der Folie blau wiedergegeben. Dann gibt es Knoten, die Söhne anderer Knoten sind und selbst wieder mindestens einen Sohn haben, solche Knoten heißen innere Knoten. Es ist bemerkenswert, daß die Bäume in der Informatik, die Wurzeln oben tragen. Dies hat wohl einen pragmatischen Grund: Dadurch lassen sich Bäume in der Regel leichter zeichnen. Vgl. dazu auch die Folie "Idee von Baum" 08.01.2001

Knotenmarkierter binärer Baum Definition: Sei M eine Menge. (B, km) ist ein knotenmarkierter binärer Baum (mit Markierungen aus M) :¤ 1.) B ist binärer Baum (mit Knotenmenge K = K(B)) 2.) km: K --> M Abbildung. (Markierung/Beschriftung der Knoten k  K mit Elementen m  M) Wird zu einem binären Baum eine Knotenmarkierung durch eine Abbildung von der Knotenmenge in eine Menge von Markierungen hinzugenommen, so erhalten wir einen knotenmarkierten binären Baum. 08.01.2001

Knotenmarkierter binärer Baum Beispiel: (M := Menge der ganzen Zahlen) damit existiert auf M eine Ordnung ! "Übliche" Darstellung der Knotenbeschriftung km durch "Anschreiben" der Beschriftung an/in die Knoten. k1 16 Für unseren weiteren Entwicklungen setzen wir voraus, daß die Markierungs-menge eine lineare Ordnung aufweist. Speziell ziehen wir uns zunächst auf die Menge der linear geordneten Menge der ganzen Zahlen mit der üblicherweise darauf definierten Ordnung zurück. Die Markierungsabbildung wird üblicherweise durch An-/Einschreiben der Bildwerte an resp. in die Knoten dargestellt, wie im Beispiel auf der Folie auch vorgemacht. 24 k2 18 k3 08.01.2001

Datentyp BinBaum Implementierung knotenmarkierter binärer Bäume durch eine struct mit Zeigern: Inhalt, (hier z. B.) ganzzahlig (Später allgemeiner möglich) Zeiger jeweils auf den linken und den rechten Unterbaum Damit können wir knotenmarkierte binäre Bäume insbesondere so als Datenstrukturen darstellen: Weil diese Bäume rekursiv definiert sind, können wir auch eine rekursive Definition des entsprechenden Datentyps angeben. Wir nehmen an, daß ganze Zahlen in einzelnen Knoten gespeichert sind, es könnten jedoch auch andere Typen sein (was wir später benutzen werden). Die Deklaration der entsprechenden Struktur finden Sie auf dieser Folie. Es ist dabei zu beachten, daß wir Zeiger auf die jeweiligen Unterbäume haben (genauer: auf die Wurzeln der Unterbäume). Damit können wir bei der Konstruktion eines Baums auf unseren Grundvorrat von Techniken, den wir bei der Manipulation von Zeigern erworben haben, zurückgreifen. Es wird sich natürlich zeigen, daß hier noch einiges an zusätzlichen Überlegungen notwendig ist. struct BinBaum { int Element; BinBaum *Lsohn, *Rsohn; } 08.01.2001

Binäre Suchbäume Definition: (B, km) ist ein binärer Suchbaum (über M) :¤ 1.) (B, km) ist ein binärer, knotenmarkierter Baum. 2.) Ist w die Beschriftung der Wurzel w, so ist die Wurzelmarkierung im linken Unterbaum kleiner als w, die Wurzelmarkierung im rechten Unterbaum größer als w. (Jeweils, sofern diese vorhanden.) 3.) Ist (B, km) mit B  , B = (w, B1, B2), so sind (Bi,kmi) mit kmi := km|Bi (i= 1,2) binäre Suchbäume. Wir werden jetzt binäre Suchbäume definieren. Ein binärer Suchbaum ist dadurch charakterisiert, daß • jeder Knoten eine Beschriftung trägt. Die Beschriftung ist einer geordneten Menge entnommen (wie oben etwa den ganzen Zahlen). • die Beschriftung der Wurzel größer als die Beschriftung der Wurzel des linken Unterbaums und kleiner als die Beschriftung der Wurzel des rechten Unterbaums ist. • der linke und der rechte Unterbaum selbst wieder binäre Suchbäume sind. Bitte beachten Sie, daß der leere Baum auch ein binärer Suchbaum ist. Die Rolle des leeren Baums soll kurz kommentiert werden: Viele der vorgestellten Algorithmen sind rekursiv. Der Aufruf einer solchen Prozedur spielt sich typischerweise folgendermaßen ab: Die Prozedur wird für einen Baum aufgerufen, die rekursiven Aufrufe erfolgen für Teilbäume. Damit werden die Argumente für die rekursive Funktion immer kleiner, sie stoppen meist dann, wenn der kleinste aller möglichen Bäume erreicht ist. Und das ist eben der leere Baum. Techniken zur Manipulation binärer Bäume sind meist sehr ähnlich zu denen binärer Suchbäume, so daß sie gleichsam als Abfallprodukt dieser Techniken auch hier eingeführt werden. 08.01.2001

Binäre Suchbäume Beispiel: Aufgaben im Zusammenhang mit (binären) Suchbäumen: Suchen nach Markierungen/Elementen im Suchbaum Aufbau solcher Bäume Abbau, z. B. Entfernen eines Knotens mit Markierung Durchlaufen aller Knoten Den oben angeführten Teilaufgaben werden wir der Reihe nach nachgehen. 08.01.2001

Binäre Suchbäume: Suchen Gegeben: ein binärer Suchbaum (durch Zeiger B darauf), ganze Zahl k Problem: Ist k in durch B bezeichneten Baum gespeichert? Lösungsidee: Stimmt B->Element mit k überein: Antwort ja Gilt B->Element < k: suche in B->Rsohn Gilt B->Element > k: suche in B->Lsohn Ist B leer, Antwort nein Aus der Definition eines binären Suchbaums ergibt sich jetzt leicht die Möglichkeit der Suche in einem solchen Baum. Es ist eine Variation der Grobidee, die wir unter dem Stichwort "Binäre Suche" vorn schon eingeführt haben. Wir nehmen an, daß wir (einen Zeiger auf (!!) ) einen binären Suchbaum B gegeben haben und suchen in dem dadurch bezeichneten Baum die Zahl k. Die Frage, ob k in *B zu finden ist, läßt sich wie folgt beantworten: Ist k in der Wurzel von *B zu finden, so lautet die Antwort: Ja. Ist k kleiner als der Wert, der in der Wurzel von *B gespeichert ist, so lautet die Antwort: Schaue im linken Unterbaum nach. Analog: ist k größer als die Zahl, die in der Wurzel gespeichert ist, so lautet die Antwort: Schaue im rechten Unterbaum nach. Wurde der leere Baum übergeben, so lautet die Antwort: Nein. Diese Suchprozedur ist ein typisches Beispiel für die Vorgehensweise bei rekursiven Aufrufen für binäre Bäume: Die Aufrufe innerhalb einer Funktion verkleinern den Baum so weit, bis er zum leeren Baum degeneriert ist (natürlich nur, wenn das gewünschte Ergebnis noch nicht vorliegt und die Unterbäume betrachtet werden müssen). 08.01.2001

Binäre Suchbäume: Suchen Suche nach dem Element 19 Suche nach dem Element 5 17 4 36 2 8 6 7 19 40 Die Suche in einem binären Suchbaum wird an unseren leicht modifizierten alten Bekannten an zwei Beispielen durchexerziert: an der erfolglosen und an der erfolgreichen Suche. Sie sollten sich die Vorgehensweise in beiden Fällen genau anschauen, um zu einem Verständnis der rekursiv geprägten Vorgehensweise zu kommen. 08.01.2001

Binäre Suchbäume: Suchen bool Suche (BinBaum * B, int k) { if (B == NULL) return false; else { if (B->Element == k) return true; else if (B->Element < k) return Suche(B->Rsohn, k); else if (B->Element > k) return Suche(B->Lsohn, k); } Der Programmcode für die Such-Operation folgt diesem Schema sehr eng, es wird lediglich angemerkt, daß wir den Fall eines leeren Baums zu Beginn abfangen müssen: Würden wir versuchen, den linken oder den rechten Teilbaum eines leeren binären Suchbaums anzusprechen oder gar den Inhalt, so würden wir eine Fehlermeldung reinsten Wassers erhalten, da wir in diesem Falle auf undefinierte Speicherbereiche zugreifen. Beim Studium des Texts fällt Ihnen auf, daß wir - wie vorher hier geschildert - die rekursiven Aufrufe von den Größenvergleichen zwischen der zu suchenden Zahl k und dem Inhalt der Wurzel des gerade vorliegenden Baums abhängig machen. 08.01.2001

Binäre Suchbäume: Einfügen Aufbau durch wiederholtes Einfügen in einen leeren binären Suchbaum Einfügeoperation für binären Suchbaum *B und eine ganze Zahl k B == NULL: erzeuge neuen Knoten, weise ihn B zu und setze B->Element = k B != NULL B->Element < k: Einfügen von k in B->RSohn B->Element > k: Einfügen von k in B->LSohn Das Einfügen in einen binären Suchbaum folgt der gleichen Philosophie wie das Suchen in einem solchen Baum. Wir wenden uns dem Einfügen zu: Zunächst stellen wir fest, daß, wenn wir die ganze Zahl k in den binären Suchbaum, auf den B zeigt, einfügen wollen und *B der leere Baum ist, wir nichts anderes zu tun haben, als einen neuen Knoten zu erzeugen, das Inhaltsfeld des Knotens auf die Zahl k zu setzen und diesen neuen Knoten als Resultat der Einfügeoperation zurückzugeben. Nehmen wir nun an, daß k im linken Unterbaum eingefügt werden soll (, weil k kleiner als die Beschriftung der Wurzel von *B ist). Dann fügen wir k in den linken Unterbaum ein, indem wir die Einfügefunktion mit den beiden entsprechenden Parameter aufrufen. Hierdurch ergibt sich ein modifizierter binärer Suchbaum, der dann als linker Teilbaum in unseren Baum *B eingefügt wird. Völlig analog argumentiert man im Fall der Einfügung in den rechten Teilbaum. Diese Überlegungen setzen natürlich voraus, daß k noch nicht in *B enthalten ist. Im Fall, daß k schon im Suchbaum enthalten ist, wird keine Einfüge-Operation vorgenommen. 08.01.2001

Binäre Suchbäume: Einfügen Rekursion wichtiger Bestandteil der Funktion Idee: suche den Unterbaum, in den eingefügt werden soll, füge in den Unterbaum ein, weise diesem Unterbaum das Resultat der Einfügung zu. 08.01.2001

Binäre Suchbäume: Einfügen BinBaum *Einfuegen (BinBaum * B, int k) { if (B == NULL){ Binbaum *Hilf = new BinBaum; Hilf->Element = k; Hilf->Lsohn = Hilf->Rsohn = NULL; B = Hilf; Hilf = NULL; } else { if (B->Element < k) B->Rsohn = Einfuegen(B->Rsohn, k); else if (B->Element > k) B->Lsohn = Einfuegen(B->Lsohn, k); return B; Der Code für diese Einfügung ist hier angegeben. Es soll erneut auf die rekursiven Aufrufe hingewiesen werden: Wird in dem linken Teilbaum eingefügt, so entsteht ein modifizierter Baum, der dann linker Teilbaum des ursprünglich gegebenen Teilbaums wird. Dieser Gedanke ist ein wenig trickreich und sollte noch einmal reflektiert werden. Die beiden folgenden Folien gehen dann auch noch einmal auf diesen Sachverhalt ein. 08.01.2001

B->Lsohn = Einfuegen(B->Lsohn, k); BinBaum *Einfuegen(BinBaum * B, int k){ if (B == NULL){ Binbaum *Hilf = new BinBaum; Hilf->Element = k; Hilf->Lsohn = Hilf->Rsohn = NULL; B = Hilf; Hilf = NULL; }; return B;} B Hilf k else {if (B->Element > k) B->Lsohn = Einfuegen(B->Lsohn, k); else if (B->Element < k) B->Rsohn = Einfuegen(B->Rsohn, k); }; Return B; } k 08.01.2001

Kommentar: Einfügen Suche den Unterbaum, in den eingefügt wird if (B->Element < k) B->Rsohn = Einfuegen(B->Rsohn, k); else if (B->Element > k) B->Lsohn = Einfuegen(B->Lsohn, k); return B; weise dem Unterbaum das Resultat der Einfügung zu 08.01.2001

Analyse: Einfügen Wie schnell geht das eigentlich? Maß für die Güte eines Algorithmus: Anzahl von Operationen und Speicherplatz-Verbrauch hier: Speicherplatz: pro Knoten eines Exemplars von BinBaum, also relativ uninteressant. Operationen sind hier Vergleiche: interessant Erinnern Sie sich: Wir hatten die Behauptung aufgestellt, daß die Einfügung in eine lineare Liste vergleichsweise ineffizient gegenüber der Einfügung in eine neu zu erfindende Struktur sei. Nun, wir haben diese Struktur erfunden, haben uns mit dieser Struktur vertraut gemacht, und jetzt müssen wir sehen, wie wir die Behauptung denn tatsächlich auch verifizieren können. Dazu dienen die nächsten Überlegungen. Die Frage ist, wie schnell die Einfügeoperation durchgeführt werden kann. Um dies quantitativ faßbar zu machen, müssen wir uns überlegen, was wir als quantitatives Maß heranziehen. Es hat sich herausgestellt, daß die Anzahl von Operationen und der Speicherplatzbedarf ein geeignetes Maß für die Güte der Algorithmen ist. Als Operationen kommen im wesentlichen Vergleiche in Frage, die Anzahl der anderen Operationen (Neuaufrufe der Einfügeoperation, Erzeugung von Knoten) ist proportional zur Anzahl der Vergleiche. Daher wollen wir uns, was die Operationen betrifft, auf Vergleiche konzentrieren. Der Speicherplatzbedarf für unsere Algorithmen ist einfach zu ermitteln: Pro eingefügter Zahl ist ein Knoten einzulegen, der Knoten selbst hat das Inhaltsfeld und zwei Zeiger-Komponenten, so daß der Speicherplatzbedarf proportional zur Anzahl der Elemente ist (übrigens ist dies vergleichbar zum Speicherplatzbedarf für lineare Listen). 08.01.2001

Analyse: Einfügen Frage: wieviele Vergleiche sind beim Einfügen (oder bei der erfolglosen Suche) notwendig? Antwort: nicht so leicht zu geben: ist der günstigste Fall gemeint? (klar: 1) ist der ungünstigste Fall gemeint? (auch ziemlich klar: längster Pfad im Baum) ist der durchschnittliche Fall gemeint? (völlig unklar) Damit haben wir die Überlegungen auf die Frage reduziert, wieviel Vergleiche beim Einfügen (oder, was praktisch dasselbe ist, bei der erfolglosen Suche) notwendig sind. Die Antwort läßt sich nicht so einfach geben, wie die Frage gestellt werden kann. Im günstigsten Fall brauchen wir nur einen Vergleich durchzuführen, hier muß lediglich mit der Wurzel verglichen werden. Der ungünstigste Fall ist auch recht klar: Hier müssen wir den längsten Pfad im Baum durchlaufen, also den längsten Weg, der von der Wurzel zu einem Blatt führt. Der durchschnittliche Fall, also der Fall, den man als normaler Mensch erwartet, erfordert ebenfalls einiges an Überlegungen: Hier wird ein gerüttelt Maß höherer Mathematik erforderlich sein, so daß wir darauf hier nicht eingehen. 08.01.2001

Suchen: ungünstigster Fall Erfolglose Suche: suche von der Wurzel zu einem Blatt, jeder Knoten entspricht einem Vergleich. Höhe eines Baums: gibt den längsten Pfad von der Wurzel zu einem Blatt an. Ist rekursiv definiert Höhe des leeren Baums ist 0, Höhe eines nicht-leeren Baums ist 1 + max{Höhe Lsohn, Höhe Rsohn} Die erfolglose Suche ist offenbar der Fall, bei dem wir die meiste Zeit verbringen, hierbei müssen wir von der Wurzel zu einem Blatt laufen, jeder Knoten entspricht einem Vergleich. Um diese in den Griff zu bekommen, erweist es sich als hilfreich, die Höhe eines Baums zu definieren. Unter der Höhe eines Baums versteht man, wie auf der Folie angegeben, den längsten Pfad von der Wurzel zu einem Blatt. Auch das läßt sich rekursiv definieren, die Definition ist auf der Folie angegeben. Es ist plausibel, daß diese Definition der anschaulichen Definition der Höhe eines Unterbaums entspricht. 08.01.2001

Höhe eines binären Baums 17 4 36 2 8 6 7 19 40 37 Der Baum hat die Höhe 5 08.01.2001

Suchen: ungünstigster Fall Es gilt der Satz: Ein binärer Baum der Höhe n hat zwischen n und 2 n- 1 Knoten. Daraus folgt: k Knoten können in einem binären Baum gespeichert werden, der eine Höhe zwischen ~log2 k und k hat Also: der schlechteste Fall bei der erfolglosen Suche in einem binären Suchbaum mit k Elementen liegt bei k Vergleichsoperationen Man kann sich jetzt überlegen, daß, wenn man einen binären Baum der Höhe n hat, man zwischen n und 2 n- 1 Knoten in diesem Baum speichern kann. (Ein-facher Beweis durch Induktion.) Durch Umkehrung der Rechnung (also Auflösen nach den Exponenten) kann man daraus herleiten, daß k Knoten in einem binären Suchbaum gespeichert werden können, dessen Höhe zwischen k und log k und liegt. Dieses Ergebnis erhält man recht einfach dadurch, daß man sich überlegt, innerhalb welcher Grenzen die Höhe eines Baums zu wählen ist, um die k Knoten abzuspeichern. Daraus können wir nun ableiten, daß der schlechteste Fall, also die Anzahl von Vergleichen in dem Fall, daß das Element nicht im Baum vorhanden ist, k Vergleichsoperationen erfordert. Damit sind binäre Suchbäume offensichtlich nicht so gut, wie wir am Anfang überlegt haben. Allerdings muß hinzugefügt werden, daß dieser schlechteste Fall in der Praxis sehr selten auftritt. Daher geben wir auf der nächsten Folie kurz ein weiteres Ergebnis an, das wesentlich realistischer ist und die praktische Arbeit mit binären Suchbäumen rechtfertigt. 08.01.2001

Suchen: zu erwartender Fall Die erfolglose Suche in einem binären Suchbaum mit k Elementen erfordert im Durchschnitt proportional zu log k Vergleichsoperationen. Recht kompliziert herzuleiten. Die Höhe eines Baums ist im Durchschnitt logarithmisch in der Anzahl der im Baum vorhandenen Knoten. Daraus folgt, daß die erfolglose Suche in einem binären Suchbaum im Durchschnitt etwa logarithmisch viele Schritte erfordert. 08.01.2001