www.wikidata.de-de.nina.az
In der Informatik ist ein binarer Suchbaum eine Kombination der abstrakten Datenstrukturen Suchbaum und Binarbaum Ein binarer Suchbaum haufig abgekurzt als BST von englisch Binary Search Tree ist ein binarer Baum bei dem die Knoten Schlussel tragen und die Schlussel des linken Teilbaums eines Knotens nur kleiner oder gleich und die des rechten Teilbaums nur grosser oder gleich als der Schlussel des Knotens selbst sind Was die Begriffe kleiner gleich und grosser gleich bedeuten ist vollig dem Anwender uberlassen sie mussen nur eine Totalordnung genauer eine totale Quasiordnung siehe unten etablieren Am flexibelsten wird die Ordnungsrelation durch eine vom Anwender zur Verfugung zu stellende 3 Wege Vergleichsfunktion realisiert Auch ob es sich um ein einziges Schlusselfeld oder eine Kombination von Feldern handelt ist Sache des Anwenders ferner ob Duplikate unterschiedliche Elemente die beim Vergleich aber nicht als ungleich herauskommen zulassig sein sollen oder nicht Uber Suchfunktionen fur diesen Fall siehe unten Ein in order Durchlauf durch einen binaren Suchbaum ist aquivalent zum Wandern durch eine sortierte Liste bei im Wesentlichen gleichem Laufzeitverhalten Mit anderen Worten ein binarer Suchbaum bietet ggf wesentlich mehr Funktionalitat zum Beispiel Durchlauf in der Gegenrichtung und oder einen direkten Zugriff mit potentiell logarithmischem Laufzeitverhalten erzielt durch das Prinzip Teile und herrsche das auf der Fernwirkung des Transitivitatsgesetzes beruht bei einem gleichen oder nur unwesentlich hoheren Speicherbedarf Inhaltsverzeichnis 1 Motivation 2 Terminologie 2 1 Unterschiedliche Sprechweisen 2 2 Knotenorientierte und blattorientierte Speicherung 3 Begriffsklarung 4 Ordnungsrelation 5 Suchen 5 1 Suchen ohne Duplikate rekursiv 5 2 Suchen ohne Duplikate iterativ und mit Sentinel 5 3 Suchen wenn Duplikate zulassig 5 4 Komplexitat 5 5 Suchtiefen und Pfadlangensummen 6 Traversierung 6 1 Traversierung Einzelschritt 6 2 Proximitats Suche 7 Einfugen 8 Loschen 9 Implementierung 9 1 Kopf 9 2 Iterative Programmierung 9 3 Trennung der navigierenden von den modifizierenden Operationen 9 4 Cursor 9 5 Mehrere Zugriffspfade 10 Anwendungen 11 Effiziente Massen und Mengenoperationen aufbauend auf der JOIN Operation 12 Auswahlkriterien 13 Historisches 14 Siehe auch 15 Literatur 16 Weblinks 17 Einzelnachweise und AnmerkungenMotivation BearbeitenSuchbaume sind Losungen des sogenannten Worterbuchproblems Angenommen ist eine grosse Anzahl von Schlusseln denen jeweils ein Wert beigegeben ist In einem Worterbuch deutsch englisch ist das deutsche Wort der Schlussel und englische Worter sind der gesuchte Wert Ahnlich verhalt es sich bei einem Telefonbuch mit Namen und Adresse als Schlussel und der Telefonnummer als dem gesuchten Wert Mathematisch gesehen realisiert ein Worterbuch eine endliche Funktion mit Paaren Schlussel Wert Bei der Suche wird ein Suchbegriff Argument der Funktion mit einem der Schlussel zur Deckung gebracht Hat dies Erfolg wird dem Suchbegriff der beigegebene Wert als Funktionswert zugeordnet 1 In beiden Beispielen sind ublicherweise die Schlussel sortiert Das ist sehr zweckmassig denn es erlaubt das Buch in der Mitte aufzuschlagen und zu uberprufen ob der Suchbegriff gefunden ist Ist er nicht gefunden und liegt er beispielsweise alphabetisch vor dem Buchstaben K weiss man zusatzlich dass man nicht weiter hinten mit L M oder Z vergleichen muss Der zur Untersuchung ubrig bleibende Teil ist immer ein zusammenhangendes Segment welches wie das ganze Buch am Anfang wieder halbiert wird und so weiter bis zum Fund oder bis festzustellen ist dass der Suchbegriff nicht vorkommt Diese Vorgehensweise hat in der Informatik den Namen binares Suchen Sie wird auf naheliegende Weise durch das sehr bekannte Suchverfahren binare Suche im Array nachgebildet Ihr Verhalten ist informationstheoretisch optimal namlich logarithmisch genauer Bei n displaystyle n nbsp Schlusseln benotigt man maximal log 2 n 1 displaystyle lceil log 2 n 1 rceil nbsp Abrundungsfunktion und Aufrundungsfunktion Vergleiche Anders als beim binaren Suchen muss beim sequentiellen Suchen der Suchbegriff potentiell mit allen Schlusseln verglichen werden Dafur braucht allerdings die Eingabe nicht sortiert zu sein Der Unterschied zwischen den beiden Verfahren kann erheblich sein In einem Telefonbuch mit n 2 20 1 1 048 575 displaystyle n 2 20 1 1 048 575 nbsp Eintragen mussen beim sequentiellen Suchen im Mittel n 1 2 524 288 displaystyle n 1 2 524 288 nbsp Vergleiche durchgefuhrt werden Beim binaren Suchen gelangt man nach maximal log 2 2 20 1 1 20 displaystyle log 2 2 20 1 1 20 nbsp Vergleichen zum selben Ergebnis Anderungen Zugange und Abgange bei Worter und Telefonbuchern konnen sporadisch bei Softwaresystemen mussen sie in der Regel unmittelbar reflektiert werden Zugange und Abgange erfordern in einem Array Datentransporte deren Aufwand proportional zur Lange des Arrays also linear in n displaystyle n nbsp ist Ein solcher Aufwand macht die Effizienz des binaren Suchens vollig zunichte Die Vorgehensweise beim binaren Suchen lasst sich auch mit einem Binarbaum nachbilden Der erste Schlussel mit dem der Suchbegriff zu vergleichen ist wird in die Wurzel des Binarbaums platziert Der beim Vergleichsergebnis kleiner aufzusuchende nachste Schlussel wird in den linken Kindknoten platziert und entsprechend der Schlussel fur grosser in den rechten Kindknoten So fahrt man fort bis alle Schlussel im Binarbaum untergebracht sind Dadurch wird der Binarbaum zu einem binaren Suchbaum Durch das Herauslosen der einzelnen Elemente aus dem Array wird grosse Flexibilitat gewonnen Der Aufwand beim Einfugen fur das Zuweisen von Speicherplatz und Beschicken der Felder mit Werten sowie beim Loschen fur die Ruckgabe des Speicherplatzes ist unabhangig von der Anzahl n displaystyle n nbsp der Elemente Verloren geht beim Binarbaum allerdings ein Mass fur die Balance das beim Array durch das Bilden des Mittelwerts zwischen zwei Indizes gegeben ist Daruber hinaus kann ein Binarbaum der einmal hervorragend balanciert war durch Einfugungen und Loschungen seine Balance verlieren und im Extremfall wenn namlich jeder Knoten nur noch einen Kindknoten hat statt zwei zu einer linearen Liste degenerieren mit dem Ergebnis dass eine Suche einer sequentiellen Suche gleichkommt Die Informatiker haben verschiedene Balance Kriterien fur Binarbaume entwickelt Bei den meisten sind die Aufwande fur das Suchen Einfugen und Loschen logarithmisch wenn auch mit unterschiedlichen konstanten Faktoren Einige Losungsprinzipien zur Problematik der Entartung bei dynamischen Binarbaumen finden sich im Hauptartikel Balancierter Baum nbsp Abb 1A Binarer Suchbaum der Hohe 5 mit Wurzel H displaystyle mathsf H nbsp und 13 Knoten die Schlussel tragen nbsp Abb 1B Derselbe binare Suchbaum derselben Hohe 5 in anderer Sichtweise Wurzel H displaystyle mathsf H nbsp 13 innere Knoten grun und blau und 14 aussere Knoten rot die inneren mit den Schlusseln der Abb 1ATerminologie BearbeitenDie Begriffe Knoten und Kante letztere definitionsgemass als gerichtete Kante oder auch Bogen und Pfeil werden von den allgemeinen Graphen ubernommen Wenn die Gerichtetheit aus dem Kontext klar genug hervorgeht genugt Kante Bei gerichteten Graphen kann man einem Knoten sowohl Ausgangsgrad wie Eingangsgrad zuordnen Ublicherweise werden Binarbaume als Out Trees aufgefasst In einem solchen gewurzelten Baum gibt es genau einen Knoten der den Eingangsgrad 0 hat Er wird als die Wurzel bezeichnet Alle anderen Knoten haben den Eingangsgrad 1 Der Ausgangsgrad ist die Anzahl der Kindknoten und ist beim Binarbaum auf maximal 2 beschrankt Damit ist seine Ordnung als Out Tree 2 Knoten mit Ausgangsgrad 1 bezeichnet man als interne innere Knoten solche mit Ausgangsgrad 0 als Blatter oder externe aussere Knoten Bei Binarbaumen und nur dort findet sich gelegentlich die Bezeichnung Halbblatt fur einen Knoten mit Ausgangsgrad 1 englisch manchmal non branching node Dann ist ein Blatt ein doppeltes Halbblatt Unterschiedliche Sprechweisen Bearbeiten Den Knoten des Binarbaums in der Abb 1A sind Schlussel in Gestalt von Grossbuchstaben zugeordnet Da bei der in order Traversierung deren alphabetische Sortierordnung befolgt wird ist der Baum ein binarer Suchbaum In der Abb 1B ist die identische Schlusselmenge in einem anderen binaren Suchbaum dargestellt einem Suchbaum der explizite NIL Knoten enthalt Hier tragen nur die internen Knoten Schlussel wogegen die externen die NIL Knoten auch externe Blatter genannt als Platzhalter fur die Intervalle zwischen den Schlusseln so beispielsweise in der Abb 3 also als Einfugepunkte des binaren Suchbaums fungieren Der Knoten mit dem Schlussel A displaystyle mathsf A nbsp ist hier ein internes Blatt Knoten mit Ausgangsgrad 1 gibt es nicht Der schlussellose Suchbaum besteht aus genau einem Knoten der extern und Wurzel zugleich ist Da bei dieser Sichtweise die Hohe des total leeren Baums der kein Suchbaum ist zu 1 definiert ist somit dem schlussellosen Baum die Hohe 0 zukommt stimmen die Hohenbegriffe uberein wenn in der Sichtweise der Abb 1A dem leeren und zugleich schlussellosen Baum die Hohe 0 und einem Baum der nur aus einem Knoten besteht die Hohe 1 zugeteilt wird 2 Knotenorientierte und blattorientierte Speicherung Bearbeiten Wenn wie oben und in der Abb 1A die Inhalte der Menge in den Knoten abgespeichert werden und die externen Knoten leer sind nennt man die Art der Speicherung knotenorientiert Um auszudrucken dass sie nicht zur Menge gehoren bezeichnet man in diesem Fall die externen Knoten zur besseren Unterscheidung als externe Blatter Ein externes Blatt stellt einen Einfugepunkt dar Bei der blattorientierten Speicherung sind die Inhalte der Menge in den Blattern abgespeichert und die Knoten stellen nur Hinweisschilder fur die Navigation dar die moglicherweise mit den Schlusseln der Menge wenig zu tun haben 3 Begriffsklarung BearbeitenZur Beachtung Der Begriff Nachbar und Nachbarschaft etc wird in diesem Artikel und bei den Suchbaumen generell anders als sonst in der Graphentheorie verwendet namlich ausschliesslich im Sinn der eingepragten Ordnungsrelation rechter Nachbar meint den nachsten Knoten in aufsteigender Richtung linker in absteigender Muss in diesem Artikel auf die Hierarchiestruktur des Baumes eingegangen werden so werden Begriffe wie Elter oder Vorfahr bzw Kind oder Nachfahr verwendet Die hierarchische Anordnung der Knoten in der Baumstruktur des binaren Suchbaums wird als sekundar und mehr oder minder zufallig angesehen ganz im Vordergrund steht die korrekte Darstellung der Reihenfolge Ahnlich sekundar ist die Frage welcher Knoten gerade die Rolle der Wurzel spielt insbesondere wenn es sich um einen selbst balancierenden Baum handelt Insofern eignet die Adresse der Wurzel sich nicht zur Identifizierung des Baumes Dagegen kann die feste Adresse eines Zeigers zur Wurzel als Identifikation des Baumes genommen werden dessen Zeigerwert dann aber auch von den Operationen des Baums zu pflegen ist Ordnungsrelation BearbeitenDamit binares Suchen Sortieren etc funktionieren kann muss die Ordnungsrelation eine totale Quasiordnung im Englischen total preorder sein Die Bezeichnungen fur die induzierte Duplikatrelation displaystyle sim nbsp und die induzierte strenge Halbordnung lt displaystyle lt nbsp seien wie dort Die Trichotomie einer entsprechenden 3 Wege Vergleichsfunktion compare displaystyle operatorname compare nbsp 4 von ihrem Ergebnis ist nur das Vorzeichen sgn displaystyle operatorname sgn nbsp relevant ergibt sich folgendermassen sgn compare x y displaystyle operatorname sgn operatorname compare x y begin cases end cases nbsp 1 displaystyle 1 nbsp falls x lt y displaystyle x lt y nbsp x displaystyle x nbsp kleiner als y displaystyle y nbsp 0 displaystyle 0 nbsp falls x y displaystyle x sim y nbsp x displaystyle x nbsp Duplikat von y displaystyle y nbsp 1 displaystyle 1 nbsp falls y lt x displaystyle y lt x nbsp x displaystyle x nbsp grosser als y displaystyle y nbsp Nach Vertauschung von x displaystyle x nbsp und y displaystyle y nbsp und einer Umordnung erkennt man dass x y sgn compare y x sgn compare x y displaystyle forall x y operatorname sgn operatorname compare y x operatorname sgn operatorname compare x y nbsp Die induzierte Ordnungsrelation lt displaystyle lt nbsp ist eine strenge schwache Ordnung im Englischen strict weak ordering Sie induziert auf den Aquivalenzklassen dieser Relation genauer den Aquivalenzklassen der Duplikatrelation eine strenge Totalordnung Offensichtlich lasst sich jede solche Ordnung spiegeln d h 1 displaystyle 1 nbsp mit 1 displaystyle 1 nbsp vertauschen das Ergebnis ist wieder eine strenge schwache Ordnung Nachbarschaftsbeziehungen bleiben bestehen es wird nur grosser mit kleiner bzw rechts mit links vertauscht Anmerkungen Zum reinen Aufsuchen genugt im Grunde eine 2 Wege Vergleichsfunktion die angibt ob zwei Schlussel gleich sind oder nicht Mit einer solchen Vergleichsfunktion sind aber effiziente zum Beispiel im Mittel logarithmische Suchzeiten nicht erreichbar Fur das Funktionieren des Sortierens und binaren Suchens ist es unerheblich ob das Aufspalten des Ungleich Weges einer 2 Wege Vergleichsfunktion in einen Kleiner und einen Grosser Weg ein Artefakt ist wie zum Beispiel die Anordnung der Buchstaben in einem Alphabet oder ob eine Naher Ferner oder logische Beziehung mit im Spiel ist Spiegelt die Ordnungsrelation auch Nachbarschaft wider kann diese fur ein effizientes unscharfes Suchen ausgenutzt werden Die knotenorientierte Speicherung passt exakt zur Suche mit der 3 Wege Vergleichsfunktion Wie im folgenden Abschnitt Suchen naher ausgefuhrt ist die Behandlung von Duplikaten unabhangig davon ob die Ordnungsrelation Duplikate zulasst totale Quasiordnung bzw strenge schwache Ordnung oder nicht Totalordnung bzw strenge Totalordnung Einerseits kann es unerwunscht sein auch wenn sie Duplikate zulasst diese im Baum zu haben Andererseits kann es durchaus angebracht sein auch bei einer Totalordnung Duplikate in den Baum aufzunehmen zum Beispiel aus dem Eingabestrom Es kommt in der praktischen Anwendung also nur darauf an ob es im Baum Duplikate geben soll oder nicht Konsequenterweise wird hier von vornherein von totalen Quasiordnungen ausgegangen Suchen BearbeitenDie Suche nach einem Eintrag verlauft derart dass der Suchschlussel zunachst mit dem Schlussel der Wurzel verglichen wird Sind beide gleich so ist der Eintrag oder ein Duplikat gefunden Andernfalls bei ungleich wird uberpruft ob der Suchschlussel kleiner grosser ist als der Schlussel im Knoten dann wird die Suche rekursiv im linken rechten Teilbaum der Wurzel fortgefuhrt gibt es keinen linken rechten Teilbaum so existiert der gesuchte Eintrag im binaren Suchbaum nicht Der auf diese Weise erhaltene finale ungleich Knoten stellt zusammen mit der letzten Vergleichsrichtung den sog Einfugepunkt fur das gesuchte Element dar In der Sichtweise der Abb 1B genugt der externe Knoten der die Richtung mitenthalt Wird es hier eingefugt dann stimmt die in order mit der Sortier Reihenfolge uberein Der finale ungleich Knoten hat einen Schlussel der entweder der kleinste unter den grosseren ist oder der grosste unter den kleineren Dasselbe gilt spiegelbildlich fur seinen Nachbarknoten in der letzten Vergleichsrichtung sofern es einen solchen gibt Allerdings ist dieser kein Einfugepunkt sondern ein Vorfahr desselben Suchen ohne Duplikate rekursiv Bearbeiten Der folgende Pseudocode Find illustriert die Arbeitsweise des Algorithmus fur eine Suche bei der in keinem Fall Duplikate in den Baum aufgenommen werden sollen Das ist letztlich unabhangig davon ob die Ordnungsrelation Duplikate zulasst oder nicht Die Funktion gibt einen Knoten und ein Vergleichsergebnis zuruck Dieses Paar stellt ausser beim Vergleichsergebnis Equal einen Einfugepunkt dar Find t s t binarerSuchbaum s Suchschlussel return Find0 t s t root Empty zuruck kommt ein Knoten und ein Vergleichsergebnis Find0 t s x d t Teilbaum s Suchschlussel x Knoten d Vergleichsergebnis Equal LessThan GreaterThan oder Empty if x null then if s x key then return x Equal Suchschlussel s gefunden if s lt x key then return Find0 x s x left LessThan else return Find0 x s x right GreaterThan return t d Suchschlussel s nicht gefunden zuruck kommt Knoten Vergleichsergebnis oder Baum Empty Bei dem in der Abb 2 gewahlten Beispiel wurde Find beim Suchschlussel s F displaystyle mathsf F nbsp den ersten Treffer das obere F displaystyle mathsf F nbsp als Ergebnis zuruckgeben Suchen ohne Duplikate iterativ und mit Sentinel Bearbeiten Die folgende Funktion FindWithSentinel hat genau dieselbe Funktionalitat wie das obenstehende Find Der Trick mit dem Wachterknoten oder Sentinel erspart pro Iterationsschritt eine Abfrage und zwar die auf Abwesenheit des Kindknotens 5 6 also h displaystyle leq h nbsp Hohe Abfragen Sie wird hier iterativ programmiert in der Programmiersprache C vorgestellt Bemerkung Da beim Ergebnis gefunden der Knoten beim Ergebnis nicht gefunden aber der letzte Elterknoten gebraucht wird kommen in der heissen Schleife zwei Variable alternierend zum Einsatz typedef struct NODE Knoten des binaren Suchbaums Node lChild gt linker Kindknoten Node rChild gt rechter Kindknoten int key Schlussel Node typedef struct RESULT Ergebnisstruktur mit zwei Feldern Node resNod gt Ergebnisknoten int resDir Vergleichsergebnis Equal LessThan GreaterThan oder Empty Result typedef struct BinarySearchTree Der binare Suchbaum Node root gt Wurzel des Baums Bst Bst bst Node Sentinel sentinel amp Sentinel Der Wachterknoten und sein Zeiger Sentinel lChild sentinel Sentinel rChild sentinel Initialisierung des leeren binaren Suchbaums bst root sentinel Indikator dass die Wurzel root fehlt Dieser Zeiger ist auch von den Einfuge oder Loschfunktionen an den Stellen zu verwenden wo es einen Kindknoten nicht gibt int FindWithSentinel Bst t gt binarer Suchbaum int sKey der Suchschlussel Result r gt Ergebnisstruktur Node x y sentinel gt key sKey prapariere den Wachterknoten Sentinel y Node t Elter der Wurzel Suchschleife for x t gt root sKey x gt key if sKey lt x gt key y x gt lChild ein echter oder der Wachter Knoten else y x gt rChild dito if sKey y gt key Schlusselgleichheit r gt resNod y Ergebnisknoten goto Epilog if sKey lt y gt key x y gt lChild dito else x y gt rChild dito Abbruch Bedingung Schlusselgleichheit sKey x gt key r gt resNod x x y Elterknoten von r gt resNod Epilog if r gt resNod sentinel Der Ergebnisknoten r gt resNod ist echt und zeigt auf einen Schlussel mit Wert sKey r gt resDir Equal else Der Ergebnisknoten r gt resNod ist unecht x ist der Elter von r gt resNod r gt resNod x gt Ergebnisknoten gt Node oder gt Bst if x Node t x ist ein echter Knoten gt Node if sKey lt x gt key r gt resDir LessThan else r gt resDir GreaterThan else x ist der Baum gt Bst r gt resDir Empty return r gt resDir r enthalt gt Node Vergleichsergebnis oder gt Bst Empty Suchen wenn Duplikate zulassig Bearbeiten Sollen Eintrage von Duplikaten in den Baum zugelassen sein ist es vorteilhaft die Suche nicht beim ersten besten gefundenen Knoten abzubrechen sondern entweder auf der kleineren oder auf der grosseren Seite bis zu den Blattern weiter zu suchen Dies unterstutzt eine gezielte Einfugung von Duplikaten und ist insbesondere dann interessant wenn im Suchbaum nicht nur gesucht und gefunden werden soll sondern u U auch traversiert wird Der Einsatz der nachfolgenden Suchfunktionen beim Sortierverfahren Binary Tree Sort macht dieses Verfahren zu einem stabilen s Stabilitat Sortierverfahren mit erklarenden Beispielen Beim folgenden Pseudocode FindDupGE gibt der Benutzer die Richtung rechts vor auf welcher Seite der Duplikate ein ggf neues eingefugt werden soll Bei einer Funktion FindDupLE mit dem gespiegelten Vergleich b if b s x key wurde ein neues Duplikat links von allen vorhandenen Duplikaten eingefugt werden FindDupGE t s c t binarerSuchbaum s Suchschlussel FindDupGE falls s ein Duplikat ist soll es rechts GE eingefugt werden c Cursor Dieser Cursor enthalt am Ende c d Richtung 1 Left Right oder Empty c n Knoten 2 Knoten oder Baum nur bei Empty c n t Fur den leeren Baum return FindDupGE0 t root s c Empty zuruck kommt ein Einfugepunkt im Cursor c FindDupGE0 x s c d x Knoten s Suchschlussel c Cursor d Richtung if x null then c n x if s x key Suchschlussel s Knoten Schlussel then return FindDupGE0 x right s c Right GE else return FindDupGE0 x left s c Left lt c d d Setzen Einfuge Richtung return c zuruck kommt ein Einfugepunkt im Cursor c nbsp Abb 2 Einfugepunkt rechts vom rechtesten Duplikat von F displaystyle mathsf F nbsp Das Paar Knoten Richtung des vorigen Beispiels Find ist hier zu dem einen Objekt genannt Cursor zusammengefasst Es ist ein reiner Ausgabeparameter der den Einfugepunkt spezifiziert FindDupGE ist so gehalten dass im Ergebnis Cursor immer ein unmittelbarer Einfugepunkt geliefert wird Aus dem Ergebnis ist aber nicht ohne Weiteres erkennbar ob es sich um ein Duplikat handelt da der Einfugepunkt nicht den gesuchten Schlussel haben muss selbst wenn dieser im Baum vorkommt Dies hangt von der mehr oder minder zufalligen Anordnung der Knoten im Baum ab Ist namlich das rechteste Duplikat im Beispiel der Abb 2 das untere rechte F displaystyle mathsf F nbsp kein Halbblatt nach rechts dann ist es in der Hierarchie des Binarbaums ein Vorfahr seines rechten Nachbarn im Beispiel G displaystyle mathsf G nbsp der nun ein Halbblatt nach links ist und zusammen mit der Richtung links denselben Einfugepunkt spezifiziert und also in diesem Fall das Resultat von FindDupGE darstellt Wahrend bei Find alle 3 Wege der Vergleichsfunktion abgefragt werden begnugt sich FindDupGE mit der Abfrage von deren 2 7 Der nachfolgende Pseudocode FindDup kombiniert die Fahigkeiten von Find und FindDupGE indem er sowohl ein Ergebnis uber das Vorhandensein eines Suchschlussels als auch einen Einfugepunkt fur Duplikate liefert Hierzu gibt der Benutzer eine Richtung d links oder rechts vor auf welcher Seite der Duplikate ein ggf neues eingefugt werden soll Als Ergebnis kommt ein Paar Knoten Cursor zuruck wobei Knoten angibt ob und wo der Suchschlussel gefunden wurde Der Vorschlag baut beispielhaft ein Objekt auf das in Analogie zum Beispiel zu den Datenbanken Cursor genannt wird Der Cursor enthalt den ganzen Pfad vom Ergebnisknoten bis zur Wurzel Damit passt er zur nachfolgenden in order Traversierfunktion Next eine Version die ohne Zeiger zum Elterknoten auskommt Die passende Datenstruktur fur den Pfad ist der Stapelspeicher engl Stack mit den Operationen push und pop Der etwas einfacheren Version der Funktion bei der ein Zeiger zum Elter in jedem Knoten vorausgesetzt wird und deshalb der Cursor ohne Stack auskommt entfallen die push und clear Aufrufe Der Speicherbedarf fur den Baum erhoht sich allerdings um einen Zeiger pro Knoten FindDup t s c d t binarerSuchbaum s Suchschlussel c Cursor Dieser Cursor enthalt am Ende c d Richtung 1 Left Right oder Empty c n Knoten 2 Knoten oder Baum nur bei Empty Die folgenden 2 nur wenn die Elterknoten fehlen c t Baum 3 Baum enthalt den Zeiger zur Wurzel c p Pfad 4 Pfad vom Elter des Knotens zur Wurzel d Richtung Falls s ein Duplikat ist soll es c d d auf dieser Seite eingefugt werden c t t initialisiere den Cursor clear c p initialisiere den Stack c n t fur den leeren Baum return FindDup0 t root s c Empty zuruck kommt ein Knoten und ein Einfugepunkt im Cursor c FindDup0 x s c d x Knoten s Suchschlussel c Cursor d Richtung if x null then push c p c n Elter c n von x in den Stack c n x setze neuen Knoten im Cursor if s x key then return FindDup1 x s c c d if s lt x key then return FindDup0 x left s c Left else return FindDup0 x right s c Right c d d Setzen Einfuge Richtung return null c Suchschlussel s nicht gefunden zuruck kommt null und ein Einfugepunkt im Cursor c FindDup1 q s c d q Knoten letzter Knoten mit Equal s Suchschlussel c Cursor d Richtung x Knoten x c n child d if x null then push c p c n Elter c n von x in den Stack c n x setze neuen Knoten im Cursor if s x key then return FindDup1 x s c c d x ist neuer Knoten mit Equal else return FindDup1 q s c 1 c d bei weiter in der Gegen Richtung c d d Setzen Einfuge Richtung return q c zuruck kommt ein Duplikat und ein Einfugepunkt im Cursor c FindDup ist so gehalten dass im Ergebnis Cursor immer ein unmittelbarer Einfugepunkt geliefert wird Wenn der Suchschlussel nicht gefunden wurde wird im Feld Knoten der Nullzeiger zuruckgegeben Wenn der Suchschlussel gefunden wurde gibt FindDup das linkeste oder rechteste Duplikat im Beispiel der Abb 2 das rechteste Duplikat F displaystyle mathsf F nbsp als gefundenen Knoten zuruck Der Einfugepunkt kann mit dem gefundenen Knoten zusammenfallen er kann aber auch sein unmittelbarer im Beispiel der Abb rechter Nachbar sein in welchem Fall er einen anderen Schlussel im Beispiel G displaystyle mathsf G nbsp hat Im ersten Teil FindDup0 werden alle 3 Wege der Vergleichsfunktion abgefragt im zweiten Teil FindDup1 wenn das Vorhandensein des Suchschlussels positiv geklart ist nur noch deren 2 Komplexitat Bearbeiten Da die Suchoperation entlang eines Weges von der Wurzel zu einem Blatt verlauft hangt die aufgewendete Zeit im Mittel und im schlechtesten Fall linear von der Hohe h displaystyle h nbsp des Suchbaums ab Komplexitat O h displaystyle mathcal O h nbsp im asymptotisch vernachlassigbaren besten Fall ist die Laufzeit bei Find konstant bei FindDupGE und FindDup jedoch immer O h displaystyle mathcal O h nbsp Die Hohe h displaystyle h nbsp ist im entarteten Fall so gross wie die Anzahl der vorhanden Elemente n displaystyle n nbsp Beim Aufbau eines Baumes was einem Sortierlauf entspricht muss im Extremfall jedes Element mit jedem verglichen werden ergibt in summa n 2 O n 2 displaystyle tbinom n 2 in mathcal O left n 2 right nbsp Vergleiche Gewichtsbalancierte Suchbaume konnen im Mittel auf konstante Laufzeit kommen verhalten sich jedoch linear im schlechtesten Fall Hohen balancierte Suchbaume haben eine Hohe von O log n displaystyle mathcal O log n nbsp und ermoglichen so die Suche in garantiert logarithmischer Laufzeit Der Aufbau eines Baumes kommt dann auf O n log n displaystyle mathcal O n log n nbsp Vergleiche das entspricht den besten Sortieralgorithmen Logarithmische Hohe gilt sogar im Durchschnitt fur zufallig erzeugte Suchbaume wenn die folgenden Bedingungen erfullt sind Alle Permutationen der einzufugenden und zu loschenden Elemente sind gleich wahrscheinlich Bei Modifikationen des Baumes wird auf asymmetrische Loschoperation verzichtet d h die Abstiege bei den Loschungen nach links und die nach rechts halten sich im Mittel die Waage Suchtiefen und Pfadlangensummen Bearbeiten nbsp Abb 3 Optimaler binarer Suchbaum mit Gewichten rot Sei X x 1 lt x 2 lt lt x n displaystyle X left x 1 lt x 2 lt lt x n right nbsp eine Schlusselmenge aus einem total geordneten Reservoir R displaystyle R nbsp von Schlusseln seien ferner p i displaystyle p i nbsp bzw q j displaystyle q j nbsp Haufigkeiten mit denen auf das Element x R displaystyle x in R nbsp zugegriffen wird wobei x x i displaystyle x x i nbsp fur 1 i n displaystyle 1 leqq i leqq n nbsp resp x j lt x lt x j 1 displaystyle x j lt x lt x j 1 nbsp fur 0 j n displaystyle 0 leqq j leqq n nbsp Dabei seien x 0 displaystyle x 0 infty nbsp und x n 1 displaystyle x n 1 infty nbsp zusatzliche nicht zu R displaystyle R nbsp gehorende Elemente mit der ublichen Bedeutung Das 2 n 1 displaystyle 2n 1 nbsp Tupel z p 1 p 2 p n q 0 q 1 q 2 q n displaystyle mathfrak z left begin smallmatrix amp p 1 amp amp p 2 amp amp cdots amp amp p n amp q 0 amp amp q 1 amp amp q 2 amp amp cdots amp amp q n end smallmatrix right nbsp heisst Zugriffsverteilung 8 fur die Menge X displaystyle X nbsp wenn alle p i q j 0 displaystyle p i q j geqq 0 nbsp sind z displaystyle mathfrak z nbsp wird zur Zugriffswahrscheinlichkeitsverteilung wenn p i q j 1 displaystyle textstyle sum p i sum q j 1 nbsp ist Sei nun T displaystyle T nbsp ein Suchbaum fur die Menge X displaystyle X nbsp mit einer Zugriffsverteilung z displaystyle mathfrak z nbsp ferner sei a i T displaystyle a i T nbsp die Tiefe des inneren Knotens x i displaystyle x i nbsp und b j T displaystyle b j T nbsp die Tiefe des externen Blattes x j x j 1 displaystyle x j x j 1 nbsp s Abb 3 jeweils Terminologie der Abb 1B Wir betrachten die Suche nach einem Element x R displaystyle x in R nbsp Wenn x x i displaystyle x x i nbsp dann vergleichen wir x displaystyle x nbsp mit a i T 1 displaystyle a i T 1 nbsp Elementen im Baum Wenn x j lt x lt x j 1 displaystyle x j lt x lt x j 1 nbsp dann vergleichen wir x displaystyle x nbsp mit b j T displaystyle b j T nbsp Elementen im Baum Also ist S z T i 1 n p i a i T 1 j 0 n q j b j T displaystyle S mathfrak z T sum i 1 n p i a i T 1 sum j 0 n q j b j T nbsp die mit der Zugriffsverteilung z displaystyle mathfrak z nbsp gewichtete Pfadlangensumme des Baumes T displaystyle T nbsp ist z displaystyle mathfrak z nbsp eine Wahrscheinlichkeitsverteilung dann ist S z T displaystyle S mathfrak z T nbsp die gewichtete Pfadlange die gewichtete Suchtiefe oder die mittlere Anzahl der benotigten Vergleiche Die Abb 3 zeigt einen Suchbaum T displaystyle T nbsp der mit einem Wert von S z T 2 displaystyle S mathfrak z T 2 nbsp optimal fur die Zugriffsverteilung z 1 24 1 3 3 0 4 0 0 3 10 displaystyle mathfrak z tfrac 1 24 left begin smallmatrix amp 1 amp amp 3 amp amp 3 amp amp 0 amp 4 amp amp 0 amp amp 0 amp amp 3 amp amp 10 end smallmatrix right nbsp ist Sind alle p i 1 displaystyle p i 1 nbsp und alle q j 0 displaystyle q j 0 nbsp dann ist S e T displaystyle S mathfrak e T nbsp mit e 1 1 1 0 0 0 0 displaystyle mathfrak e left begin smallmatrix amp 1 amp amp 1 amp amp cdots amp amp 1 amp 0 amp amp 0 amp amp 0 amp amp cdots amp amp 0 end smallmatrix right nbsp die Summe der erforderlichen Vergleiche wenn ein jeder der n displaystyle n nbsp Knoten gesucht wird e displaystyle mathfrak e nbsp fur erfolgreiche Suche Sie steht zur so genannten internen Pfadlange I displaystyle I nbsp 9 in der Beziehung I i 1 n a i T S e T n displaystyle I sum i 1 n a i T S mathfrak e T n nbsp Fur alle binaren Suchbaume T displaystyle T nbsp ist S e n S e T n n 1 2 displaystyle underline S mathfrak e n leq S mathfrak e T leq n n 1 2 nbsp wobei die obere Grenze von der linearen Kette kommt und die untere S e n displaystyle underline S mathfrak e n nbsp von den vollstandig balancierten Binarbaumen Die Funktion S e n displaystyle underline S mathfrak e n nbsp ist stuckweise linear streng monoton steigend und konvex nach unten in Formeln Ist k N displaystyle k in mathbb N nbsp mit 2 k 1 n 1 2 k displaystyle 2 k 1 leq n 1 leq 2 k nbsp dann ist S e n 1 n 1 k 2 k displaystyle underline S mathfrak e n 1 n 1 k 2 k nbsp Ubrigens ist S e n A 001855 n 1 displaystyle underline S mathfrak e n A001855 n 1 nbsp mit der Folge A001855 in OEIS Sind dagegen alle p i 0 displaystyle p i 0 nbsp und alle q j 1 displaystyle q j 1 nbsp dann ist S f T displaystyle S mathfrak f T nbsp mit f 0 0 0 1 1 1 1 displaystyle mathfrak f left begin smallmatrix amp 0 amp amp 0 amp amp cdots amp amp 0 amp 1 amp amp 1 amp amp 1 amp amp cdots amp amp 1 end smallmatrix right nbsp die Summe der notwendigen Vergleiche um alle n 1 displaystyle n 1 nbsp Blatter aufzusuchen f displaystyle mathfrak f nbsp fur fehlend S f T displaystyle S mathfrak f T nbsp wird auch als externe Pfadlange E displaystyle E nbsp 10 bezeichnet E j 0 n b j T S f T displaystyle E sum j 0 n b j T S mathfrak f T nbsp Es gilt fur alle Baume T displaystyle T nbsp S f T S e T n displaystyle S mathfrak f T S mathfrak e T n nbsp 11 BeweisDie Behauptung ist richtig fur n 1 displaystyle n 1 nbsp Sei T displaystyle T nbsp ein Baum mit n displaystyle n nbsp Knoten Bei einem Knoten auf der Hohe h displaystyle h nbsp fugen wir eine neue Kante und einen neuen Knoten hinzu S e T displaystyle S mathfrak e T nbsp erhoht sich um h 1 displaystyle h 1 nbsp und S f T displaystyle S mathfrak f T nbsp um 2 h 1 h h 2 displaystyle 2 h 1 h h 2 nbsp also wachst die Differenz S f T S e T displaystyle S mathfrak f T S mathfrak e T nbsp um h 2 h 1 1 displaystyle h 2 h 1 1 nbsp Die vollstandig balancierten Binarbaume sind auch fur die Zugriffsverteilung f displaystyle mathfrak f nbsp optimal und es gilt fur alle binaren Suchbaume T displaystyle T nbsp S f n S f T n n 3 2 displaystyle underline S mathfrak f n leq S mathfrak f T leq n n 3 2 nbsp mit S f n S e n n displaystyle underline S mathfrak f n underline S mathfrak e n n nbsp Ubrigens ist S f n A 003314 n 1 displaystyle underline S mathfrak f n A003314 n 1 nbsp mit der Folge A003314 in OEIS und n 1 displaystyle n 1 nbsp ist die Anzahl der externen Knoten Blatter Traversierung BearbeitenTraversierung Querung bezeichnet das systematische Erforschen der Knoten des Baumes in einer bestimmten Reihenfolge Es gibt verschiedene Moglichkeiten die Knoten von Binarbaumen zu durchlaufen Beim binaren Suchbaum sind jedoch die sog in order oder reverse in order Traversierungen die eindeutig bevorzugten da sie die eingepragte Ordnungsrelation wiedergeben In der Literatur finden sich fast ausschliesslich rekursive Implementierungen die nur uber den ganzen Baum laufen Beispiele in Binarbaum Rekursive Implementierungen Die Aktionen die an den einzelnen Knoten auszufuhren sind sind dann in einer sog Ruckruffunktion dort callback zu programmieren Eine Einzel Traversierung wie im nachstehenden Abschnitt vorgeschlagen ist in der Praxis wesentlich flexibler einsetzbar Traversierung Einzelschritt Bearbeiten Der folgende Pseudocode Next gibt ausgehend von einem Knoten das nachste Element in ab oder aufsteigender Reihenfolge zuruck eine iterative Implementierung Der Vorschlag kommt ohne Zeiger zum Elterknoten aus Dafur muss das Eingabeobjekt hier Cursor genannt den ganzen Pfad vom aktuellen Knoten bis zur Wurzel enthalten und dieser muss von der Next Funktion auch entsprechend gepflegt werden wenn Next in einer Schleife verwendet wird Die passende Datenstruktur fur den Pfad ist der Stapelspeicher engl Stack mit den Operationen push und pop Die etwas einfachere Version der Funktion bei der ein Zeiger zum Elter in jedem Knoten vorausgesetzt wird und deshalb der Cursor ohne Stack auskommt ist beim Binarbaum aufgefuhrt Der Speicherbedarf fur den Baum erhoht sich allerdings um einen festen Prozentsatz Bei einer langeren Traversierung mehreren Aufrufen von Next wechseln sich Halbblatter und hoherrangige Vorfahren ab Next c c Cursor Dieser Cursor enthalt c d Richtung 1 EndOfTree oder Left Right c n Knoten 2 Baum nur bei EndOfTree oder Knoten c t Baum 3 Baum enthalt den Zeiger zur Wurzel c p Pfad 4 Pfad vom Elter des Knotens zur Wurzel x y Knoten x c n Ausgangsknoten dieses Einzelschritts d c d gewunschte Richtung der Traversierung y x child d if y null then 1 Schritt in die gegebene Richtung push c p x Elter x von y in den Stack d 1 d spiegele Left lt gt Right Abstieg in Richtung Blatter uber Kinder in der gespiegelten Richtung x y child d while x null do push c p y Elter y von x in den Stack y x x y child d c n y Ergebnis das nachste Halbblatt in Richtung c d return c Es ist Halbblatt auf seiner 1 c d Seite Am Anschlag deshalb Aufstieg zur Wurzel uber die Vorfahren in der do c d Linie nur linke oder nur rechte y x x pop c p Elter von y aus dem Stack if x c t then y ist die Wurzel Somit gibt es kein Element mehr in dieser Richtung c n c t Ergebnis der Baum als Elter der Wurzel c d EndOfTree signalisiere das Ende der Traversierung return c until y x child d Es gab beim Aufsteigen einen Richtungswechsel c n x Ergebnis der erste Vorfahr in der gespiegelten Richtung return c Die Traversierung uber den ganzen Baum umfasst pro Kante einen Abstieg und einen Aufstieg der Aufwand bei n displaystyle n nbsp Knoten ist also 2 n 8 n displaystyle 2n in Theta n nbsp Daher ist der Aufwand fur eine Einzel Traversierung im Mittel und amortisiert konstant und im schlechtesten Fall in O h mit h als der Hohe des Baums Ob die Abfrage auf Anwesenheit des Kindknotens als x null oder mit einem Wachterknoten s Abschnitt Suchen ohne Duplikate iterativ und mit Sentinel geschieht macht keinen Unterschied weder funktionell noch laufzeitmassig Da bei der Traversierung immer mit der Adresse x eines Knotens verglichen wird ist durch die Praparation eines Wachterknotens mit einem Wert auch kein Vorteil zu erwarten Proximitats Suche Bearbeiten Jede Suchfunktion lasst sich mit der oben gezeigten Einzelschritt Traversierung zu einer Proximitats Suche engl approximate match kombinieren Das ist eine Suche in der Nahe eines bestimmten Schlussels zum Beispiel auf grosser gleich bzw kleiner gleich Die obigen Suchfunktionen Find FindDupGE und FindDup liefern im ungleich Fall einen Einfugepunkt Dieser enthalt wenn der Baum nicht leer ist ein Element das entweder das kleinste unter den grosseren ist oder das grosste unter den kleineren Im ersteren Fall kann der Wunsch grosser gleich direkt befriedigt werden Im letzteren Fall geht man zum nachsten Element in aufsteigender Reihenfolge wenn es noch eines gibt und gibt dieses zuruck denn es muss ein grosseres sein Die Logik fur die gespiegelte Version liegt auf der Hand Ahnliche Funktionalitat hat die Index Sequential Access Method Ein wichtiger Anwendungsfall ist die Abbildung mehrerer linear sortierter Schlussel auf eine einzige lineare Ordnung mithilfe einer raumfullenden Kurve bspw des Hilbert Index Hier ist moglicherweise die schlechtere Treffsicherheit des so gebildeten Schlussels durch gute Nachbarschaftseigenschaften auszugleichen Einfugen BearbeitenEs sei angenommen dass die Navigation zum Einfugepunkt bereits erledigt ist Einfugepunkt bedeutet einen Knoten und eine Richtung rechts bzw links Ein unmittelbarer Einfugepunkt in einem binaren Baum ist immer ein rechtes bzw linkes Halbblatt d i ein Knoten ohne rechten bzw linken Kindknoten zusammen mit dieser Richtung In der Sichtweise der Abb 1B entspricht dies genau einem externen Knoten deren Adressen sich dann aber alle verschieden sein mussen und die bspw nicht als Sentinel implementiert sein durfen Ein mittelbarer ist der unmittelbare Nachbar in der angegebenen Richtung und spezifiziert zusammen mit der Gegenrichtung dieselbe Stelle im Binarbaum zum echten Einfugen muss aber die Einfugefunktion noch bis zu dem Halbblatt hinabsteigen welches den unmittelbaren Einfugepunkt darstellt Die obigen Funktionen Find FindDupGE und FindDup liefern als Ergebnis einen unmittelbaren Einfugepunkt Find nicht bei Equal Zum Einfugen lasst man den unmittelbaren Einfugepunkt das Kind in der entsprechenden Richtung auf das neue Element zeigen damit ist dieses korrekt entsprechend der totalen Quasiordnung eingefugt Die Komplexitat der Einfugeoperation ohne Suchvorgang ist somit konstant Wird eine Suchoperation hinzugerechnet wie sehr haufig in der Literatur dominiert diese die Komplexitat Nach dem Einfugen ist das neue Element ein Blatt des Suchbaums Durch wiederholtes Einfugen von aufsteigend oder absteigend sortierten Schlusseln kann es dazu kommen dass der Baum zu einer linearen Liste entartet Loschen BearbeitenWie im Abschnitt Loschen des Artikels Binarbaum ausgefuhrt gibt es verschiedene Moglichkeiten einen Knoten aus einem binaren Baum unter Erhaltung der bisherigen in order Reihenfolge zu entfernen Da bei den Suchbaumen diese mit der Suchordnung zusammenfallt bietet sich die folgende von T Hibbard im Jahr 1962 12 vorgeschlagene Vorgehensweise an die besonders geringe Anderungen an den Hohen der Teilbaume sicherstellt Der zu loschende Knoten sei mit D displaystyle mathsf D nbsp bezeichnet Hat D displaystyle mathsf D nbsp zwei Kinder gehe zu Schritt 4 Andernfalls ist D displaystyle mathsf D nbsp ein Blatt oder hat nur ein einziges Kind Dieses sei mit F displaystyle mathsf F nbsp bezeichnet War D displaystyle mathsf D nbsp die Wurzel dann wird F displaystyle mathsf F nbsp zur neuen Wurzel Fertig Andernfalls setze G displaystyle mathsf G nbsp Elter D displaystyle mathsf D nbsp und mache F displaystyle mathsf F nbsp an D displaystyle mathsf D nbsp s Stelle und Kindesrichtung zum Kind von G displaystyle mathsf G nbsp Ist F displaystyle mathsf F nbsp ein Knoten wird G displaystyle mathsf G nbsp zum neuen Elter von F displaystyle mathsf F nbsp Fertig nbsp Abb 4 Loschen eines Knotens D displaystyle mathsf D nbsp mit 2 Kindknoten vermoge des rechten in order Nachfolgers E displaystyle mathsf E nbsp von D displaystyle mathsf D nbsp des linkesten Knotens im rechten Kindbaum Bei unbalancierten Binarbaumen konnen die Knoten B displaystyle mathsf B nbsp und F displaystyle mathsf F nbsp Teilbaume sein Hat D displaystyle mathsf D nbsp zwei Kinder navigiere im rechten Kindbaum von D displaystyle mathsf D nbsp zum linkesten Knoten E displaystyle mathsf E nbsp Er ist der in order Nachfolger von D displaystyle mathsf D nbsp und kann kein linkes Kind haben 13 14 Setze G displaystyle mathsf G nbsp Elter E displaystyle mathsf E nbsp und d i r displaystyle dir nbsp Kindesrichtung E displaystyle mathsf E nbsp die links ist wenn G D displaystyle mathsf G neq mathsf D nbsp sonst rechts Kopiere Schlussel und Daten von E displaystyle mathsf E nbsp in den Knoten D displaystyle mathsf D nbsp 15 Setze F displaystyle mathsf F nbsp rechtesKind E displaystyle mathsf E nbsp Es kann fehlen Mache F displaystyle mathsf F nbsp an E displaystyle mathsf E nbsp s Stelle zum d i r displaystyle dir nbsp Kind G displaystyle mathsf G nbsp Ist F displaystyle mathsf F nbsp ein Knoten wird G displaystyle mathsf G nbsp neuer Elter von F displaystyle mathsf F nbsp Fazit 12 In einem binaren Suchbaum bei dem es nur auf die in order Reihenfolge ankommt kann man beim Loschen den Zielknoten mit einem seiner maximal zwei in order Nachbarknoten vertauschen und was die Baumstruktur mit ihren Zeigern etc betrifft diesen statt jenen aus dem Baum entfernen Einer von beiden der Zielknoten oder der Nachbarknoten hat hochstens ein Kind Die Suchtiefe von d i r displaystyle dir nbsp Kind G displaystyle mathsf G nbsp hier F displaystyle mathsf F nbsp verringert sich um 1 displaystyle 1 nbsp Durch wiederholtes Loschen kann es dazu kommen dass der Baum zu einer linearen Liste entartet Wegen der unvermeidlichen Abstiege bis zu den Halbblattern ist die Komplexitat der Loschoperation im schlechtesten Fall O h displaystyle mathcal O h nbsp wobei h displaystyle h nbsp die Hohe des Baumes ist Sind Duplikate im Baum zugelassen dann schlagt Mehlhorn vor Elemente mit gleichem Schlussel in der Last In First Out Disziplin abzuraumen 16 Implementierung Bearbeiten nbsp Abb 5 Darstellung eines Binarbaums im SpeicherDie Abb zeigt eine naheliegende Art der Speicherung Sie entspricht in etwa den C Strukturen struct node 1 Objekt 1 Knoten char key struct node Kind links struct node Kind rechts object struct node Kopf Zeiger auf die Wurzel Zur besseren Unterscheidung der Objekte sind diese beziehentlich mit den Schlusseln F displaystyle mathsf F nbsp G displaystyle mathsf G nbsp J displaystyle mathsf J nbsp und P displaystyle mathsf P nbsp versehen Diese Schlussel sind auch der Einfachheit halber als Ziel der Verweise genommen worden anstelle von echten Speicheradressen Wie ublich soll ein Zeigerwert 0 ausdrucken dass auf kein Objekt verwiesen wird es also kein Kind an dieser Stelle gibt Kopf Bearbeiten Da die Wurzel einer Loschung oder einer Rotation anheimfallen somit den Baum nicht reprasentieren kann muss diese Rolle von einer anderen Datenstruktur ubernommen werden die in der Literatur Kopf 17 genannt wird Sie enthalt den Zeiger zur Wurzel und fungiert als eine Art Elter der Wurzel Iterative Programmierung Bearbeiten In der Literatur werden die Operationen haufig in rekursiver Programmierung vorgestellt Der Anwender hat aber mehrere Vorteile davon wenn der Implementierer die vom Aufschreiben her eleganten Rekursionen durch simple Iterationen ersetzt hat da dadurch h displaystyle h nbsp Hohe Prozeduraufrufe und rucksprunge eingespart werden und der Speicherbedarf fur den Programm Stapelspeicher konstant gehalten wird Es geht aber nicht nur um Ressourcenschonung Bei der Traversieroperation wird dadurch beispielsweise die Programmierung der Anwendung wesentlich vereinfacht 18 Fur das Aufbewahren des Ruckwegs zu Wurzel und Kopf der beim Traversieren aber auch haufig bei Modifikationen zur Aufrechterhaltung der Bauminvarianten AVL oder Rot Schwarz Kriterium gebraucht wird und der bei der rekursiven Programmierung neben anderem im Programmstapelspeicher steckt muss dann ein anderes explizites Konstrukt gewahlt werden welches sich im Cursor siehe unten subsumieren lasst Dadurch wird eine Trennung der modifizierenden Operationen von der Navigation moglich Trennung der navigierenden von den modifizierenden Operationen Bearbeiten Einfuge und Loschoperation sind sinnvollerweise von der Suchoperation zu trennen wenn zum Einfugepunkt beziehungsweise Knoten auch auf andere Weise als mit der Standardsuchoperation navigiert werden soll beispielsweise mittels eines Querschritts oder mithilfe einer zweiten Suchstruktur fur dasselbe Element wie in der Mehrere Zugriffspfade Diese Modularisierung der Navigations von den modifizierenden Operationen setzt einen gegebenenfalls unterlogarithmischen sprich konstanten Aufwand der letzteren frei denn ein Aufstieg bis zur Wurzel ist beispielsweise bei AVL Baum und Rot Schwarz Baum nur in Ausnahmefallen erforderlich In Anwendungen mit starkem sequentiellem Anteil kann sich das positiv auf die Laufzeit auswirken Cursor Bearbeiten Beim Suchen wird ein Paar Knoten Richtung erzeugt welches geeignet ist beim Einfugen den Einfugepunkt zu spezifizieren Beim Loschen wird der zu loschende Knoten durch die Komponente Knoten bezeichnet und die Komponente Richtung kann angeben wohin der Cursor nach der Loschung fortschreiten soll Beim Traversieren gibt Knoten den Ausgangspunkt und Richtung die gewunschte Richtung der Navigation an um im Ergebnis wieder bei einem solchen Paar anzukommen Damit erzeugen und oder verbrauchen alle wichtigen Operationen ein Konstrukt das in Analogie zum Beispiel zu den Datenbanken Cursor genannt wird 19 Die Grosse des Cursors hangt entscheidend davon ab ob die Knoten einen Zeiger zum Elter enthalten oder nicht Elterzeiger vorhanden Ein Paar Knoten Richtung stellt einen vollwertigen Cursor dar Ein Cursor wird nach einer Operation dann und nur dann ungultig wenn es sich um eine Loschung handelt und der Knoten des Cursors das Ziel der Loschung ist Mit dem prozentualen Aufschlag auf den Speicherbedarf fur die Datenstruktur erkauft man sich auf jeden Fall eine prozentuale Einsparung an Laufzeit da der Ruckweg zu Wurzel und Kopf immer schon gesichert ist Zeiger zum Elterknoten nicht vorhanden Cursor mit Stapel Zusatzlich zum Paar Knoten Richtung muss der Pfad vom Knoten zu Wurzel und Kopf im Cursor gehalten werden 20 Die Lange des Cursors entspricht damit der maximalen Hohe des Baums Diese ist entweder von sich aus ausreichend beschrankt vorgerechnetes Beispiel AVL Baum oder der Stapeluberlauf lost eine Reorganisation des Baums oder ein abnormales Ende aus Bei allen Operationen ist der Zugriff zum Elterknoten uber den Stapel im Cursor geringfugig teurer als uber den Elterzeiger Soll der Pfad im Cursor auch nach einer modifizierenden Operation gultig gehalten werden beispielsweise fur sequentielle Einfugungen oder Loschungen kommt noch ein zusatzlicher prozentualer Aufschlag hinzu Dies kann so aber nur fur einen Cursor den Eingabecursor erbracht werden Benotigt eine Anwendung mehrere Cursor fur ein und denselben Suchbaum und uber Anderungen an ihm hinweg dann kann das Aufrechterhalten der Konsistenz der Cursor mit Stapel zum Beispiel durch erneutes Suchen so aufwandig werden dass es wirtschaftlicher ist dem Baum Elterzeiger zu spendieren Mehrere Zugriffspfade Bearbeiten Als Beispiel fur eine Anwendung mit 2 Zugriffspfaden sei ein klassisches Speichermanagement gebracht Elemente der Datenstruktur sind die freien Speicherblocke mit den Attributen Feldern Ort und Grosse Fur jedes der beiden Felder gebe es eine Suchstruktur bei Ort ohne Duplikate Da bei Grosse jedoch Duplikate unvermeidlich sind empfiehlt sich ein lexikographisch zusammengesetzter Schlussel Grosse Ort Beim Akquirieren wird ein Block von Mindestgrosse gesucht ausgetragen und ein Rest falls vorhanden wieder eingetragen Bei der Speicherruckgabe wird nach Ort gesucht auf Konfliktfreiheit mit den Nachbarblocken gepruft ebenfalls ein Beispiel fur die Nutzlichkeit der Querschritts und der zuruckzugebende Block gegebenenfalls mit diesen verschmolzen Alle Veranderungen mussen auf beiden Suchstrukturen durchgezogen werden Sind Elterzeiger vorhanden dann erspart das Hangeln von der einen Suchstruktur zur anderen einen Suchvorgang Anwendungen BearbeitenWie Ben Pfaff 21 zeigt decken die dynamischen Suchbaumstrukturen AVL Baum Rot Schwarz Baum und Splay Baum dieselben wesentlichen Funktionen ab Grosse Unterschiede stellt er im Laufzeitverhalten fest wobei der AVL Baum in Median und Mittelwert am besten abschneidet In der Informatik haben die dynamischen Suchbaumstrukturen einen grossen Einsatzbereich als grundlegende Hilfsmittel bei Duplikatunterdruckung Deduplikation Duplikaterkennung Elementare Mengenoperationen wie Durchschnittsbildung und Vereinigung Standard Template Library STL Bei Ben Pfaff 21 finden sich systemnahe Anwendungen alle unter 86 based Linux Verwaltung von Virtual Memory Areas VMAs unter Einschluss von range queries zur Feststellung des Uberlappens von existierenden VMAs S 4 Eindeutige Kennzeichnung von IP Paketen S 7 Ferner Liste der Variablen in einem Programm die ein Interpreter zu pflegen hat der Interpreter muss jederzeit in der Lage sein zu entscheiden ob einer Programmvariablen momentan ein Wert zugewiesen ist und gegebenenfalls welcher Ahnliches gilt fur einen Compiler Binary Tree Sort Sortieren durch Einfugen In Mehrere Zugriffspfade ein klassisches Speichermanagement Effiziente Massen und Mengenoperationen aufbauend auf der JOIN Operation BearbeitenMithilfe einer JOIN Operation Konkatenation Verkettung von Binarbaumen sind hoch parallele Algorithmen fur Mengenoperationen beschrieben 22 worden Dabei sind die endlichen Mengen und Abbildungen dargestellt durch selbst balancierende Binarbaume und zwar insbesondere Rot Schwarzbaume AVL Baume Binarbaume mit beschrankter Balance oder Treaps Die Algorithmen sind open source als PAM Parallel Augmented Maps 23 in C auf GitHub verfugbar Auswahlkriterien BearbeitenDas binare Suchen im Array kann als eine Art Vorlaufer der binaren Suchbaume angesehen werden Da es sich bei Einfugungen und Loschungen linear verhalt und dann auch die Speicherverwaltung seines Arrays sorgfaltig uberlegt werden muss wird es in der Praxis fast nur fur statische vorsortierte Tabellen eingesetzt Sind also Einfugungen oder Loschungen fur die Anwendung wichtig sind die Binarbaume geeigneter Bezuglich Suchzeit und Speicher verhalten sich binares Suchen im Array und hohenbalancierte binare Suchbaume asymptotisch gleich Obwohl rein zufallige binare Suchbaume sich im Mittel logarithmisch verhalten garantiert ein binarer Suchbaum ohne irgendeine Vorkehrung die einer Entartung entgegenwirkt keineswegs eine unterlineare Laufzeit Entartungen konnen systematisch vorkommen zum Beispiel wenn ein Programmierer massenhaft nahe benachbarte Sprungmarkennamen vergibt Es gibt jedoch sehr viele Konzepte die dazu entwickelt wurden eine ausreichende Balance sicherzustellen Hierbei stehen sich immer Aufwand und Ertrag gegenuber Zum Beispiel ist der Aufwand einen binaren Suchbaum standig vollstandig balanciert zu halten so hoch dass sich das nur bei Anwendungen lohnen durfte deren Laufzeit in extremer Weise vom Suchen dominiert wird Ein wichtiges Kriterium fur die Auswahl ist ob der Binarbaum statisch ist und so ein einmaliger optimaler Aufbau ausreicht oder ob verandernde Operationen wie Einfugen und Loschen wichtig sind Fur erstere kommen gewichtete Suchbaume in Betracht worunter auch der Bellman Algorithmus Bei letzteren sind hohen balancierte Suchbaume wie der AVL Baum und der Rot Schwarz Baum aber auch Splay Baume von Interesse Eine Gegenuberstellung von Komplexitaten verschiedener Suchalgorithmen finden sich im Artikel Suchbaum Laufzeitmessungen anhand realistischer Beispiele sind zu finden bei Pfaff 2004b Bei diesen Uberlegungen wurde generell angenommen dass der ganze Baum im Arbeitsspeicher Hauptspeicher untergebracht ist Spielen Zugriffe zu externen Medien eine Rolle kommen ganz andere Kriterien hinzu Schon der B Baum der solche Gesichtspunkte berucksichtigt ist zwar ein Suchbaum aber nicht mehr binar Historisches BearbeitenDie im Abschnitt Motivation erwahnte sehr bekannte Suchstruktur Binare Suche im Array gilt als Vorlaufer der dynamischen Suchbaumstrukturen Als naheliegende Umsetzung des Nachschlagens in einem sortierten Worterbuch durfte sie mehrfach und ohne Kenntnis anderer Implementierungen entwickelt und implementiert worden sein Im dynamischen Anwendungsfall kann sie aber mit den neueren Entwicklungen nicht mithalten obwohl sie im statischen Fall eine hervorragende Losung ist Es gibt Makros die einen Compiler veranlassen zu einer gegebenen sortierten Tabelle von Schlussel Werte Paaren Quelltext fur eine iterierende oder schleifenlose binare Suche zu erzeugen Im Jahr 1962 erschien zum ersten Mal eine dynamische Suchbaumstruktur in Form des AVL Baums Seine Erfinder sind die genannten sowjetischen Mathematiker Georgi Adelson Welski und Jewgeni Landis Ihr Beitrag im Journal Doklady Akademii Nauk SSSR wurde noch im selben Jahr ins Englische ubersetzt Die Ubersetzung tragt wie entsprechend das Original den sehr ehrgeizigen Titel An algorithm for the organization of information Die Bezeichnung AVL Baum findet sich in dieser Ubersetzung nicht Im Jahr 1970 veroffentlichte Rudolf Bayer 24 seine erste Arbeit uber den B Baum Er ist kein Binarbaum unterstutzt heterogene Speicher beispielsweise Hauptspeicher und Hintergrundspeicher und wird bei Datenbanksystemen eingesetzt Danach folgte im Jahr 1972 zunachst unter dem Namen symmetric binary B tree der Rot Schwarz Baum von Rudolf Bayer 25 Ihm war die Balance Regel des AVL Baums zu streng Eine Umbenennung erfolgte 1978 von Leonidas Guibas und Robert Sedgewick 26 in das heute ubliche red black tree spater auch RB tree Splay Baume wurden im Jahr 1985 von Daniel Sleator und Robert Tarjan 27 unter dem Namen Self Adjusting Binary Search Trees vorgestellt Sie sind noch dynamischer als die vorgenannten indem sie sich auch bei Suchoperationen verandern Eine grobe Gegenuberstellung dynamischer Suchbaume findet sich im Hauptartikel SuchbaumSiehe auch BearbeitenB Baum Balancierter Baum Binare Priorisierung gewichteter binarer Suchbaum SuchbaumLiteratur BearbeitenDonald E Knuth The art of computer programming Volume 3 Sorting and Searching 3 Auflage Addison Wesley 1997 ISBN 0 201 89683 4 Kurt Mehlhorn Datenstrukturen und effiziente Algorithmen Teubner Stuttgart 1988 ISBN 3 519 12255 3 Kurt Mehlhorn Peter Sanders Algorithms and Data Structures The Basic Toolbox Springer Berlin Heidelberg 2008 ISBN 978 3 540 77977 3 doi 10 1007 978 3 540 77978 0 Weblinks Bearbeiten nbsp Commons Binarere Suchbaume Sammlung von Bildern Videos und Audiodateien Ben Pfaff An Introduction to Binary Search Trees and Balanced Trees PDF gzip 1675 kB 2004 englisch Ben Pfaff Performance Analysis of BSTs in System Software PDF 316 kB Stanford University 2004 englisch Einzelnachweise und Anmerkungen Bearbeiten Gibt es keine Werte sondern nur Schlussel so ist das zugrunde liegende Modell das der endlichen Menge und die Fragestellung reduziert sich darauf ob ein gegebener Schlussel in der Menge vorhanden ist oder nicht Es ist also die Indikatorfunktion der Menge zu realisieren Die Sichtweise der Abb 1B findet sich beispielsweise bei Knuth und im Artikel Rot Schwarz Baum Eine explizite Gegenuberstellung der beiden Sichtweisen gibt Pfaff 2004a p 30 4 1 1 Aside Differing Definitions Dort wird die Sichtweise der Abb 1A als die des Implementierers bezeichnet Mehlhorn 1988 S 296 deren Erfullung der Relationsgesetze die Software nicht nachprufen kann Pfaff a 23 Mehlhorn 2008 wie locateLocally in Mehlhorn 2008 S 150 nach Mehlhorn 1988 S 147 internal path length bei Knuth pp 399 400 external path length bei Knuth pp 399 400 E I 2 n displaystyle E I 2n nbsp bei Knuth a b zitiert nach Robert Sedgewick Kevin Wayne Algorithms Fourth Edition PDF 1 2 Vorlage Toter Link github com Seite nicht mehr abrufbar festgestellt im August 2019 Suche in Webarchiven Pearson Education 2011 ISBN 978 0 321 57351 3 S 410 englisch abgerufen am 25 Marz 2018 Genauso gut kann man im linken Kindbaum von D displaystyle mathsf D nbsp zum rechtesten Knoten navigieren der der in order Vorganger von D displaystyle mathsf D nbsp ist und kein rechtes Kind haben kann Bei einheitlicher Wahl der Seite des Abstiegs wurde die Ausbildung einer gewissen Asymmetrie der Balancierung festgestellt so dass manche Autoren z B Mehlhorn das Abwechseln der Seite des Abstiegs empfehlen Wenn die Knoten keinen Elterzeiger haben und der Weg zuruck zur Wurzel uber einen Stapelspeicher realisiert wird ist derselbe in beiden Fallen beim Abstieg fortzuschreiben Die gewahlte Sprechweise dient nur der leichteren Verstandlichkeit Naturlich muss ein generisches Softwarepaket von Benutzerdaten unabhangig bleiben und umgekehrt vorgehen namlich die ihm nicht notwendigerweise bekannten Benutzerdaten des Knotens E displaystyle mathsf E nbsp unberuhrt lassen und E displaystyle mathsf E nbsp mit allen zum binaren Suchbaum gehorigen Verbindungen des Knotens D displaystyle mathsf D nbsp ausstatten sowie alle auf D displaystyle mathsf D nbsp zeigenden Zeiger auf E displaystyle mathsf E nbsp zeigen lassen Dazu gehort dass falls D displaystyle mathsf D nbsp die Wurzel war der Knoten E displaystyle mathsf E nbsp zur neuen Wurzel wird So in Exercise 7 10 in Mehlhorn 2008 S 155 Die obigen Funktionen FindDupGE und FindDupLE unterstutzen dieses wenn beim Einfugen und Loschen dieselbe genommen wird Wird die jeweils andere Funktion genommen bspw beim Einfugen FindDupGE und beim Loschen FindDupLE dann implementiert man eine First In First Out Disziplin Header node und HEAD bei Donald E Knuth The Art of Computer Programming Band 3 Sorting and Searching 2 Auflage Addison Wesley 1998 S 462 totum pro parte tree data structure bei Ben Pfaff An Introduction to Binary Search Trees and Balanced Trees Free Software Foundation Inc Boston 2004 Siehe dazu Traversierung mit Codebeispielen und Ben Pfaff An Introduction to Binary Search Trees and Balanced Trees Free Software Foundation Inc Boston 2004 S 47 4 9 2 Traversal by Iteration Ben Pfaff gibt einem Objekt mit sehr ahnlicher Funktionalitat den Namen traverser und offeriert fur Suchen Einfugen und Loschen eine Standard und eine Traverser Variante Pfaff 2004a p 15 2 10 Traversers auxiliary stack bei Knuth p 461 der beim AVL Baum die Einfugung aber anderweitig lost a b Ben Pfaff Performance Analysis of BSTs in System Software Stanford University 2004 Guy Edward Blelloch Daniel Ferizovic Yihan Sun Just Join for Parallel Ordered Sets Hrsg ACM Symposium on Parallel Algorithms and Architectures Proc of 28th ACM Symp Parallel Algorithms and Architectures SPAA 2016 2016 ISBN 978 1 4503 4210 0 S 253 264 doi 10 1145 2935764 2935768 arxiv 1602 02120 Yihan Sun Daniel Ferizovic Guy E Blelloch PAM parallel augmented maps Hrsg ACM ACM SIGPLAN Notices 23 Marz 2018 ISSN 0362 1340 S 290 304 doi 10 1145 3200691 3178509 acm org Rudolf Bayer Edward M McCreight Organization and Maintenance of Large Ordered Indices Mathematical and Information Sciences Report No 20 Boeing Scientific Research Laboratories 1970 Rudolf Bayer Symmetric binary B Trees Data structure and maintenance algorithms In Acta Informatica 1 Jahrgang Nr 4 1972 S 290 306 doi 10 1007 BF00289509 englisch Leonidas J Guibas Robert Sedgewick A Dichromatic Framework for Balanced Trees 19th Annual Symposium on Foundations of Computer Science In Proceedings of the 19th Annual Symposium on Foundations of Computer Science 1978 S 8 21 doi 10 1109 SFCS 1978 3 englisch ieeecomputersociety org Daniel D Sleator Robert Tarjan Self Adjusting Binary Search Trees In Journal of the ACM Association for Computing Machinery Band 32 Nr 3 1985 S 652 686 doi 10 1145 3828 3835 cs cmu edu PDF 6 1 MB Abgerufen von https de wikipedia org w index php title Binarer Suchbaum amp oldid 235836008