www.wikidata.de-de.nina.az
Ein B Baum englisch B tree ist in der Informatik eine Daten oder Indexstruktur die haufig in Datenbanken und Dateisystemen eingesetzt wird Ein B Baum ist ein immer vollstandig balancierter Baum der Daten nach Schlusseln sortiert speichert Er kann binar sein ist aber im Allgemeinen kein Binarbaum Das Einfugen Suchen und Loschen von Daten in B Baumen ist in amortisiert logarithmischer Zeit moglich B Baume wachsen und schrumpfen anders als viele Suchbaume von den Blattern hin zur Wurzel Inhaltsverzeichnis 1 Geschichte und Namensgebung 2 Eigenschaften 2 1 Hohe 3 Definitionen 4 Spezialfalle und Varianten 5 Operationen 5 1 Suchen 5 2 Einfugen 5 3 Loschen 5 3 1 Verschiebung 5 3 2 Verschmelzung 5 3 3 Loschen aus inneren Knoten 6 Beispiel 7 Programmierung 8 Ahnliche Baumstrukturen 9 Literatur 10 Weblinks 11 EinzelnachweiseGeschichte und Namensgebung BearbeitenDer B Baum wurde 1972 von Rudolf Bayer und Edward M McCreight entwickelt Er erwies sich als ideale Datenstruktur zur Verwaltung von Indizes fur das relationale Datenbankmodell das 1970 von Edgar F Codd entwickelt worden war Diese Kombination fuhrte zur Entwicklung des ersten SQL Datenbanksystems System R bei IBM Die Erfinder lieferten keine Erklarung fur die Herkunft des Namens B Baum Die haufigste Interpretation ist dass B fur balanciert steht Weitere Interpretationen sind B fur Bayer Barbara nach seiner Frau Broad Busch Bushy Boeing da Rudolf Bayer fur Boeing Scientific Research Labs gearbeitet hat Banyanbaum ein Baum bei dem Aste und Wurzeln ein Netz erstellen oder binar aufgrund der ausgefuhrten binaren Suche innerhalb eines Knotens Eigenschaften BearbeitenIn einem B Baum kann ein Knoten im Unterschied zu Binarbaumen mehr als 2 Kind Knoten haben Dies ermoglicht es mit einer variablen Anzahl Schlussel oder Datenwerte pro Knoten die Anzahl der bei einer Datensuche zu lesenden Knoten zu reduzieren Die maximale erlaubte Anzahl der Schlussel ist von einem Parameter t displaystyle t nbsp in der Literatur manchmal auch als d displaystyle d nbsp k displaystyle k nbsp oder m displaystyle m nbsp definiert dem Verzweigungsgrad oder Ordnung des B Baumes abhangig Die Bedeutung von t displaystyle t nbsp ist je nach Definition unterschiedlich Entweder bezeichnet t displaystyle t nbsp die maximale Anzahl von Kindknoten in diesem Fall ist die maximal erlaubte Anzahl von Schlusseln t 1 displaystyle t 1 nbsp oder die minimal erlaubte Anzahl von Kindknoten 1 in dem Fall ware die maximal erlaubte Anzahl an Schlusseln 2 t 1 displaystyle 2t 1 nbsp Anwendung finden B Baume unter anderem bei Datenbanksystemen die mit sehr grossen Datenmengen umgehen mussen von denen nur ein Bruchteil gleichzeitig in den Hauptspeicher eines Rechners passt Die Daten sind daher persistent auf Hintergrundspeicher z B Festplatten abgelegt und konnen blockweise gelesen werden Ein Knoten des B Baumes kann dann als ein Block gelesen bzw gespeichert werden Durch den grossen Verzweigungsgrad bei B Baumen wird die Baumhohe und damit die Anzahl der langsamen Schreib Lesezugriffe reduziert Die variable Schlusselmenge pro Knoten vermeidet zusatzlich haufiges Balancieren des Baumes Im Kontext von Datenbanksystemen werden abweichend der o g Definition von t displaystyle t nbsp folgendes definiert Wenn uber den Verzweigungsgrad des B Baumes gesprochen wird definiert t displaystyle t nbsp welches beim Verzweigungsgrad als k displaystyle k nbsp bezeichnet wird die minimale Anzahl von Schlusseln eines Knotens und 2 k displaystyle 2k nbsp die maximale Belegung eines Knotens Daraus ergibt sich die Anzahl der Kindknoten Wenn n displaystyle n nbsp die Anzahl vorhandener Schlusselwerte in einem Knoten ist dann hat dieser Knoten n 1 displaystyle n 1 nbsp Kindknoten Mit anderen Worten hat ein Knoten mindestens k 1 displaystyle k 1 nbsp und maximal 2 k 1 displaystyle 2k 1 nbsp Kindknoten 2 Die Ordnung eines B Baumes m displaystyle m nbsp beschreibt im Gegensatz zum Verzweigungsgrad zunachst die Anzahl der Kindknoten Ein Knoten eines Baumes mit der Ordnung m displaystyle m nbsp besitzt minimal m 2 displaystyle lceil m 2 rceil nbsp und maximal m displaystyle m nbsp Kindknoten Wenn nun n displaystyle n nbsp die Anzahl vorhandener Kindknoten ist dann hat der Vaterknoten n 1 displaystyle n 1 nbsp Schlussel Alle Blattknoten sind auf gleicher Hohe Ein B Baum wird durch den Mindestgrad t displaystyle t nbsp definiert Der Wert von t displaystyle t nbsp hangt von der Grosse der Speicherblocke ab Jeder Knoten ausser dem Wurzelknoten muss mindestens t 1 displaystyle t 1 nbsp Schlussel enthalten Der Wurzelknoten darf mindestens 1 Schlussel enthalten Alle Knoten einschliesslich dem Wurzelknoten durfen hochstens 2 t 1 displaystyle 2t 1 nbsp Schlussel enthalten Die Anzahl der Kindknoten eines Knotens ist gleich der Anzahl der darin enthaltenen Schlussel plus 1 Alle Schlussel eines Knotens sind in aufsteigender Reihenfolge sortiert Der Kindknoten zwischen zwei Schlusseln k 1 displaystyle k 1 nbsp und k 2 displaystyle k 2 nbsp enthalt alle Schlussel im Bereich von k 1 displaystyle k 1 nbsp und k 2 displaystyle k 2 nbsp Der B Tree wachst und schrumpft vom Wurzelknoten was im Gegensatz zu binaren Suchbaumen steht Wie bei anderen balancierten binaren Suchbaumen ist die Zeitkomplexitat zum Suchen Einfugen und Loschen gleich O log n displaystyle O log n nbsp Das Einfugen eines Knotens in den B Baum erfolgt nur am Blattknoten 3 Ein vollstandig besetzter B Baum in dem t displaystyle t nbsp als die maximal erlaubte Anzahl von Kindknoten und h als die Hohe des Baums definiert ist speichert gerade t h 1 1 displaystyle t h 1 1 nbsp Schlussel So konnen etwa bei einem entsprechend gross gewahlten t displaystyle t nbsp z B t 1024 displaystyle t 1024 nbsp bei einer Hohe von h 3 displaystyle h 3 nbsp bereits 1024 4 1 2 10 4 1 2 40 1 1 099 511 627 775 displaystyle 1024 4 1 2 10 4 1 2 40 1 1 099 511 627 775 nbsp Schlussel gespeichert werden Da eine Suchoperation hochstens h 1 displaystyle h 1 nbsp Knotenzugriffe benotigt mussen fur jede Suchanfrage in einem solchen Baum hochstens funf Baumknoten inspiziert werden Hohe Bearbeiten Fur die Hohe h displaystyle h nbsp eines B Baumes mit n displaystyle n nbsp gespeicherten Datenelementen gilt log 2 t 1 n 1 h log t n 1 2 1 displaystyle log 2t 1 left n 1 right leq h leq log t left frac n 1 2 right 1 nbsp Damit sind im schlimmsten Fall immer noch Zugriffe auf O log n displaystyle O log n nbsp Baumknoten zum Auffinden eines Datenelements notwendig Die Konstante dieser Abschatzung ist aber deutlich geringer als bei balancierten binaren Suchbaumen mit Hohe log 2 n displaystyle log 2 n nbsp log 2 n log t n 1 2 log 2 t displaystyle log 2 n over log t n 1 over 2 approx log 2 t nbsp Bei einem minimalen Verzweigungsgrad von t 1024 displaystyle t 1024 nbsp benotigt ein B Baum damit Zugriffe auf zehnmal weniger Knoten zum Auffinden eines Datenelements Wenn der Zugriff auf einen Knoten die Dauer der gesamten Operation dominiert wie das beim Zugriff auf Hintergrundspeicher der Fall ist ergibt sich dadurch eine zehnfach erhohte Ausfuhrungsgeschwindigkeit 4 5 6 Definitionen Bearbeiten nbsp Abbildung 1 B BaumEin Knoten eines B Baumes speichert eine variable Anzahl s displaystyle s nbsp von Schlusseln k 1 k s displaystyle k 1 ldots k s nbsp und optional ein pro Schlussel zugeordnetes Datenelement eine Markierung isLeaf die angibt ob es sich bei dem Knoten um ein Blatt oder einen inneren Knoten handelt Falls es sich um einen inneren Knoten handelt zusatzlich s 1 displaystyle s 1 nbsp Verweise auf Kindknoten Fur die Schlussel in einem B Baum gilt eine gegenuber binaren Suchbaumen verallgemeinerte Sortierungsbedingung Alle Schlussel eines Knotens sind aufsteigend sortiert Bei einem inneren Knoten x displaystyle x nbsp teilen seine Schlussel x k i displaystyle x k i nbsp die Schlusselbereiche seiner Unterbaume x c j displaystyle x c j nbsp in s 1 displaystyle s 1 nbsp Teilbereiche ein Jeder Schlussel x k i displaystyle x k i nbsp stellt demnach eine Grenze dar dessen linksseitiger Verweis auf kleinere Werte und dessen rechtsseitig angeordneter Verweis auf grossere Werte verweist In einem Unterbaum x c j displaystyle x c j nbsp kommen folglich nur Schlussel k displaystyle k nbsp vor fur die gilt k lt x k j displaystyle k lt x k j nbsp falls j 1 displaystyle j 1 nbsp x k j 1 lt k lt x k j displaystyle x k j 1 lt k lt x k j nbsp falls j 2 s displaystyle j in 2 ldots s nbsp x k j 1 lt k displaystyle x k j 1 lt k nbsp falls j s 1 displaystyle j s 1 nbsp Alle Blattknoten des B Baumes befinden sich in gleicher Tiefe Die Tiefe der Blattknoten ist gleich der Hohe h displaystyle h nbsp des Baumes Es gilt folgende Beschrankung fur die erlaubte Anzahl von Kindverweisen bzw Schlusseln pro Knoten Dazu wird eine Konstante t displaystyle t nbsp festgelegt die den minimalen Verzweigungsgrad von Baumknoten angibt Alle Knoten ausser der Wurzel haben mindestens k displaystyle k nbsp und hochstens 2 k displaystyle 2k nbsp Schlussel und mindestens k 1 displaystyle k 1 nbsp und hochstens 2 k 1 displaystyle 2k 1 nbsp Kindverweise wenn es sich um innere Knoten handelt Die Wurzel hat mindestens 1 displaystyle 1 nbsp und hochstens 2 k displaystyle 2k nbsp Schlussel wenn die Wurzel der einzige Knoten im B Baum ist und mindestens 2 displaystyle 2 nbsp und hochstens 2 k 1 displaystyle 2k 1 nbsp Kindverweise wenn die Hohe des Baumes grosser 0 ist Spezialfalle und Varianten BearbeitenFur den Spezialfall t 2 displaystyle t 2 nbsp spricht man von 2 3 4 Baumen da Knoten in einem solchen Baum 2 3 oder 4 Kinder haben konnen Verbreitete Varianten des B Baumes sind B Baume in denen die Daten nur in den Blattern gespeichert werden und B Baume die durch eine modifizierte Uberlaufbehandlung immer zu 2 3 displaystyle 2 3 nbsp gefullt sind Alle diese Varianten werden wie auch der regulare B Baum in der Praxis oft eingesetzt Auch ein R Baum kann als balancierter Baum als Erweiterung des B Baumes bezeichnet werden Operationen BearbeitenSuchen Bearbeiten Die Suche nach einem Schlussel k displaystyle k nbsp liefert denjenigen Knoten x displaystyle x nbsp der diesen Schlussel speichert und die Position j displaystyle j nbsp innerhalb dieses Knotens fur die gilt dass k x k j displaystyle k x k j nbsp Enthalt der Baum den Schlussel k displaystyle k nbsp nicht liefert die Suche das Ergebnis nicht enthalten Die Suche lauft in folgenden Schritten ab Die Suche beginnt mit dem Wurzelknoten r displaystyle r nbsp als aktuellem Knoten x displaystyle x nbsp Ist x displaystyle x nbsp ein innerer Knoten wird die Position j displaystyle j nbsp des kleinsten Schlussels bestimmt der grosser oder gleich k displaystyle k nbsp ist Existiert eine solche Position j displaystyle j nbsp aber ist k x k j displaystyle k neq x k j nbsp kann der gesuchte Schlussel nur in dem Unterbaum mit Wurzel x c j displaystyle x c j nbsp enthalten sein Die Suche wird daher mit Schritt 2 und dem Knoten x c j displaystyle x c j nbsp als aktuellem Knoten fortgesetzt ansonsten wurde der Schlussel gefunden und x j displaystyle x j nbsp wird als Ergebnis zuruckgeliefert Existiert keine solche Position ist der Schlussel grosser als alle im aktuellen Knoten gespeicherten Schlussel In diesem Fall kann der gesuchte Schlussel nur noch in dem Unterbaum enthalten sein auf den der letzte Kindverweis x c x s 1 displaystyle x c x s 1 nbsp zeigt In diesem Fall wird die Suche mit Schritt 2 und dem Knoten x c x s 1 displaystyle x c x s 1 nbsp als aktuellem Knoten fortgesetzt Ist x displaystyle x nbsp ein Blattknoten Wird k displaystyle k nbsp in den Schlusseln von x displaystyle x nbsp gesucht Wenn der Schlussel an Position j displaystyle j nbsp gefunden wird ist das Ergebnis x j displaystyle x j nbsp ansonsten nicht enthalten nbsp Abbildung 2 Suche im B BaumIn Abbildung 2 ist die Situation wahrend der Suche nach dem Schlussel k 9 displaystyle k 9 nbsp dargestellt Im Schritt 2 aus obigem Algorithmus wird im aktuellen Knoten x displaystyle x nbsp die kleinste Position j displaystyle j nbsp gesucht fur die 9 x k j displaystyle 9 leq x k j nbsp gilt Im konkreten Beispiel wird die Position 2 displaystyle 2 nbsp gefunden da 5 9 13 displaystyle 5 leq 9 leq 13 nbsp gilt Die Suche wird daher im rot markierten Unterbaum x c 2 displaystyle x c 2 nbsp fortgesetzt weil sich aufgrund der B Baum Eigenschaft 2 der gesuchte Schlussel 9 displaystyle 9 nbsp nur in diesem Unterbaum befinden kann Einfugen Bearbeiten nbsp Abbildung 3 Teilen eines vollen B Baum Knotens Das Einfugen eines Schlussels k displaystyle k nbsp in einen B Baum geschieht immer in einem Blattknoten In einem vorbereitenden Schritt wird der Blattknoten x i n s e r t displaystyle x mathrm insert nbsp gesucht in den eingefugt werden muss Dabei werden Vorkehrungen getroffen damit die Einfugeoperation nicht die B Baum Bedingungen verletzt und einen Knoten erzeugt der mehr als 2 t 1 displaystyle 2t 1 nbsp Schlussel enthalt In einem abschliessenden Schritt wird k displaystyle k nbsp unter Berucksichtigung der Sortierreihenfolge lokal in x displaystyle x nbsp eingefugt Die Suche von x i n s e r t displaystyle x mathrm insert nbsp lauft mit zwei Unterschieden so ab wie unter Suchen beschrieben Diese Unterschiede sind Das Einfugen eines neuen Schlussels k displaystyle k nbsp geschieht immer in einem Blattknoten Dem Einfugen muss daher immer ein vollstandiger Suchlauf vorhergehen der ergibt dass der Schlussel k displaystyle k nbsp noch nicht existiert und der ermittelt in welchen Knoten er einzutragen ist Dies kann nur ein Blattknoten sein denn diese Aussage ist erst nach dem Durchsuchen uber die gesamte Hohe des Baumes zulassig Die Suche bricht jedoch in einem inneren Knoten ab wenn dort der Schlussel k displaystyle k nbsp bereits gefunden wird und ein Einfugen deshalb nicht notwendig ist Bevor die Suche zu einem Kindknoten x c j displaystyle x c j nbsp absteigt wird uberpruft ob x c j displaystyle x c j nbsp voll ist d h bereits 2 t 1 displaystyle 2t 1 nbsp Schlussel enthalt In diesem Fall wird x c j displaystyle x c j nbsp vorsorglich geteilt Dies garantiert dass die Einfugeoperation mit einem einzigen Baumabstieg durchgefuhrt werden kann und keine anschliessenden Reparaturmassnahmen zur Wiederherstellung der B Baum Bedingungen durchgefuhrt werden mussen Das Teilen eines vollen Baumknotens geschieht wie in Abbildung 3 gezeigt Die Suche ist an Knoten x displaystyle x nbsp angekommen und wurde zum Kindknoten x c 2 displaystyle x c 2 nbsp absteigen roter Pfeil Das heisst die Suchposition ist j 2 displaystyle j 2 nbsp Da dieser Kindknoten voll ist muss er vor dem Abstieg geteilt werden um zu garantieren dass ein Einfugen moglich ist Ein voller Knoten hat mit 2 t 1 displaystyle 2t 1 nbsp immer eine ungerade Anzahl von Schlusseln Der mittlere davon in der Abbildung ist das Schlussel x c 2 k 3 displaystyle x c 2 k 3 nbsp wird im aktuellen Knoten an der Suchposition j displaystyle j nbsp eingefugt Der Knoten x c 2 displaystyle x c 2 nbsp wird in zwei gleich grosse Knoten mit jeweils t 1 displaystyle t 1 nbsp Schlusseln geteilt und diese uber die beiden neuen Zeigerpositionen verlinkt zwei rote Pfeile im Ergebnis Die Suche steigt anschliessend entweder in den Unterbaum x c 2 displaystyle x c 2 nbsp oder x c 3 displaystyle x c 3 nbsp ab je nachdem ob der einzufugende Schlussel kleiner oder gleich dem mittleren Schlussel des geteilten Knotens ist oder nicht Loschen Bearbeiten Das Loschen eines Schlussels k d e l e t e displaystyle k mathrm delete nbsp ist eine komplexere Operation als das Einfugen da hier auch der Fall betrachtet werden muss dass ein Schlussel aus einem inneren Knoten geloscht wird Der Ablauf ist dabei wie die Suche nach einem geeigneten Platz zum Einfugen eines Schlussels allerdings mit dem Unterschied dass vor dem Abstieg in einen Unterbaum uberpruft wird ob dieser genugend Schlussel t displaystyle geq t nbsp enthalt um eine eventuelle Loschoperation ohne Verletzung der B Baum Bedingungen durchfuhren zu konnen Dieses Vorgehen ist analog zum Einfugen und vermeidet anschliessende Reparaturmassnahmen Enthalt der Unterbaum den die Suche fur den Abstieg ausgewahlt hat die minimale Anzahl von Schlusseln t 1 displaystyle t 1 nbsp wird entweder eine Verschiebung oder eine Verschmelzung durchgefuhrt Wird der gesuchte Schlussel in einem Blattknoten gefunden kann er dort direkt geloscht werden Wird er dagegen in einem inneren Knoten gefunden passiert die Loschung wie in Loschen aus inneren Knoten beschrieben Verschiebung Bearbeiten nbsp Abbildung 4 Verschieben eines Schlussels im B Baum Enthalt der fur den Abstieg ausgewahlte Unterbaum nur die minimale Schlusselanzahl t 1 displaystyle t 1 nbsp aber ein vorausgehender oder nachfolgender Geschwisterknoten hat mindestens t displaystyle t nbsp Schlussel wird ein Schlussel in den ausgewahlten Knoten verschoben wie in Abbildung 4 gezeigt Die Suche hat hier x c 2 displaystyle x c 2 nbsp fur den Abstieg ausgewahlt da x k 1 lt k d e l e t e lt x k 2 displaystyle x k 1 lt k mathrm delete lt x k 2 nbsp dieser Knoten enthalt aber nur t 1 displaystyle t 1 nbsp Schlussel roter Pfeil Da der nachfolgende Geschwisterknoten x c 3 displaystyle x c 3 nbsp ausreichend viele Schlussel enthalt kann von dort der kleinste Schlussel x c 3 k 1 displaystyle x c 3 k 1 nbsp in den Vaterknoten verschoben werden um im Gegenzug den Schlussel x k 2 displaystyle x k 2 nbsp als zusatzlichen Schlussel in den fur den Abstieg ausgewahlten Knoten zu verschieben Dazu wird der linke Unterbaum von x c 3 k 1 displaystyle x c 3 k 1 nbsp zum neuen rechten Unterbaum des verschobenen Schlussels x k 2 displaystyle x k 2 nbsp Man kann sich leicht davon uberzeugen dass diese Rotation die Sortierungsbedingungen erhalt da fur alle Schlussel k displaystyle k nbsp im verschobenen Unterbaum vor und nach der Verschiebung die Forderung x k 2 k x c 3 k 1 displaystyle x k 2 leq k leq x c 3 k 1 nbsp gilt Eine symmetrische Operation kann zur Verschiebung eines Schlussels aus einem vorausgehenden Geschwisterknoten durchgefuhrt werden Verschmelzung Bearbeiten nbsp Abbildung 5 Verschmelzen zweier B Baum Kindknoten Enthalten sowohl der fur den Abstieg ausgewahlte Unterbaum x c 2 displaystyle x c 2 nbsp als auch sein unmittelbar vorausgehender und nachfolgender Geschwisterknoten genau die minimale Schlusselanzahl ist eine Verschiebung nicht moglich In diesem Fall wird eine Verschmelzung des ausgewahlten Unterbaumes mit dem vorausgehenden oder nachfolgenden Geschwisterknoten gemass Abbildung 5 durchgefuhrt Dazu wird der Schlussel aus dem Vaterknoten x displaystyle x nbsp welcher die Wertebereiche der Schlussel in den beiden zu verschmelzenden Knoten trennt als mittlerer Schlussel in den verschmolzenen Knoten verschoben Die beiden Verweise auf die jetzt verschmolzenen Kindknoten werden durch einen Verweis auf den neuen Knoten ersetzt Da der Algorithmus vor dem Abstieg in einen Knoten sicherstellt dass dieser mindestens t displaystyle t nbsp anstelle der von den B Baum Bedingungen geforderten t 1 displaystyle t 1 nbsp Schlussel enthalt ist gewahrleistet dass der Vaterknoten x displaystyle x nbsp eine ausreichende Schlusselanzahl enthalt um einen Schlussel fur die Verschmelzung zur Verfugung zu stellen Nur im Fall dass zwei Kinder des Wurzelknotens verschmolzen werden kann diese Bedingung verletzt sein da die Suche bei diesem Knoten beginnt Die B Baum Bedingungen fordern fur den Wurzelknoten mindestens einen Schlussel wenn der Baum nicht leer ist Bei Verschmelzung der letzten zwei Kinder des Wurzelknotens wird aber sein letzter Schlussel in das neu entstehende einzige Kind verschoben was zu einem leeren Wurzelknoten in einem nicht leeren Baum fuhrt In diesem Fall wird der leere Wurzelknoten geloscht und durch sein einziges Kind ersetzt Loschen aus inneren Knoten Bearbeiten nbsp Abbildung 6 Loschen eines Schlussels aus einem inneren Knoten Wird der zu loschende Schlussel k d e l e t e displaystyle k mathrm delete nbsp bereits in einem inneren Knoten gefunden k d e l e t e x k 2 displaystyle k mathrm delete x k 2 nbsp in Abbildung 6 kann dieser nicht direkt geloscht werden weil er fur die Trennung der Wertebereiche seiner beiden Unterbaume x c 2 displaystyle x c 2 nbsp und x c 3 displaystyle x c 3 nbsp benotigt wird In diesem Fall wird sein symmetrischer Vorganger oder sein symmetrischer Nachfolger geloscht und an seine Stelle kopiert Der symmetrische Vorganger ist der grosste Blattknoten im linken Unterbaum x c 2 displaystyle x c 2 nbsp befindet sich also dort ganz rechts aussen Der symmetrische Nachfolger ist entsprechend der kleinste Blattknoten im rechten Unterbaum x c 3 displaystyle x c 3 nbsp und befindet sich dort ganz links aussen Die Entscheidung in welchen Unterbaum der Abstieg fur die Loschung stattfindet wird davon abhangig gemacht welcher genugend Schlussel enthalt Haben beide nur die minimale Schlusselanzahl werden die Unterbaume verschmolzen Damit wird keine Trennung der Wertebereiche mehr benotigt und der Schlussel kann direkt geloscht werden Beispiel Bearbeiten nbsp Abbildung 7 Evolution eines B BaumesAbbildung 7 zeigt die Entwicklung eines B Baumes mit minimalem Verzweigungsgrad t 2 displaystyle t 2 nbsp Knoten in einem solchen Baum konnen minimal einen und maximal drei Schlussel speichern und haben zwischen zwei und vier Verweise auf Kindknoten Man spricht daher auch von einem 2 3 4 Baum In einer praktischen Anwendung wurde man dagegen einen B Baum mit wesentlich grosserem Verzweigungsgrad verwenden Folgende Operationen wurden auf einem 2 4 Baum siehe Abbildung 7 durchgefuhrt a c Einfugen von 5 13 und 27 in einen anfangs leeren Baum d e Einfugen von 9 fuhrt zum Teilen des Wurzelknotens f Einfugen von 7 in einen Blattknoten g h Einfugen von 3 fuhrt zum Teilen eines Knotens i j Um 9 loschen zu konnen wird ein Schlussel aus einem Geschwisterknoten verschoben k l Das Loschen von 7 fuhrt zum Verschmelzen von zwei Knoten m Loschen von 5 aus einem Blatt n q Loschen von 3 fuhrt zur Verschmelzung der letzten zwei Kinder des Wurzelknotens Der entstehende leere Wurzelknoten wird durch sein einziges Kind ersetzt Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung eines B Baums mit den Funktionen search suchen insert einfugen und traverse durchlaufen Der B Baum wird als Klasse BTree und seine Knoten als Klasse BTreeNode deklariert Bei der Ausfuhrung des Programms wird die Funktion main verwendet 7 Code Schnipsel include lt iostream gt using namespace std Deklariert die Klasse fur die Knoten des B Baums class BTreeNode int keys Zeiger auf das Array mit den Schlusseln BTreeNode childNodes Array von Zeigern auf das Array mit den Kindknoten BTreeNode root Zeiger auf den Wurzelknoten des B Baums int t Mindestgrad des Knotens Mindestanzahl der Kindknoten Mindestanzahl der Schlussel plus 1 int n Aktuelle Zahl der Schlussel bool isLeafNode Gibt an ob der Schlussel ein Blattknoten ist public Deklariert die Klasse BTree als friend class von BTreeNode damit BTreeNode auf private Attribute von BTree zugreifen kann friend class BTree Konstruktor BTreeNode int t bool isLeafNode t t keys new int 2 t 1 Deklariert ein Array fur die maximale Anzahl der Schlussel childNodes new BTreeNode 2 t Deklariert ein Array fur die maximale Anzahl der Kindknoten Initialisiert die Attribute root NULL n 0 isLeafNode isLeafNode Diese rekursive Funktion durchlauft alle Knoten des Teilbaums mit dem aktuellen Knoten als Wurzelknoten und gibt sie auf der Konsole aus void traverse int i Index fur den aktuellen Kindknoten und aktuellen Schlussel Diese for Schleife durchlauft alle Kindknoten und Schlussel des aktuellen Knotens for i 0 i lt n i Wenn der aktuelle Knoten kein Blattknoten ist if isLeafNode childNodes i gt traverse Rekursiver Aufruf fur den aktuellen Kindknoten cout lt lt lt lt keys i Ausgabe auf der Konsole Wenn der aktuelle Knoten kein Blattknoten ist if isLeafNode childNodes i gt traverse Rekursiver Aufruf fur den Kindknoten Diese rekursive Funktion durchlauft die Knoten des Teilbaums mit dem aktuellen Knoten als Wurzelknoten und sucht einen Schlussel mit dem gegebenen Wert Diese Funktion gibt einen Zeiger auf den Knoten mit dem angegebenen Wert zuruck wenn vorhanden sonst einen Nullzeiger BTreeNode search int value int i 0 Initialisiert den Index fur den aktuellen Schlussel Diese while Schleife durchlauft das Array mit den Schlusseln bis ein Schlussel grosser oder gleich dem gegebenen Wert gefunden oder das Ende des Arrays erreicht ist while i lt n amp amp keys i lt value i Wenn der gefundene Schlussel gleich dem gegebenen Wert ist wird ein Zeiger auf den Knoten zuruckgegeben if keys i value return this Wenn kein Schlussel gefunden wurde und der aktuelle Knoten ein Blattknoten ist wird ein Nullzeiger zuruckgegeben if isLeafNode return NULL return childNodes i gt search value Rekursiver Aufruf der Funktion fur den Kindknoten vor dem Schlussel der grosser oder gleich dem gegebenen Wert ist Diese Funktion fugt den gegebenen Schlussel in den Teilbaums mit dem aktuellen Knoten als Wurzelknoten ein void insert int key Wenn der Baum leer ist wird ein Wurzelknoten mit dem gegebenen Schlussel eingefugt if root NULL root new BTreeNode t true Erzeugt den Wurzelknoten root gt keys 0 key Initialisiert den Schlussel root gt n 1 Aktualisiert das Attribut fur die Anzahl der Schlussel else Wenn der Baum nicht leer ist Wenn der Wurzelknoten voll ist if root gt n 2 t 1 BTreeNode newRoot new BTreeNode t false Erzeugt einen neuen Wurzelknoten newRoot gt childNodes 0 root Macht den alten Wurzelknoten zum Kindknoten des neuen Wurzelknotens newRoot gt splitChild 0 root Aufruf der Funktion teilt den alten Wurzelknotens int i 0 Index fur den Kindknoten if newRoot gt keys 0 lt key Wenn der Schlussel kleiner als der gegebene Schlussel ist Index um 1 erhohen i newRoot gt childNodes i gt insertNonFull key Fugt den Schlussel in den Teilbaum mit dem Kindknoten als Wurzelknoten ein root newRoot Setzt den neuen Wurzelknoten else Wenn der Wurzelknoten nicht voll ist root gt insertNonFull key Aufruf der Funktion insertNonFull fur den Wurzelknoten Diese rekursive Funktion fugt den gegebenen Schlussel in einen Knoten ein der nicht voll sein darf void insertNonFull int key int i n 1 Initialisiert den Index des Schlussels mit dem Maximum if isLeafNode Wenn der Knoten ein Blattknoten ist Diese while Schleife bestimmt den Index wo der Schlussel eingefugt wird und schiebt alle grosseren Schlussel um einen Index weiter while i gt 0 amp amp keys i gt key keys i 1 keys i i keys i 1 key Fugt den gegebenen Schlussel fur diesen Index ein n Aktualisiert das Attribut fur die Anzahl der Schlussel else Wenn der Knoten kein Blattknoten ist Diese while Schleife bestimmt den Index des Kindknotens in den der Schlussel eingefugt wird while i gt 0 amp amp keys i gt key i if childNodes i 1 gt n 2 t 1 Wenn der Kindknoten voll ist splitChild i 1 childNodes i 1 Teilt den Kindknoten Bestimmt ob der gegebene Schlussel links oder rechts vom mittleren Schlussel eingefugt wird if keys i 1 lt key Wenn der Schlussel kleiner als der gegebene Schlussel ist wird der Schlussel rechts vom mittleren Schlussel eingefugt sonst links i childNodes i 1 gt insertNonFull key Rekursiver Aufruf fur den Kindknoten fugt den Schlussel in den zugehorigen Teilbaum ein Diese Funktion teilt den gegebenen Kindknoten des aktuellen Knotens der voll sein muss void splitChild int index BTreeNode node BTreeNode node new BTreeNode node gt t node gt isLeafNode Erzeugt einen neuen Knoten node gt n t 1 Initialisiert das Attribut fur die Anzahl der Schlussel des neuen Knotens Diese for Schleife kopiert die letzten t 1 Schlussel vom gegebenen Kindknoten in den neuen Knoten for int i 0 i lt t 1 i node gt keys i node gt keys i t Wenn der Knoten kein Kindknoten ist if node gt isLeafNode Diese for Schleife kopiert die letzten t Kindknoten in den neuen Knoten for int i 0 i lt t i node gt childNodes i node gt childNodes i t node gt n t 1 Aktualisiert das Attribut fur die Anzahl der Schlussel des neuen Knotens Diese for Schleife bestimmt den Index des Kindknotens in den der Schlussel eingefugt wird Der Kindknoten rechts vom gegebenen Kindknoten um einen Index weiter geschoben for int i n i gt index 1 i childNodes i 1 childNodes i childNodes index 1 node Setzt den neuen Knoten als Kindknoten mit diesem Index Die Schlussel rechts vom gegebenen Kindknoten werden um einen Index weiter geschoben for int i n 1 i gt index i keys i 1 keys i keys index node gt keys t 1 Kopiert den mittleren Schlussel in den Knoten n Aktualisiert das Attribut fur die Anzahl der Schlussel des aktuellen Knotens Deklariert die Klasse fur den B Baum class BTree BTreeNode root Zeiger auf den Wurzelknoten int t Mindestgrad der Knoten Mindestanzahl der Kindknoten Mindestanzahl der Schlussel plus 1 public Konstruktor BTree int t root NULL t t Diese Funktion durchlauft alle Knoten des Baums und gibt sie auf der Konsole auf void traverse if root NULL root gt traverse Aufruf der Funktion fur den Wurzelknoten Diese sucht einen Schlussel mit dem gegebenen Wert Diese Funktion gibt einen Zeiger auf den Knoten mit dem angegebenen Wert zuruck wenn vorhanden sonst einen Nullzeiger BTreeNode search int k return root NULL NULL root gt search k Aufruf der Funktion fur den Wurzelknoten Diese Funktion fugt den gegebenen Schlussel ein void insert int key if root NULL root new BTreeNode t true root gt keys 0 key root gt n 1 else if root gt n 2 t 1 BTreeNode newRoot new BTreeNode t false newRoot gt childNodes 0 root newRoot gt splitChild 0 root int i 0 if newRoot gt keys 0 lt key i newRoot gt childNodes i gt insertNonFull key root newRoot else root gt insertNonFull key Hauptfunktion die das Programm ausfuhrt int main Erzeugt einen B Baum mit Mindestgrad 3 und fugt 8 Knoten ein BTree bTree 3 bTree insert 10 bTree insert 20 bTree insert 5 bTree insert 6 bTree insert 12 bTree insert 30 bTree insert 7 bTree insert 17 cout lt lt Durchlauf des erzeugten B Baums lt lt endl Ausgabe auf der Konsole bTree traverse Aufruf der Funktion die die Knoten durchlauft und die Schlussel auf der Konsole ausgibt cout lt lt endl Ruft die Funktion auf die einen Knoten mit dem Schlussel 6 sucht und gibt das Ergebnis auf der Konsole aus int k 6 bTree search k NULL cout lt lt Es ist ein Knoten mit dem Schlussel lt lt k lt lt vorhanden lt lt endl cout lt lt Es ist kein Knoten mit dem Schlussel lt lt k lt lt vorhanden lt lt endl Ruft die Funktion auf die einen Knoten mit dem Schlussel 15 sucht und gibt das Ergebnis auf der Konsole aus k 15 bTree search k NULL cout lt lt Es ist ein Knoten mit dem Schlussel lt lt k lt lt vorhanden lt lt endl cout lt lt Es ist kein Knoten mit dem Schlussel lt lt k lt lt vorhanden lt lt endl Ahnliche Baumstrukturen BearbeitenR Baum ist ein verwandtes Indexverfahren fur mehrdimensionale Daten B Baum und B Baum sind B Baum Varianten 2 3 4 Baum ist ein Spezialfall eines B Baumes mit minimalem Verzweigungsgrad t 2 displaystyle t 2 nbsp AVL Baum Rot Schwarz BaumLiteratur BearbeitenDeutsch Niklaus Wirth Algorithmen und Datenstrukturen mit Modula 2 Stuttgart 1986 ISBN 3 519 02260 5 T Ottmann P Widmayer Algorithmen und Datenstrukturen 3 Spektrum Heidelberg Berlin Oxford 1996 ISBN 3 8274 0110 0 S 317 327 Alfons Kemper Andre Eickler Datenbanksysteme Oldenbourg Verlag Munchen 2009 ISBN 978 3 486 59018 0 S 218Englisch R Bayer E McCreight Organization and Maintenance of Large Ordered Indexes In Proceedings of the 1970 ACM SIGFIDET Now SIGMOD Workshop on Data Description Access and Control 1970 S 107 141 8 R Bayer E McCreight Organization and Maintenance of Large Ordered Indexes In Acta Informatica Band 1 1972 S 173 189 R Bayer E McCreight Symmetric binary B Trees data structure and maintenance algorithms In Acta Informatica Band 1 1972 S 290 306 Weblinks BearbeitenTools zum Ausprobieren von B Baumen cs usfca edu Animierte JavaScript Version von David Galles slady net B Baum Java Applet ats oka nu Flash AppletEinzelnachweise Bearbeiten Thomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms 2 Auflage MIT Press Cambridge MA 2001 ISBN 0 262 03293 7 S 439 Alfons Kemper Andre Eickler Datenbanksysteme eine Einfuhrung 8 aktualisierte und erw Auflage Oldenbourg Verlag Munchen 2011 ISBN 978 3 486 59834 6 S 217 GeeksforGeeks Introduction of B Tree Ludwig Maximilians Universitat Munchen Institut fur Informatik B Baume I T Harder Universitat Kaiserslautern Mehrwegbaume B Baume Hohe des B Baumes Prof Dr E Rahm Universitat Leipzig Institut fur Informatik Algorithmen und Datenstrukturen 2 GeeksforGeeks Insert Operation in B Tree R Bayer E McCreight Organization and Maintenance of Large Ordered Indices In Proceedings of the 1970 ACM SIGFIDET Now SIGMOD Workshop on Data Description Access and Control SIGFIDET 70 ACM New York NY 1970 S 107 141 doi 10 1145 1734663 1734671 acm org abgerufen am 20 Februar 2019 nbsp Dieser Artikel wurde am 7 Dezember 2005 in dieser Version in die Liste der lesenswerten Artikel aufgenommen Abgerufen von https de wikipedia org w index php title B Baum amp oldid 230921615