Gut, guten Morgen. Wir sind bei Algorithmen und Datenstrukturen
. Wir sind bei Datenstrukturen und beschäftigen uns mit Suchbäumen.
Bevor wir da weitermachen, noch ganz kurz die Ankündigung.
Die meisten von ihnen haben es wahrscheinlich schon gesehen.
Am Freitag ist ja die Vorlesung ausgefallen aus einer sehr ungünstigen Konstellation heraus.
Und ich habe einen zusätzlichen Termin gesichert. Und zwar ist der am 1. Februar,
das ist der letzte Freitag im Semester,
Das habe ich erst mal sicherheitshalber gemacht, weil ich gucken muss,
wie ich mit dem Stoff so klarkomme,
wenn wir mit dem Stoff gut durchkommen, ist es,
glaube ich, trotzdem ganz gut, diesen Termin zu haben,
dann kann man den immerhin auch noch mal nutzen für vielleicht auch ein Tutorium oder so.
Das müssen wir mal sehen. Also den Termin,
der ist erst mal da,
der steht bei Ihnen auch in Stina drin und wie gesagt,
entweder nutzen wir den,
um den Rest der Vorlesung zu machen oder vielleicht auch für eine Fragestunde oder so.
Gut, so, wir sind bei den Suchbäumen und
unser Ziel ist es, zu erreichen,
dass die Suchbäume balanciert sind.
Wir wollen also Objekte einfügen und löschen können
Und das Einfügen und Löschen ändert natürlich die Struktur des Suchbaums
und kann dazu führen, dass er entartet.
Das haben wir in der letzten Vorlesung schon gesehen.
Und wir wollen jetzt dafür sorgen, dass das nicht mehr passiert.
Dass wir also beim Einfügen und Löschen Korrekturen vornehmen,
sodass der Baum im Wesentlichen balanciert bleibt.
In der letzten Vorlesung haben wir gesehen, naja,
die Chancen stehen für uns eigentlich gar nicht so schlecht.
Wir wissen zwar im Worst Case, kann der Baum vollständig entartet sein.
Wir haben eine Liste und wir haben eine Suchzeit von
mindestens Omega von N,
weil wir
alle Elemente betrachten müssen
Aber wir wissen, dass wir in einem balancierten Fall im Best Case
mit lugerithmischer Zeit auskommen und auch in einem zufällig erzeugten Binärbaum.
Da haben wir den Beweis nicht gesehen, habe ich ihn aber erzählt.
Man mit Login-Side auskommen soll. Das heißt, es sieht so aus,
als wenn in den meisten Fällen der Baum eigentlich balanciert ist.
Es gibt eben nur diese entarteten Fälle. Das heißt,
die Chancen sind nicht schlecht, dass wir Korrekturen vornehmen können,
sodass der Baum im Wesentlichen balanciert bleibt.
Balanciert bedeutet, dass der Suchbaum in der Höhe
eben lugerithmisch beschränkt ist in Bezug auf die Anzahl der Blätter
Ja, dieses Problem war eine gewisse Zeit lang offen und
in den 60er Jahren wurde es gelöst.
Es gehört für mich genauso wie die Medienbestimmung,
die wir schon gesehen haben, zu den echten Meilensteinen der Informatik,
dass man das geschafft hat, dass man Algorithmus entworfen hat,
der diese Balance herstellt.
Es ist die Grundlage von vielen, vielen Indexstrukturen,
die wir heute in Datenbanken verwenden. Ja,
also es ist eine der wohl auch neben Sachen wie Sortieren
einer der wichtigsten Datenstrukturen,
also was das Sortieren als Algorithmus ist,
hier sehen wir eine der wichtigsten Datenstrukturen in der Informatik,
die balancierten Suchbäume
Also die ersten balancierten Suchbäume waren sogenannte AVL-Bäume,
die werde ich Ihnen auch noch ganz kurz vorstellen,
damit Sie das zumindest mal gehört haben.
Ich werde Ihnen aber das Konzept der balancierten Bäume an einem anderen Datenstruktur,
an einer leichten, an einer Variante vorstellen, und zwar an den Rot-Schwarz-Bäumen.
Und die Rot-Schwarz-Bäume haben den großen Vorteil,
dass sie etwas leichter nachvollziehbar sind, wie das Ganze funktioniert.
Nichtsdestotrotz warne ich sie schon mal, diese Verfahren,
die wir hier sehen, sind diejenigen,
Ja, am meisten Gehirnschmalz erfordern, um die nachzuvollziehen.
Ja, weil wir waren halt mit diesen Bäumen,
wir werden dann mal verschiedene Rotationsoperationen machen.
Wir werden da was einfärben und so. Und es gibt
viele Fallunterscheidungen, die wir brauchen. Und da muss man,
ja, wach sein, um das zu verstehen.
Und ich würde ihn hier auch schon vorab raten,
das wirklich nochmal nachzulesen auch. Ja,
also wenn Sie es hier gehört haben, ich hoffe,
dass Sie das meiste hier mitkriegen,
wie es funktioniert und wenn Sie es dann nochmal lesen,
dann sollten Sie es eigentlich verstanden haben.
So, okay, wie funktionieren Rot-Schwarz-Bäume, wie der Name schon sagt,
haben die Noten Farben, das habe ich hier schon dargestellt.
Also es gibt schwarze Knoten und es gibt rote Knoten.
Wir haben also in den Bäumen so die typischen Eigenschaften.
Wir haben einen Vorgänger, wo wir also zu einem Knoten zu dem Elternknoten gehen können.
Wir haben ein linkes und ein rechtes Kind. Wir haben den Schlüsselwert,
der steht bei mir hier immer als große Zahl in dem
Feld drin und wir haben jetzt zusätzlich ein Feld,
das eine Farbe ist. Wir brauchen nur zwei Farben,
rot oder schwarz und wenn es jetzt um den Aufwand geht,
kann man schon mal sagen, wir brauchen an dieser Stelle ein zusätzliches Bit,
was wir speichern müssen pro Knoten.
Also wir haben einen ganz minimalen Speicher-Overhead, den wir in Kauf nehmen müssen. Okay,
so, was wir dann machen, ist, ja,
wir gehen wieder davon aus, wir haben so Wächterknoten,
die wir auch bei den Listen gesehen haben.
Das heißt, eigentlich sieht unser Baum so aus,
also jeder Knoten hat hier noch Blätter, die dann sogenannte Neilknoten sind.
Das sind Wächter, die werde ich aber in der Zukunft
jetzt einfach nicht mehr zeigen. Also wenn ich dann immer davon rede,
ja, die Blätter sind schwarz,
das werde ich jetzt häufiger sagen in dieser Vorlesung,
dann müssen sie immer daran denken,
hier unten sind noch so diese eckigen Wächterknoten dran,
die sind alle schwarz
Immer, die werde ich nur nicht zeichnen,
weil das dann so unübersichtlich ist. Okay, so,
dann interessieren wir uns natürlich sehr für die Höhe,
weil die Höhe entscheidet ja, wie lange wir brauchen, um Objekte wiederzufinden.
Der Suchprozess geht ja an der Wurzel los,
entscheidet an jedem Knoten, ist die Zahl kleiner oder größer
und geht dann nach rechts oder nach links,
bis das Objekt gefunden wird.
Also die Höhe ist das Entscheidende, was wir immer betrachten werden.
Okay, so, also dieser rote Schwarzbaum hat jetzt folgende fünf Eigenschaften,
die uns jetzt beschäftigen werden in dieser Vorlesung.
Die stehen hier. Erste Eigenschaft, jeder Knoten ist entweder
rot oder schwarz. Also es gibt keine anderen Farben,
außer rot oder schwarz
Zweite Eigenschaft, die Wurzel,
das ist der Knoten hier rum, ist immer schwarz.
Wer darf nicht rot sein? Dritte Eigenschaft, jedes Blatt
ist schwarz. Das sind diese Wächterknoten hier. Die sind
immer schwarz. Okay, das heißt, nur diese inneren,
bei den inneren Knoten, hier können rote Knoten vorkommen.
Vierte Eigenschaft, jetzt kommen die,
jetzt kommen die beiden Eigenschaften, die die Balance herstellen.
Die vierte Eigenschaft ist für jeden roten Knoten gilt,
beide Nachfolger sind schwarz.
Also sie sehen in dem Baum nie zwei rote Knoten,
die benachbart sind. Also ein roter Knoten ist immer umrandet
von schwarzen Knoten
Die vierte Eigenschaft und die fünfte Eigenschaft ist,
dass für jeden Knoten gilt, alle Pfade von diesem Knoten
X zu einem Blatt enthält die gleiche Anzahl schwarzer Knoten.
Damit realisieren wir Balance und diese Anzahl schwarzer Knoten,
das ist ja auch eine Höhe, so wie die Höhe des Baums.
Es ist aber jetzt nur die Höhe, die nur die schwarzen Knoten betrachtet.
Deswegen bezeichnen wir das als Schwarzhöhe oder Blackheid und deswegen wird das mit BH von X abgekürzt.
So, hier in dem Baum sehen Sie das.
Sie können bei der Wurzel anfangen und Sie sehen,
für die Wurzel gilt, egal wo sie langlaufen,
wenn sie zu einem Blatt laufen, sehen Sie immer 1,
2, 3 und dann hier noch diesen Wächter,
das Blatt 4 schwarze Knoten.
1, 2, 3, 4. 1, 2,
3, 4 oder 1, 2, 3, 4. Ja,
also auf jeden Pfad liegen die gleiche Anzahl schwarzer Knoten.
Das ist die wichtige Eigenschaft, die wir erhalten müssen.
So, okay, das hat sich jetzt jemand ausgedacht.
Und die Frage ist jetzt natürlich als allererstes Mal,
also ist das überhaupt balanciert?
Also das sieht ja jetzt gar nicht so gleichmäßig aus.
Also hier ist das zum Beispiel viel kürzer als hier.
Ist es denn irgendwie balanciert oder hinreichend balanciert
Dass wir zeigen können, dass wir mit logorithmischer Zeit
in diesem Baum suchen können. Das ist das Erste,
was wir überprüfen müssen. Wenn dem so ist,
dann können wir uns an die große Aufgabe zu machen,
dass wir mit einfügen und Löschoperationen sicherstellen,
dass diese fünf Eigenschaften immer gelten.
Also sie gelten vorher, wir fügen ein Element ein oder
wir löschen ein Element. Und dann müssen wir Dinge lokal
reparieren, bis alle fünf Eigenschaften wieder wahr sind.
Das werden wir machen. Okay,
also als allererstes schauen wir mal,
ob das Ganze
balanciert sein wird oder nicht
Und wie immer, jetzt kommt gleich so ein Beweis,
aber wie immer versuche ich erst mal über die Intuition zu argumentieren,
warum das eigentlich sortiert, balanciert sein muss.
Wenn Sie mal gucken, diese Eigenschaften 4 und 5,
die sorgen eigentlich für diese Balance. Und wenn man mal
nur die schwarzen Knoten nehmen würde und würde mal sagen,
die Roten, die beachten wir mal nicht,
dann sehen wir, wir haben ja überall die gleiche Höhe.
Und das ist dann genau eine Eigenschaft, die uns zeigt,
der Baum ist balanciert. Also egal, wo sie langlaufen,
haben sie immer die gleiche Anzahl schwarzer Knoten.
Das ist balanciert. Jetzt ist er natürlich doch nicht ganz
balanciert, weil es sind ja so rote Knoten dazwischen
Die Frage ist jetzt, wie viele von diesen roten Knoten
können denn dazwischen sein? Und mit der Eigenschaft 4 sichern
sie, dass nie zwei rote Knoten nacheinander kommen können.
Das heißt, nach einem roten Knoten kommt immer ein schwarzer Knoten.
Wenn sie also diese Wege betrachten, dann sehen sie,
dass sie höchstens so viele rote Knoten haben können wie schwarze Knoten,
weil jeder zweite Knoten muss ja ein schwarzer Knoten sein.
Das heißt, die Höhe, die sie haben,
wenn sie die roten Knoten mitbetrachten,
ist maximal ein Faktor 2 mehr als die Höhe,
die sie haben,
wenn sie nur die schwarzen Knoten betrachten
Okay, das heißt, er ist nicht ganz balanciert,
aber er ist bis auf einen Faktor 2 balanciert.
Bis auf die roten Knoten, die noch dazwischen liegen,
ist der Balance hier. Und das ist nur ein Faktor 2
und ein Faktor 2 ist für uns im Okalkül nicht weiter erheblich.
So, wie sieht der Beweis dazu aus? Hier ist die Eigenschaft,
die wir beweisen wollen, ein Rot-Schwarz-Baum-Tee mit N-inneren Knoten,
hat höchstens die Höhe zweimal Logorithmus zur Basis 2 von N plus 1.
Es könnte jetzt ja auch ein bisschen anders aussehen,
wir müssen eigentlich nur zeigen,
dass es im O von Log-En ist,
aber wir werden jetzt sehen,
dass das genau die exakte Schranke ist,
die da rauskommt
So, wie machen wir das? Also, wir haben den Baum,
wir betrachten den Baum unter einem Knoten X und der Betrag davon
ist die Anzahl der Knoten, die da drin sind.
Wir zeigen also jetzt für alle Knoten X,
die irgendwo in dem Baum vorkommen, gilt,
dass die Anzahl der Knoten in diesem Teilbaum, also alles,
was da drunter ist unter X, die Eigenschaft hat,
dass die Menge an Knoten größer gleich zwei hoch,
die Schwarzhöhe von X, also die Höhe,
die wir betrachten, wenn wir nur die schwarzen Knoten betrachten,
minus eins ist.
So, und das zeigen wir per Induktion über die Höhe
des Baums
Und wir fangen als allererstes an mit den Blättern.
Wenn wir ein Blatt haben, dann ist die Höhe des Teilbaums unter X0.
Da kommen keine Knoten mehr da drunter. Und die Schwarzhöhe
des Knotens ist auch null. Beachten Sie hier,
das ist vielleicht ein bisschen verwirrend, dass wir,
wenn wir von der Höhe reden,
immer den Knoten selber nicht mitzählen, sondern nur das,
was danach kommt.
Beim Blatt ist das dann null. Da kommt nichts mehr
da drunter. Es ist also null. Und das
können wir jetzt hier einsetzen. Und dann sehen wir,
okay, so ein Knoten, so ein Baum,
der die Höhe null hat, der hat nur den Knoten selber.
Das heißt, eins ist die Anzahl der Knoten.
Und das ist größer gleich
2 hoch 0. Also null ist die schwarze Höhe minus 1.
Das wäre also eins, minus 1 wäre null.
Das heißt, unsere Aussage ist erstmal wahr. Es war für
ein Blatt. Und jetzt können wir die inneren Knoten betrachten.
Jetzt gehen wir im Baum irgendwo an eine höhere Stelle.
So, aber wir betrachten also einen Knoten irgendwo in der Mitte.
Das heißt, der Knoten hat eine Höhe, die größer ist als null.
Das bedeutet, unter diesem Knoten sind noch weitere Knoten.
Dann geht es irgendwie runter bis zu den Blättern.
Wir haben zwei Fälle, so einen Knoten, der kann
von der Farbe her rot sein oder er kann schwarz sein.
Wir gehen natürlich davon aus, dass wir einen roten Schwarzbaum
haben und dass der natürlich alle unsere fünf Eigenschaften erfüllt,
die werden wir jetzt einfach dafür benutzen.
Okay, also erster Fall, die Farbe ist rot.
Was gilt dann für den? Wir wissen, nach Eigenschaft 4,
es kommen zwei, keine zwei roten Knoten hintereinander,
dass die Kinder, also x.left und x.right,
das sind ja die beiden Kinder von x,
die müssen beide schwarz sein.
Die können ja nicht rot sein, weil dann hätten wir
ja rot und dein Kind wieder rot, das geht nicht.
Als Wälder würde die Eigenschaft 4 verletzt sein.
Die Kinder sind also beide schwarz
Wir wissen wegen Eigenschaft 5, dass die Schwarzhöhe überall gleich ist.
Das heißt, die Schwarzhöhe des linken Kindes und des rechten Kindes sind ebenfalls identisch.
Und weil der Knoten hier, der Knoten X,
rot war, trägt er ja nichts zur Schwarzhöhe bei.
Das heißt, die Schwarzhöhe von X entspricht er des Rechten und des linken Kindes.
So, dann können wir das addieren und können sagen,
also die Kinder hier sind ja von der Höhe geringer als der Knoten selber.
Und wir können dann die Induktionsvoraussetzungen verwenden,
dass die Aussage bereits gültig ist für die Kinder.
Und wir sehen dann der Betrag von TX,
also die Anzahl der Knoten in dem Baum X.
Das ist einer, das ist der Clouden X selber
Plus die Anzahl der Knoten im linken Teil waren,
plus die Anzahl der Knoten im rechten Teil bauen.
Das ist alles, was unter X ist. Und das
ist größer gleich eins, das ist die Eins plus.
Und hierfür haben wir eine Schranke. Wir setzen jetzt die Induktionsvoraussetzung
ein. Das ist zwei Hochschwarzhöhe von X minus eins.
Das ist also das, was wir zeigen wollen.
Jetzt für einen Baum mit niedriger Höhe. Und für den
rechten Knoten das Gleiche. Das ist auch zwei Hochschwarzhöhe von X
minus eins. Wenn wir das alles addieren, steht da,
dass das größer gleich zwei hoch die Schwarzhöhe von X minus eins ist,
sogar abgeschätzt. Also es wäre sogar ein bisschen weniger,
aber Das können wir auf alle Fälle zeigen.
Und das war genau das, was wir zeigen wollten.
So, der zweite Fall ist jetzt, wir haben einen
schwarzen Knoten. Jetzt wissen wir nicht so genau,
jetzt geht da unten drunter der Baum weiter.
Wir wissen wieder die schwarze Höhe für alle Knoten ist ja gleich.
Also nicht für alle Knoten, aber für die Knoten,
die hier Kinder sind, ist er auf alle Fälle gleich.
Und das muss eins niedriger sein als für den Knoten X hier selber.
So, dann haben wir den Betrag von Teks,
also die Anzahl der Knoten, ist eins plus,
Anzahlknoten im linken Teilbaum plus, Anzahlknoten im rechten Teilbaum.
Und dafür setzen wir wieder die Schranken ein.
Dann haben wir eins plus zwei
Hoch, Schwarzhöhe von x minus eins, minus eins,
das ist für den linken Teilbaum, das Gleiche nochmal für den rechten Teilbaum,
wenn wir das addieren, kommt genau zwei hoch,
die Schwarzhöhe von x minus eins aus.
Damit haben wir also diese Ungleichung gezeigt und gezeigt,
dass es ein lugorithmisches Verhältnis zwischen der Höhe,
also der Schwarzhöhe und der Anzahl der Knoten im Baum gibt.
So, damit sind wir noch nicht ganz fertig,
aber fast, jetzt müssen wir noch zeigen, naja,
wie groß ist jetzt die Höhe des Gesamtbaums im Verhältnis zu der Sascha,
zu dieser Schwarzhöhe und wir wissen, naja, irgendeine rot-schwarzeigenschaft Nummer 4.
Keine zwei roten Knoten nebeneinander. Ist also die Höhe
des Gesamtbaums beschränkt durch zweimal die Schwarzhöhe der Wurzel.
Schwarzhöhe der Wurzel ist die größte Höhe, die wir haben.
Und dann jeder zweite Knoten könnte rot sein,
also die Höhe des Gesamtbaums, kleinerrecht zweimal, Schwarzhöhe der Wurzel.
Und ja, jetzt können wir das einfach umformen.
Sagen wir, N ist die Anzahl der Knoten,
die wir überhaupt in dem Baum haben.
Das ist größer gleich, zwei Hochschwarzhöhe der Wurzel,
minus eins, das haben wir ja oben gerade gezeigt,
was das der Fall ist.
Die Schwarzhöhe ist aber nur um einen Faktor zwei kleiner als die Gesamthöhe.
Das ist also größer, gleich zwei hoch die Höhe des
Baums,
Minus eins. Und wenn wir das umformen,
haben wir hier die Höhe von Tee, ist kleiner,
gleich zwei hoch der Logorithmus, zuweise zwei von N plus eins.
So, damit haben wir gezeigt, der Baum,
ein Rot-Schwarzbaum ist garantiert balanciert. Wir wissen es sogar noch etwas genauer.
Er ist bis auf einen Faktor zwei balanciert. Ja,
also wir wissen nicht nur, er ist EO von Login,
sondern wir sehen hier sogar die Konstante.
Der ist maximal um Faktor zwei unbalanciert. Also sie könnten auch sagen,
die Suchzeit, die sie benötigen,
ist maximal um einen Faktor zwei kleiner als das Optimum,
was man erreichen könnte,
weil wir wissen besser als Login können wir nicht werden
Okay, also es ist ein schöner Baum und er ist balanciert
, alles prima. Und jetzt ist lediglich die Frage,
ja, wie realisieren wir das Einfügen und das Löschen?
Die Suchoperation und Minimum und Maximum finden und all diese Dinge,
die ändern sich ja nicht. Das ist ja einfach nur
ein Suchbaum, der, wo diese Knoten Farben haben.
Und nur wenn wir in dem Baum Objekte einfügen oder löschen,
müssen wir dafür sorgen, dass diese rot-schwarzeigenschaften wieder gelten.
Also wir haben gesehen, rot-schwarzbaum mit Ennenknoten hat eine maximale Höhe von O von Log-in und ist somit balanciert. Das sollte hier großes M-Man. So,
wenn Tee ein Suchbaum ist, der die rot-schwarzeigenschaften erfüllt,
dann wissen wir die Operationen zur Suche, Minimum,
Maximum, Nachfolger finden, Vorgänger finden,
die laufen alle in Zeit O von H. Das haben wir schon gesehen,
also die hängen alle nur von der Höhe des Baums ab und die Höhe ist logorithmisch beschränkt,
das haben wir gerade gezeigt, also laufen die alle in Long M.
So, die Inside und die Lead-Operation selber,
die haben wir auch schon gesehen,
die laufen auch in Log N, ja,
weil die hängen ja auch nur von der Höhe ab,
die haben nur ein Problem, weil wenn wir ein Objekt einfügen,
dann müssen wir diesem Objekt ja auch eine Farbe geben,
dann müssen wir sagen,
du bist jetzt rot oder du bist schwarz
Und wir können dem Knoten nicht einfach irgendeine Farbe geben,
weil wir müssen ja sicherstellen, dass die Rot-Schwarzeigenschaften alle erfüllt sind.
Das heißt, wir müssen jetzt schauen,
dass wir nach dem Einfügen oder nach dem Löschen sicherstellen,
dass alle fünf Eigenschaften wieder erfüllt sind.
Und das macht einen Korrekturmechanismus,
der im Baum quasi durch minimale Veränderungen,
entweder durch Verändern der Farbe oder durch sogenannte Rotationen dafür sorgt,
dass wir die Balance wieder erreichen.
So, was ist eine Rotation?
Also die Rotation ist zunächst mal die wichtige Operation,
die wir zum Balancieren von Suchbäumen brauchen
Die macht folgendes. Also hier ist mal dein Baum,
die hängt auch gar nicht von Rot-Schwarz-Bäumen ab.
Die kann man in allen möglichen Bäumen machen. Wir haben
einen Suchbaum hier. Das ist ein Beispiel, eines Suchbaums.
Und wir sehen, der ist so ein bisschen rechtslastig,
unser Baum hier. Und was wir machen können,
ist, wir können diesen Baum lokal umorganisieren.
Und das machen wir hier an der Stelle zwischen Z und Y,
also zwischen diesen beiden Knoten her. Was wir machen ist,
wenn Sie sich das Ganze nochmal vorstellen, wie so ein Mobile,
dann stellen Sie sich es am besten so vor,
wir schneiden dieses Band hier ab.
Wir nehmen den Teilbaum und wir betrachten den Knoten hier drunter
als neue Wurzel und schieben das alles nach links rüber
Also wir schieben, wir drehen quasi hier entlang dieser Richtung. 18 wird einfach,
also der Knoten Y wird ein neues Kind des Vorgängers,
also von 7 und 11 wird dann ein Kind von 18 und dieser Teilbaum wird ungehängt.
So, das heißt, nach einer Rotation,
es ist eine Linksrotation, das sieht man schon im Fall,
bewegen in den Baum, den Teilbaum,
der ein rechtes Kind ist und machen ihn zum neuen Vorgänger
und drehen das Ganze links herum.
Also, die Vorstellung ist, wir schneiden das hier ab,
wir drehen diesen Teilbaum um eins nach links und nehmen diesen Teilbaum
und hängen den dann als Kind an diesen Knoten an.
Und der resultierende Baum ist dann dieser hier. Das ist
eine Linksrotation. Analog können die natürlich auch eine Rechtsrotation definieren.
Das wird dann eben andersrum gehen. Und sie sehen schon,
so eine Rotation ändert was an den Höhen,
weil das rechte Kind von diesen Knoten Y,
das rutscht jetzt ein Stück nach oben.
Das ist jetzt ein bisschen höher. Es ist nicht mehr
so weit weg von der Wurzel. Es war hier eins,
zwei, drei, vier, fünf.
Und jetzt sind es nur noch eins, zwei,
drei, vier Knoten. Das heißt, der Teil geht so
ein bisschen hoch und das linke Kind von dem Knotenset,
das rutscht nach unten
Das war vorher eins, zwei Kanten von der Wurzel entfernt.
Und das ist jetzt eins, zwei, drei Kanten von der Wurzel entfernt.
Und dieser Teil, der hier so in der Mitte ist,
das war also das linke Kind von dem Knoten Y,
das ändert sich nicht in der Tiefe.
Es hat jetzt eins, zwei, drei,
vier bis zu 17 und wir haben jetzt eins,
zwei, drei, vier wieder bis zu 17.
So, das heißt, mit so einer Balance,
mit so einer Rotation erzeugen wir ein bisschen Balance und zwar zwischen zwei Teilen,
zwischen diesem Teil hier,
dem linken Kind von Z und dem rechten Kind von Y.
Das verschiebt sich so ein bisschen.
Und es sieht ja auch schon
ein bisschen balancierter hier aus
So, okay, also mit dieser Operation können wir scheinbar in den Baum
eine Balance wieder herstellen. Und das kann nötig sein,
weil wenn sie in so einem Suchbaum hier immer die kleinen Zahlen löschen,
dann wird der Teil hier immer kleiner und dann müssen sie rearrangieren,
um wieder eine Balance herstellen zu können.
Okay, das ist unsere ganz wichtige Operation.
Und was man hier auch schon sieht, ist,
diese Operation wird konstante Zeit benötigen,
weil sie nur Zeiger hier im Umfeld von Z und Y ändert.
Hier ist der Pseudo-Code dieser Rotationsoperation dargestellt. Hier nochmal die Definition,
eine Rotation ist eine lokale Operation,
also Umsatz einer konstanten Anzahl von Zeigern in Suchbäumen, die die Suchbaumeigenschaft erhält.
Das ist natürlich noch eine ganz wichtige Eigenschaft. Also der
Baum muss natürlich einen Suchbaum bleiben. Und wir sehen,
dass das hier der Fall ist. Weil ja,
also wir sehen, das ist ja alles größer als Y
und das ist kleiner als Y und ja,
sie können das jetzt alles vergleichen und stellen fest,
dass das hinkommt und dass wir wieder eine Suchbaumeigenschaft haben.
Okay, das, was ich Ihnen eben am Bild
geschildert habe, sehen Sie hier als Pseudocode.
Y ist erstmal das rechte Kind von
Jetzt machen wir erstmal, ändern wir den,
lassen wir den linken Teilbaum vom Y zum rechten Teilbaum vom X werden,
also x.right ist y.left und wenn y.left ungleich tenil ist,
sonst heißt es ist kein Blatt,
dann wird der Parent wieder auf das X gesetzt.
Ja, wir müssen ja immer die Zeige in beiden Richtungen korrigieren.
Das ist der Schritt hier zwei und drei und das sehen
Sie hier an der, an den roten Markierungen hier.
Also das bezieht sich auf dem Pseudo-Code,
das ist also Schritt zwei, Schritt drei ändert es,
also Schritt zwei ändert diesen Zeiger,
Schritt drei diesen
Dann kommt die Verbindung des Vaters von X mit Y,
also Y, Parent wird experient, wenn der Nilknoten ist,
dann haben wir eine neue Wurzel erzeugt.
Kann ja sein, dass wir genau oben an der Wurzel drehen,
dann wird die Wurzel des Baums gesetzt auf Y,
anderenfalls, hier fehlt ein gleicher Zeichen.
Wenn X gleich X. Parent Left ist,
also wenn es ein linkes Kind ist,
dann wird X. Parent Left auf Y gesetzt und sonst ist es ein rechtes Kind,
dann wird X. Parent Right auf Y gesetzt.
Okay, und der letzte Operation ist,
dass wir X auf die linke Seite von Y schieben,
das heißt Y. Left wird X und X. Parent
Das ist hier wesentlich verwirrender als das Bild,
aber sie können das Schritt für Schritt nachvollziehen und dann passiert
genau das, was hier in dem Bild dargestellt ist.
Also wir rearrangieren den Baum. Gut, so,
das ist eine Rotation und diese Rotation, die müssen wir jetzt nutzen,
um die Rot-Schwarzeigenschaften in unserem Rot-Schwarzbaum wieder herzustellen. Ah,
Entschuldigung, jetzt habe ich eben gerade was Falsches erzählt,
also diese Nummern, das war gerade mit dem,
die Pseudo-Code-Nummer beziehen sich auf dieses Bild, nicht auf das davor.
Ja, das heißt also, Insider 2, 3,
2-4 Vier gibt's nicht, zwei, drei,
vier ist ein Kommentar,
wird dieser Teilbaum unter X gehängt in den Teilcode von 5 bis 10,
wird Y an den Vorgänger von X gehängt und in den Code-Teil 11 und 12 wird Y zu einem Kind von X.
Also ob das Bild bezogen wird durch die Nummer.
Okay. So, jetzt kommt die Einfüge-Operation. Für den
Rot-Schwarz-Warm. Der Code ist identisch von hier bis tatsächlich hier
bis zu diesem Kommentar mit der Einfüge-Operation in Suchbäumen,
die wir schon gesehen haben
Deswegen können wir hier einigermaßen schnell rübergehen. Also X ist
erstmal die Wurzel, wir müssen ja die Einfügepositionen suchen.
In Y merken wir uns immer den Vorgänger von X,
also den Elternknoten. Solange X nicht der Wächter ist,
solange wir also nicht an ein Blatt angekommen sind,
merken wir uns in Y den Knoten X und gucken dann,
ob der einzufügende Knoten hier vom Schlüsselwert kleiner ist,
dann gehen wir nach links, ist er größer,
gehen wir nach rechts.
Und wenn wir da angekommen sind, haben wir die Einfügeposition bestimmt,
der Parent von unserem neuen Knoten Z, hier wird auf Y gesetzt,
wenn Y nie ist, dann haben wir eine neue Wurzel,
dann wird die Wurzel des Baums auf Z-Gesetz.
Andernfalls setzen wir den Kindzeiger richtig,
also wenn Z-Key kleiner ist als der von Y,
dann haben wir ein linkes Kind, sonst haben wir ein rechtes Kind.
Die Kinder von Z sind beide, Neil,
das ist also ein neues, ja,
ist also der letzter Knoten, bevor nur noch zwei Wächterknoten kommen.
Und also bis hier alles identisch zu dem,
was wir schon gesehen haben. Und jetzt kommt das,
jetzt müssen wir es mit den Farben und mit den Rot-Schwarzbaum-Eigenschaften beschäftigen.
Erstens, wir setzen den Knoten auf Rot. Wir sagen,
der kriegt erstmal die Farbe Rot und dann haben wir eine,
zunächst mal noch mysteriöse Funktion, die heißt Red Black Insert Fix ab,
was die Macht ist, die sorgt dafür,
dass die Rot-Schwarz-Eigenschaften im Baum korrigiert werden.
Also die müssen wir einfügen in unseren balancierten Suchbaum,
also in unseren Suchbaum, in die Suchbaum-Datenstruktur,
um die Balancierung wieder zu korrigieren.
So, wir schauen uns an, was jetzt passiert ist.
Also wir haben einen Knoten eingefügt in den Suchbau und wir haben ihn rot gefärbt.
Der Knoten ist relativ weit unten im Baum und der kann
allerdings jetzt doch einigen Schaden angerichtet haben in unsere rot-schwarzeigenschaften.
Hier sind noch mal unsere fünf Eigenschaften. Die kommen jetzt
noch zwei, dreimal, damit sie sich gut daran erinnern.
Und wir gucken mal, welche Eigenschaften verletzt sein können.
Wie gehen die der Reihe nach durch?
Das erste war, jeder Knoten ist entweder rot oder schwarz.
Diese Eigenschaft ist offensichtlich erfüllt. Die mag ihn zum jetzigen Zeitpunkt
relativ banal vorkommen. Also ich meine, warum muss man
das immer so betonen? Wir werden sehen,
dass wir genau mit einer Verletzung dieser Eigenschaft nachher löschen können.
Aber dazu später. Also im Moment ist es erstmal
noch alles ganz einfach
Gesundheit. Der Knoten, den wir eingefügt haben,
ist rot. Jeder Knoten ist entweder rot oder schwarz.
Die Wurzel ist schwarz. Diese Eigenschaft könnte bereits verletzt sein.
Warum? Naja, mal angenommen, unser Baum war komplett leer.
Dann haben wir nur einen Knoten eingefügt. Das war unser
neuer Knoten. X. Den haben wir eingefügt. Und den
haben wir ja rot gefärbt. Der ist jetzt ja Wurzel.
Also die Eigenschaft könnte tatsächlich verletzt sein. Im allerersten Schritt,
wenn wir in einen leeren Baum einen Knoten einfügen. Die Eigenschaft drei,
jedes Blatt, das sind unsere Wächterknoten, ist schwarz,
die ist erfüllt, weil Westerknoten sind für uns immer schwarz.
Da gibt es Das ist alles klar. So,
für jeden roten Knoten gilt, beide Nachfolger sind schwarz.
Diese Eigenschaft kann verletzt sein,
weil wir haben einen roten Knoten eingefügt und wir wissen ja nicht,
welche Farbe der Knoten hatte, der da drüber war.
Der Knoten darüber, der Vorgängerknoten, der könnte ja auch rot gewesen sein.
Und dann wäre diese Eigenschaft verletzt. Das heißt,
dass sowohl der Knoten Z, das ist ja der,
den wir eingefügt haben, der ist rot und der Vorgänger
ist vielleicht auch rot und dann wäre die Eigenschaft verletzt.
So, dann haben wir noch die fünfte Eigenschaft für jeden Knoten.
X gilt alle Pfade von X zu einem Platz,
enthalten die gleiche Anzahl schwarzer Knoten
Diese Eigenschaft ist okay. Die ist in Ordnung,
weil wir haben nur einen Knoten eingefügt und den haben wir ja rot gefärbt.
Und dadurch, dass wir ihn rot gefärbt haben,
haben wir ja die Schwarzhöhe nicht verändert von den Knoten.
Und deswegen ist das in Ordnung. Also die Anzahl der
, die Schwarzhöhe ist in Ordnung. Das heißt,
am Ende nach unserer Einfüge-Operation ist entweder Eigenschaft 2 verletzt,
wenn Z hier gerade die Wurzel war oder die Eigenschaft 4 könnte verletzt sein.
Sie muss nicht, weil sie könnte verletzt sein. Okay,
so, wie werden wir jetzt vorgehen, um diesen Baum zu reparieren?
Wir werden uns von der Position Z aus nach oben bewegen.
Denn das Gute ist, was man hier schon sieht,
der Baum ist nicht im Ganzen kaputt,
sondern der ist nur lokal an der Stelle defekt.
Also den einzigen Defekt, den wir sehen,
ist entweder an Z oder an dem Vorgänger von Z. Aber
der ganze Rest selbst, alle anderen Knoten erfüllen diese rot-schwarzeigenschaften.
Das heißt, wir können uns diese Stelle anschauen und von
der entsprechend nach oben versuchen, diese Eigenschaft zu reparieren.
Wir werden also jetzt, genau wie wir das auch noch vom Hieb kennen,
uns im Baum so langsam durchnavigieren und so eine Fehlstelle,
also einen Fehler in unserer Struktur, nach oben schieben,
Hieb haben wir es nach unten geschoben.
Hier schieben wir den Fehler nach oben und versuchen quasi den hochzuschieben bis zur Wurzel.
Warum machen wir das? Also wenn die Eigenschaft zwei verletzt
ist, dann ist es sowieso schon die Wurzel.
Okay, dann ist es auch nicht so schwierig,
das zu reparieren. Wenn diese Eigenschaft vier verletzt ist,
haben wir zwei rote Knoten, die benachbart sind.
So, diesen Fehler in dem Baum schieben wir langsam nach oben.
Schritt für Schritt, immer weiter nach oben. Wenn wir
an der Wurzel angekommen sind, haben wir die Situation,
dass ein Knoten und die Wurzel
rot sind
Die Wurzel hat die ganz besondere Eigenschaft,
dass sie in jedem Pfad vorkommt, den Knoten,
naja, sie kommt nicht in jedem Kneipp-Vorhat vor,
aber die Wurzel hat die Eigenschaft, den können wir schwarz färben,
ohne dass wir die Eigenschaft 5 verletzen.
Dazu können wir uns nochmal ein Bild von dem Baum anschauen.
Also stellen Sie sich vor, dieser Knoten hier wäre rot,
das ist die Wurzel. Dann könnten wir den einfach schwarz färben,
das würde nichts ändern, weil alle Pfade,
die hier lang gehen, enthalten ja quasi diesen Wurzelknoten.
Das heißt, von der Wurzel können wir ganz einfach
die Farbe ändern und können sagen, okay, Fall,
dass der wirklich rot wäre, machen wir das einfach schwarz.
Es würde die Eigenschaft 5 nicht verletzen. Deswegen schieben wir
unseren Fehler, die Eigenschaft 4, zwei Knoten,
benachbart sind, rot, so langsam nach oben.
Und wenn wir oben angekommen sind, fähren wir einfach die Wurzel schwarz.
Und dann sind wir fertig. Dann ist die Eigenschaft
via repariert. Okay, so werden wir das machen.
Und jetzt gucken wir uns die Funktion an. Das ist
der Pseudo-Code für die Reparaturfunktion. Und wir machen das jetzt
in drei Stufen. Ich zeige ihnen erst den Pseudo-Code,
dann werden sie mir wahrscheinlich noch nicht glauben, was funktioniert.
Dann werden wir uns einzelne Fälle genau anschauen.
Danach werden sie mir wahrscheinlich glauben, dass es funktioniert.
Und dann werden wir uns den Beweis anschauen und danach müssen sie glauben,
dass es funktioniert. Ich habe ihnen immer rechts,
wir werden diesen Code jetzt eine ganze Weile lang sehen,
immer rechts ein Beispiel hingemalt, weil sowas ist extrem schwierig im Kopf nachzuvollziehen.
Und dann habe ich immer ein Beispiel und dann sehen sie, wie das funktioniert.
Streng genommen sehen sie hier nur 50 Prozent des Pseudocodes,
weil sie sehen, also das ist unsere Reparaturfunktion,
die hat so eine Wildschleife und die läuft so lange,
der Vorgänger von Z noch rot ist, dann haben wir diese Rot-Rot-Konstellation,
die wir nicht wollen und schieben das so langsam hier nach oben.
Und wenn die Wildschleife nicht mehr oder die Bedingung der Wildscheife
nicht mehr erfüllt ist, dann haben wir sozusagen unser Ziel erreicht.
Dann sind wir an der Wurzel angekommen oder wir haben irgendwie es geschafft,
zwei wie Benachbarung von zwei roten Knoten aufzulösen. So,
die erste Fallunterscheidung, die wir machen, das ist die,
wir gucken, ob der Vorgänger von Z,
also hier ist Z, hier ist Z.p,
das ist der Vorgänger, der Parent und hier ist Set.p.p,
das ist der Vorgänger von Vorgänger.
Das ist also, das sind sie, das ist ihre
Vater oder Mutter und das ist ihre Opa oder Oma.
So, okay, so. Also das Erste,
was wir mal gucken, ist,
ob der Set.p ein Link ist oder ein rechtes Kind ist.
Wir sehen in diesem Beispiel, ist es ein linkes Kind.
Das ist für uns im Folgenden wichtig,
weil das mit der Art und Weise, wie wir rotieren,
zu tun hat. Also das ist ein linkes Kind und hier
sehen Sie den ganzen Pseudo-Code für das linke Kind.
Jetzt kann natürlich der Vorgänger von Z auch ein rechtes Kind sein.
Der könnte ja auch hier stehen. Dafür müssen wir
all das nochmal machen. Allerdings müssen wir immer dann,
wenn wir rechts mal links sagen,
es ist dann einfach nur alles Spiegel verkehrt
Der ganze Pseudo-Code ist der gleiche. Es ist nur
alles Spiegelverkehr. Immer, wenn ihr links steht,
ist es rechts, wenn rechts steht, ist es links.
Deswegen steht das hier nicht mehr drunter. Also eigentlich steht es
hier nicht mehr drunter, weil es sich auf die Folie gepasst hätte.
Aber es ist auch nicht wichtig, das hier nochmal hinzuschreiben,
weil es ist absolut identisch mit dem Teil.
Alles, was links ist, ist rechts und umgekehrt.
Das steht hier. Also der El-Sale ist wieder dein Teil,
aber wird vertauschen rechts und links.
Okay, also wir betrachten nur die Situation.
Der Vorgänger hier ist jetzt so ein linkes Kind.
Also Z kann hier immer noch auf beiden Seiten sein,
aber der hier ist auf alle Fälle ein linkes Kind.
Eine ganz entscheidende Rolle in den folgenden Betrachtungen wird der Onkel spielen.
Der Onkel von Z, also der Vater, Opa,
ist der Onkel oder Mutter, Oma, Tante, wenn sie so wollen.
Also der hier, der wird eine entscheidende Rolle spielen.
Den werden wir die ganze Zeit betrachten. Und wenn wir es hinkriegen,
dass wir eine ganz spezielle Konstellation haben,
dann können wir mit einer Rotation die Rot-Schwarzeigenschaften reparieren.
Ich sage Ihnen schon mal, wie das aussehen muss.
Ja, was wir erreichen müssen ist, Z muss links sein von seinem Vorgänger.
Rot, Rot und der Onkel muss schwarz sein.
Und in der Konstellation können wir es reparieren. In den anderen Konstellationen noch nicht,
da müssen wir irgendwie erst noch ein bisschen schieben und drehen,
um es irgendwie irgendwie in den Zustand zu kommen,
dass wir tatsächlich Z auf der linken Seite haben,
rot-rot-schwarz, den Zustand müssen wir erreichen.
Okay, so, also, wir beginnen mit dem ersten Fall,
ja, also wir wissen schon, wir sind jetzt hier unten,
na hier ist der Knoten Z, hier ist unser Onkel,
ne, und der erste Fall ist, der Onkel hier ist rot.
Wenn der Onkel rot ist, dann spielt es gar keine Rolle,
ob Z ein linker oder ein rechter Nachfolger ist,
ja, also der ist jetzt irgendwie rot.
Was machen wir in dem Fall? In dem Fall machen wir
Folgendes, hier steht also Onkel ist droht, ja.
Wir ändern einfach ein paar Farben. Wir sagen jetzt,
okay, von Z der Vorgänger, also der hier,
den färben wir jetzt einfach mal schwarz,
den Onkel färben wir auch schwarz, ja,
und den Vorvorgänger von den beiden, den färben wir rot.
Das ist der mit der Knoten mit der Sieben.
Also sie sehen hier, nachdem wir das ausgeführt haben,
sieht dieser Baum so aus und er hat seine Struktur gar nicht geändert.
Wir haben nicht rotiert, wir haben nur ein paar Farben
umgesetzt, ja, in dem Baum.
Okay, warum wissen wir eigentlich, dass dieser Knoten überhaupt
schwarz ist,
der hier
Ja, ist natürlich erstmal eine Frage. Wir tun dann so, als wenn der,
hier sieht das aus, ja, ist ja schwarz.
Klar ist ja ein Bild schwarz, aber wieso ist der eigentlich schwarz?
Könnt ihr vielleicht auch rot sein? Nein,
der kann nämlich nicht rot sein,
weil der Onkel ist ja rot, ja, und wir wissen,
es kommen in dem Rot-Schwarz-Waum keine zwei benachbarten roten Knoten vor,
außer diese eine Stelle, die ja kaputt ist,
die wir hier durch den Baum bewegen, ja.
Das heißt, hier ist der Onkel und das ist ein
Vorgänger und an der Stelle war der Rot-Schwarz-Waum in Ordnung,
das heißt, der war auf alle Fälle schwarz.
So, dann haben wir jetzt ungefärbt und hier können sie schon sehen,
dass wir durch diese Umorganisation der Farben zumindest an den Schwarzhöhen nichts verändert haben.
Die Schwarzhöhen sind uns heilig, ja. Wenn wir die Schwarzhöhen,
wenn wir die Eigenschaft fünf kaputt machen, haben wir ein großes Problem.
Wir werden immer versuchen, dass diese Eigenschaft erhalten bleibt.
So, und wir sehen, wenn Sie mal gucken,
also hier könnte ja Beliebiges drunter hängen an den Knoten.
Da kann auch beliebiges hängen. Und wenn Sie hier
von hier oben kommen, Sie in diesen Teilbaum rein.
Und Sie sehen, Sie haben hier immer eins,
zwei schwarze Knoten, eins, zwei, bis es dann irgendwie weitergeht.
1, 2 und dann geht es weiter.
Und durch diese Umwerbung haben Sie das nicht geändert.
Es sind immer noch genau zwei schwarze Knoten,
bevor es weitergeht
2, 1, 2 auf jeden der Pfade.
Das heißt, die Schwarzhöhen haben sich nicht verändert.
Das ist auch nachher das wesentliche Argument in dem Beweis,
wenn man dann zeigt, dass das funktioniert.
Okay, wir haben jetzt ein bisschen was getan und
man fragt sich, warum haben wir das überhaupt gemacht?
Ja, es ist irgendwie, jetzt haben wir so ein bisschen ungefärbt,
okay, wir haben einen ganz entscheidenden Schritt geschafft.
Wir haben nämlich geschafft, dass der Onkel schwarz ist.
Nachdem wir das Ganze gemacht haben, sehen wir Z,
ist jetzt hier, das ist jetzt auch ein bisschen ein anderer Knoten,
das ist aber jetzt gar nicht so erheblich,
so ein bisschen weiter oben.
Aber der Onkel ist schwarz. Ja, wir haben
einen anderen, wir sind in einen anderen Modus gewechselt.
Wir sind den roten Onkel los
Rote Onkel sind auch unangenehm. Okay, so. Also,
jetzt kommt der Fall 2. Wir sind hier in dem L-S-Teil,
der unser Onkel hier ist, nicht mehr rot.
Also der IF-Teil war, Onkel war rot,
jetzt ist der Elstei, Onkel ist schwarz.
Hier sehen wir unseren Knoten-Set. Y ist der Onkel.
Was machen wir? Wir gucken,
ob Z ein Rechter ist oder ein linkes Kind ist.
Wenn Z ein rechtes Kind ist, dann haben wir diese Konstellation,
wie hier, also Z ist ein rechtes Kind seines Vorgängers.
Und das ist noch ungünstig, das können wir noch nicht reparieren.
Das wissen Sie noch nicht, das sage ich Ihnen jetzt.
Und wir müssen irgendwie schaffen, das Z hier irgendwie auf die andere Seite.
Wir können das natürlich nicht auf die andere Seite kopieren,
dann wäre die Sucheigenschaft verletzt. Aber irgendwie müssen wir
diese Konstellation umdrehen. Sonst hätte es ein rechtes Kind.
Beachten Sie, der Knoten ist auf alle Fälle schwarz.
Muss er sein, weil hier war die Rot-Schwarz-Eigenschaft nicht verletzt.
Nur der hier, hier kann es rot-rot sein.
So, was machen wir? Naja,
wir haben ja unsere Rotationsoperation und wir machen einfach mal eine Linksrotation
an diesem Knoten-Set und schieben damit den Baum nach links rüber.
Der Knoten-Set, der würde jetzt eigentlich eine Etage nach oben
wandern und zwei wandert hier runter.
Und der Teilbaum wird nur umgehängt auf die andere Seite
und wir halten diesen Baum
Z ist jetzt hier hochgewandert und das ist jetzt nicht mehr
das Z, was wir eigentlich haben wollen,
sondern wir wollen das Set auf der gleichen Ebene haben.
Deswegen machen wir folgendes, bevor wir drehen,
setzen wir Z auf den Vorgänger von Z.
Und dann drehen wir. Und dann ist Z dieser Knoten her.
So, das ist die Konstellation, die wir suchen.
Also wir haben rumarrangiert, um genau dieses Szenario zu erreichen.
Wir haben einen Knoten Z, der ist rot,
der ist ein linkes Kind seines Vorgängers,
der ist auch rot und der Onkel ist schwarz.
Das wollten wir erreichen. Und warum wir das erreichen wollen
, sehen Sie jetzt.
Jetzt kommt der dritte Fall
Wir haben dieses Szenario und jetzt kommt die Reparatur. Ja,
jetzt können wir die Eigenschaft heilen. Was wir machen ist,
wir sagen, okay, wir gehen Vorgänger von dem Knotenset,
den färben wir jetzt schwarz, also diese sieben.
Jetzt erst mal Gefahr, Gefahr, Schwarze Söhne haben sich geändert,
wir haben ein Knotenschwarz gefärbt. Aber wir machen Folgendes,
wir nehmen den Vorvorgänger von Z, dass die Elf,
und den färben wir rot, haben wir schon wieder,
da haben wir die Schwarzhöhen schon wieder korrigiert.
Und jetzt machen wir eine Rechtsrotation an dem Vorvorgänger und
der Baum, der resultiert,
ist dieser hier
So, und jetzt sehen wir zwei entscheidende Dinge.
Das erste ist, unsere Eigenschaft 4 ist nicht mehr verletzt.
Wir haben keine zwei roten Knoten mehr, die benachbart sind,
weil der Vorgänger von Z ist jetzt schwarz.
Das erste, was wir sehen. Die nächste Eigenschaft,
die wir sehen, ist, wenn wir mal wieder die Schwarzhöhen betrachten,
wir laufen hier rein, dann sehen wir alle Pfade,
die durch diesen Teilbaum gehen, haben zwei schwarze Knoten.
1, 2, hier geht es weiter.
1, 2, hier geht es irgendwie weiter.
Immer zwei schwarze Knoten
Das geht in dem neuen Baum auch. Wir kommen von hier
rein. Jeder Pfad durch den Baum hat zwei schwarze Knoten.
Eins, zwei und hier geht es irgendwie weiter.
Eins, zwei geht es hier weiter. Das heißt,
wir haben die Schwarzhöhen nicht, die verändert.
Und damit haben wir dafür gesorgt, dass die Eigenschaft fünf,
alle Schwarzhöhen sind gleich, erhalten geblieben ist.
Okay. So, damit sind wir so gut wie durch.
Also in der nächsten Iteration würde in dieser Wire-Schleife diese Eigenschaft nicht mehr gelten.
Der Vorgänger von Z ist ja jetzt schwarz.
Die Wildschleife würde beendet und wir würden zur Teile 16 sprechen.
Ja, das ist die Reparaturoperation, die es hier gibt
Und jetzt sollten sie grob das Gefühl haben,
dass es funktionieren kann. Es reicht natürlich noch nicht.
Man muss jetzt wirklich zeigen, dass es korrekt ist.
Die Argumente habe ich ihnen alle schon geliefert. Also so
argumentativ sind wir eigentlich schon da, wo wir sein wollen.
Wir müssen es nur noch mal ordentlich aufschreiben,
um zu sehen, dass das auch korrekt ist. So,
so einen Beweis führt man mit einer Innenvariante über die Schleife,
über diese Wildschleife, die äußere, die da rüber geht und die rot-schwarzeigenschaften reparieren wird.
Diese Innenvariante sieht wie folgt aus
Drei Eigenschaften, also drei Teile. Die erste Eigenschaft ist,
wir wissen, dass zu jedem Zeitpunkt die Farbe von
unserem Knoten Z, den wir betrachten, rot ist.
Ja, ist ja klar, wenn der schwarz wäre,
dann könnten wir aufhören. Also wir haben ja gerade den
Quoten rot eingefügt und das ist ja das Problem und den
schieben wir da rum und irgendwie wollen wir ja,
dass der schwarz wird.
Also wir wissen, der ist immer rot, ja,
der Knoten. Wenn der Vorgänger von Z die Wurzel ist,
könnte ja sein, dann ist die Farbe des Vorgängers schwarz.
Diese Eigenschaft brauchen wir, um zu sehen,
dass wir die Wurzel nicht manipulieren, dass also die Eigenschaft zwei immer korrekt bleibt.
So, und dann kommt hier die zwei Problemfälle der Rot-Schwarze-Eigenschaften,
die verletzt sein können. Es gibt maximal eine Verletzung der Rot-Schwarze-Eigenschaft,
und zwar entweder ist Eigenschaft zwei verletzt,
dann ist aber Z die Wurzel und die Wurzel wurde rot gefärbt.
Beachten Sie, diese Aussage ist über den Vorgänger von Z.
Diese Aussage ist über den Knotenset selber.
Also siehst du, sie sagen, hö,
das ist ja hier oben ist schwarzer, ist rot.
Also hier ist der Vorgänger die Wurzel, hier ist der Knotenset selber die Wurzel.
Entweder das ist der Fall oder die Eigenschaft vier
ist verletzt und die Farbe von Z ist rot,
klar, das haben wir schon gesagt.
Und die Farbe des Vorgängers ist auch rot.
Das sind, das ist die Innenvariante, die gilt.
Und die besagt, insbesondere, dass alle anderen rot-schwarz-Eigenschaften an
allen anderen Knoten im Baum korrekt sind. Das ist eigentlich,
also eigentlich ist das Wichtige, das was nicht dasteht.
Also die Verletzung ist nur an dieser einen lokalen Stelle.
Alles andere ist okay. Und das bedeutet auch im Beweis,
wenn wir jetzt gucken, dass das richtig ist,
dass wir uns alles andere immer anschauen müssen.
Wir müssen auch gucken, dass die Eigenschaft 5
insbesondere gleiche Schwarzhöhe immer erhalten bleibt durch unsere Operation
So, so eine In-Variante, die beweist man,
indem man zeigt, dass sie zur Initialisierung der Schleife,
also am Anfang der Schleife korrekt ist, bei der Terminierung,
wenn die Schleife beendet ist und mit jedem Schleifendurchlauf.
Schwierig ist offensichtlich die Schleifendurchläufe und wir machen das natürlich so,
wir machen erstmal die einfachen Teile. Wir machen erstmal die Initialisierung,
die Terminierung und dann gucken wir uns an, was in einem Schleifendurchlauf passiert.
Okay, also zum Zeitpunkt der Initialisierung,
der Algorithmus hat gerade den Knoten X eingefügt,
der hat den gerade rot gefärbt und sagt, so,
jetzt reparier mal, das ist der Zeitpunkt zu dem wir uns jetzt gerade,
indem wir uns gerade befinden.
Und jetzt müssen wir gucken, dass das alles gilt.
Also der Knoten ist rot, klar,
den haben wir eingefärbt und eingefügt und rot gefärbt.
Die zweite Eigenschaft, für die gilt, naja,
wenn der Vorgänger von uns ja tatsächlich die Wurzel sein sollte,
könnte ja sein, kann sein.
Also dann ist es aber so, diesen Knoten haben wir überhaupt nicht verändert.
Ja, also wir haben ja nur einen roten Knoten eingefügt,
aber wenn der die Wurzel sein sollte,
dann ist dieser Knoten auf alle Fälle schwarz, weil der war ja vorher schwarz.
Vorher waren ja die rot-schwarze Eigenschaften erfüllt, Wurzel war schwarz,
wir haben die Wurzelfarbe gar nicht geändert,
ist also immer noch schwarz
Also die Eigenschaft 2 gilt auch. Die Eigenschaft 3. Hier
sehen Sie genau den Punkt, dass alles andere gilt.
Das müssen wir immer zeigen. Wir haben schon gezeigt,
auf ein paar Seiten vorher, dass sie Rot-Schwarze-Eigenschaften 1,
3 und 5 erfüllt sind.
Auf Holie 25 können wir noch mal gucken. Hier haben wir
uns die Rot-Schwarze-Eigenschaften angeguckt. Hier ist zwischen hinter 1,
3 und 5 ist der Haken. Da habe ich Ihnen
gezeigt, dass die Eigenschaften auf alle Fälle erfüllt sind.
Das haben wir hier argumentiert. Wenn Sie so wollen,
ist das quasi ein Teil des Beweises.
Und jetzt müssen wir, jetzt wissen wir,
es sind nur Eigenschaft 1 oder 2 verletzt
Und auch das finden sie natürlich schon auf Folie 25.
Das oder das hier gelten muss. Okay, so,
also am Anfang ist die Situation, wie hier beschrieben, in der Innenvariante.
Jetzt kommt die Zerminierung. Also die Waldschleife, die lief
jetzt die ganze Zeit. Wir gehen mal davon aus,
dass die Innenvariante die ganze Zeit erhalten geblieben ist.
Das wissen wir noch nicht, aber davon gehen wir mal aus.
Und jetzt ist die Waldschleife beendet. So, wenn die Waldschleife
beendet ist, dann ist die Schleifenbedingung nicht mehr erfüllt.
Also die Bedingung, die in dem Wild steht,
wenn wir gerade mal gucken, also hier können sie hoffentlich lesen.
Also hier steht, dass der Vorgänger von P rot ist.
Die Bedingung ist nicht mehr erfüllt. Deswegen wird die Schleife
ja beendet
Was gilt jetzt? Naja, es könnte sein,
dass Z die Wurzel ist. Wir sind also bis nach
ganz nach oben gelaufen. Und wenn dem so ist,
dann ist der Vorgänger von Z ein Wächterknoten und die Wächterknoten sind immer schwarz.
Also das ist hier als Hinweis reingeschoben,
weil hier natürlich ab und zu immer vom Vorgänger von Z
die Rede ist und ist die Frage,
wer soll das denn sein, wenn wir die Wurzel haben?
Das ist dann auch ein Wächterknoten und der ist schwarz.
So, hier die rot-schwarzeigenschaften zur Wiederholung,
alle fünf Eigenschaften nochmal. So, die rot-schwarzeigenschaften 1,3 und
5 sind erfüllt
Warum sind die erfüllt? Weil sie waren ja am Anfang nicht verletzt.
Die In-Variante hat sichergestellt, dass sie in der Iteration,
in der Bearbeitung der Streife nie verletzt wird.
Und das ist natürlich am Ende auch nicht verletzt.
Also 1, 3 und 5 sind erfüllt.
Wir gucken uns die Eigenschaften 2 und 4 an.
Wenn die Farbe des Knotens rot ist und die Farbe des Vorgängers Schwarzes,
dann wissen wir, dass die Eigenschaft 4 nicht mehr verletzt sein kann.
Die Eigenschaft 4 war ja nur an der Stelle zwischen Z
und ZP verletzt. So, das heißt,
wir wissen, Eigenschaft 4 ist nicht mehr verletzt,
aber Eigenschaft 2 kann noch verletzt sein
Und dafür brauchen wir die letzte Zeile des Pseudo-Codes,
die ich hier noch nicht gezählt habe,
in Zeile 16, stellen wir Eigenschaft 2 her.
In Zeile 16 färben wir einfach die Wurzel wieder schwarz.
Das ist genau der Punkt, den ich eben schon erwähnt habe,
die Farbe der Wurzel können wir immer auf schwarz setzen,
weil die Wurzel quasi die Schwarzhöhe von den Knoten einheitlich erhöht.
Okay, so, das heißt,
wir folgern aus der Korrektheit der Innenvariante,
dass wir nach der Ausführung dieser Operation
einen korrekten Rot-Schwarzbaum haben
Ja, das sehen wir an dieser Stelle. Wir sehen,
die Innenvariante bleibt erhalten, das haben wir noch nicht gezeigt,
aber wenn sie erhalten bleibt, dann wissen wir Eigenschaften 1,
3, 5 sind erfüllt,
Eigenschaft 4 haben wir repariert, ist nicht mehr verletzt,
Eigenschaft 2 könnte verletzt sein, aber das bedeutet nur,
die Wurzel ist rot, wenn die Wurzel rot ist,
dann färben wir sie schwarz und die Eigenschaften sind alle erfüllt.
So, der schwierige Teil ist jetzt natürlich zu zeigen,
dass die Wildschleife im Inneren immer die Innenvariante erhält.
Und dafür müssen wir wieder diese Fälle ein nach den anderen durchgehen und zeigen,
dass immer alle Eigenschaften des Rot-Schwarz-Baums erhalten bleiben.
Okay, wir gucken uns die Fälle also jetzt noch einmal an.
Ein drittes Mal. Ich hoffe, sie verinnerlichen die so langsam.
Das ist nämlich der didaktische Zweck, dass ich das so mache.
Ja, also wir gucken uns die drei Fälle nochmal an jetzt.
Okay, also. Bevor wir das machen,
wir werden immer vom Z-Opa hier reden,
also vom Z-Parent-Parent, also Vorgänger, vom Vorgänger von Z.
Und die Frage stellt sich natürlich, gibt es den immer?
Könnte ja sein, dass der gar nicht existiert.
Das wäre ein bisschen blöd, weil mit dem argumentieren wir
nämlich hier unten
Den muss es also geben. Und das kann man sehen,
dass es den gibt. Warum? Naja, wir wissen,
der Vorgänger von Z ist ja rot. Wir wissen auch,
dass der Vorgänger von Z noch nicht die Wurzel ist.
Und deswegen, weil es noch nicht die Wurzel ist, gibt es natürlich den Vorvorgänger.
Da gibt es ja noch einen Knoten darüber. Okay,
so, also Fall 1. Wir haben wieder diese Konstellation hier,
die war auch schon so auf dem Bild mit dem Pseudo-Code.
Wir haben den Knoten-Set. Wir haben diese Rot-Rot-Konstellation, Zettis rot.
Der Vorgänger von Z ist rot und der Onkel ist rot.
Das war Fall 1, den wir gesehen haben.
Und Fall 1 haben wir geändert, indem wir nur Farben geändert haben. Wir sehen,
wir haben einfach A und D,
also den Vorgänger von Z und den Onkel,
die haben wir einfach schwarz gefärbt und den Vorvorgänger von Z,
den Opa hier, den haben wir rot gefärbt und sind dann
zwei Schritte nach oben gegangen und haben dann hier mit dem Z weitergemacht.
So, wir müssen prüfen, dass unsere In-Variante gilt,
nachdem wir diese Operation gemacht haben
Okay, was wissen wir? Wir wissen,
der Vorgänger vom Vorgänger von Z ist schwarz.
Warum? Naja, weil der Onkel rot war.
Onkel war rot, deswegen muss der hier schwarz sein.
Und ja, jetzt kommen keine zwei roten, die Knoten,
die benachbart sind. Und deswegen kann der, muss ja
auf alle Fälle schwarz sein. So, die Nachfolger,
die heißen hier, sind wir griechisch von Alpha bis Ypsilon bezeichnet,
eine Alphabetta Gamma Delta Ypsilon.
Das sind alles Teilbäume, die sind hier drunter.
Die Nachfolger Alpha bis Ypsilon von den ganzen Knoten
hier von Z und von dem Vorgänger von Z,
das ist ja der und von Y,
von dem Onkel
Die, die sind alle schwarz und haben die gleiche schwarze Höhe.
Warum sind die schwarz? Naja, weil den roten Knoten
folgen keine schwarzen Knoten. Und die einzige Verletzung der rot-schwarz-Eigenschaft
haben wir zwischen dem Knotenset und seinem Vorgänger.
Deswegen ist hier unten alles erst mal schwarz und die Schwarzhöhe
ist in Ordnung. So, Ben, Set-Strich,
der Wert der Variablen Set nach Ausführung der Iteration ist.
Also wir müssen jetzt Z und dann ändert ja Z
den Wert während der Algorithmus läuft.
Und wir sagen mal, Set-Strich ist das, was nachher ist.
Es ist neue Z. Also nachdem der Algorithmus durchgelaufen ist.
Dann müssen wir erstens zeigen, Z hat die Farbe rot.
Okay, das ist offensichtlich so
Vorvorgänger gesetzt und den haben wir gerade rot gefärbt.
Also ist diese Eigenschaft erfüllt? Ist der erste Teil der Innenvariante.
Zweiter Teil der Innenvariante ist, wenn der Vorgänger von Z
die Wurzel ist, dann ist dieser Wert schwarz. Ja,
das wissen wir sofort, dass das gültig ist,
weil der Vorgänger von dem Z-Strech, das ist irgendwie der Vor-vor-Vorgänger,
also der Urgroßvater, wenn sie so wollen,
von Z und an dem haben wir ja gar nichts gemacht.
Und wenn das zufällig die Wurzel sein sollte, okay,
die war ja vorher schwarz, dann ist sie nachher auch
schwarz.
Kann nichts
passiert sein
Der schwierige Teil ist der dritte Teil, der Innenvariante.
Hier ist nur nochmal das Bild wiederholt,
dann willst du dir das vor Augen haben.
Der dritte Teil ist, wir müssen zeigen,
es gibt maximal eine Verletzung der Rot-Schwarz-Eigenschaft. Entweder Eigenschaft 2,
dann ist aber TVZ die Wurzel und die Farbe davon ist rot.
Das ist irgendwie komisch. Da muss wahrscheinlich Tee von Root z-gleich
Tee von Root gleich Z stehen. Das ist ein
Dreher drin
T.root gleich Z muss da stehen. Das müssen wir ja zeigen.
So, okay, also, wir wissen Eigenschaft 1,
3 und 5 sind nicht verletzt worden. Wichtig ist da insbesondere,
also Eigenschaft 1 und 3 ist trivial,
Eigenschaft 1 ist jeder Knoten ist rot oder schwarz,
Eigenschaft 3 ist, alle Blätter sind schwarz, klar,
das ist alles erhalten geblieben.
Wichtig ist Eigenschaft 5, Schwarzhöhe ist überall gleich.
Die Eigenschaft ist nicht verletzt und das sieht man an der Zeichnung,
so wie ich es ihnen eben beschrieben habe.
Alle Pfade, die hier durchlaufen, wenn sie hier durchgucken,
haben vorher und nachher einen schwarzen Knoten
Ja, das heißt, die Schwarzhöhe haben wir nicht verändert.
Das liegt daran, weil wir die zwei zwar schwarz gefärbt haben,
aber den Vorgänger dafür ja wieder rot.
Wir haben es also verteilt. Okay, so,
was gilt sonst noch? Also angenommen der Knoten-Z-Strich sei jetzt
tatsächlich die Wurzel, kann ja sein. Dann gilt,
seit Strich hat die Farbe rot und die Eigenschaft zwei ist verletzt.
Dann haben wir diesen ersten Teil der Innenvariante.
Wir wissen aber, und das ist das Entscheidende,
dass Eigenschaft vier nicht mehr verletzt ist,
weil der Vorgänger davon ist schwarz und damit ist die Eigenschaft
vier nicht mehr verletzt
Ja. Okay, und der zweite Fall ist,
wir sind nicht oben angekommen,
wir sind noch nicht an der Wurzel angekommen,
dann hat sich die Farbe der Wurzeln nicht verändert.
Ja, wir haben ja nur lokal an der Stelle Z was gemacht.
Das heißt, die Eigenschaft 2 ist nicht verletzt.
Ja, und was gilt für die Eigenschaft 4?
Die darf natürlich verletzt sein. Eine der Eigenschaften darf ja
verletzt sein. Wir müssen nur sicherstellen, dass sie es
an der richtigen Stelle verletzt und nur an dieser einen, ja.
Und die Eigenschaft 4, die haben wir an dem Knotenpaar
Z, Z-Parent. Hier haben wir sie repariert.
Ja, hier ist sie nicht mehr verletzt.
Ja, hier hatten wir rot-rot,
jetzt haben wir rot-schwarz
Jetzt ist aber das neue Z nach hier oben gewandert und
der Knoten war ja vorher schwarz, er ist jetzt rot
und der hat ja einen Vorgänger und der Vorgänger könnte ja rot sein.
Das heißt, wir haben unseren Fehler jetzt nach oben geschoben und wenn der Vorgänger von dem Z-Strich,
von dem neuen Set rot war,
dann haben wir eine Verletzung von Eigenschaft 4 an der Stelle des neuen Sets und seines Vorgängers.
Und die würden wir in der nächsten Iteration der Wildschleife bearbeiten. Okay,
so, Fall 2 ist, der Onkel ist jetzt schwarz,
den habe ich hier gar nicht mehr als expliziten Knoten hingemalt,
der ist jetzt Teil von diesem Teilbaum Delta,
da steht hier noch,
deswegen steht hier das Y noch dran,
der ist schwarz und Z ist ein rechtes Kind
Okay, hier setzen wir jetzt ein bisschen kürzer,
ja, alle Nachfolger,
Alphabettergammer und Delta sind schwarz und haben die gleiche Schwarzhöhe,
gleiches Argument wie eben und wir führen eine Rotation durch,
das machen wir hier, von hier nach hier und wir sehen,
dass die Eigenschaft 5,
dass die Entscheidende,
Schwarzhöhe bleibt erhalten,
wir haben einen schwarzen Knoten auf allen Faden durch diesen
lokalen Teilbaum und diese Eigenschaft bleibt erhalten
alle Pfade hierdurch haben einen schwarzen Knoten
So, Fall 3 kommt,
wir gehen von dieser Konstruktion zu der. Ich hoffe,
Sie erinnern sich daran, Z ist ein linkes Kind,
ist rot, Vorgänger ist rot, Onkel ist schwarz.
Den Onkel sehen wir ja nicht in dem Bild.
Und das ist der dritte Fall, den wir überarbeiten.
Steht hier, Onkel ist schwarz und Z ist ein linkes Kind.
Wir müssen ja die Innenvariante zeigen. Erstens,
die Farbe von Z ist rot, nach Ausführung der Operation,
okay, wir wissen,
Z-Strich wird ja der Vorgänger vom Z durch durch die Operation hier in Fall 2.
Und die Farbe vom Vorgänger ist rot und in dem Fall
3 ändern wir Z und die Farbe von Z nicht.
Also insofern ist diese Eigenschaft auf alle Fülle, auf alle Fälle erfüllt.
Zweite Eigenschaft, die wir zeigen müssen, bezieht sich wieder
auf die Wurzel. Der Vorgänger von Z ist die Wurzel,
ja, und die Wurzel muss schwarz sein.
Naja, wir wissen, wir wissen unabhängig davon,
ob sie Wurzel ist, dass der Vorgänger von Z schwarz ist.
Ja, das steht hier
Okay, dritte Eigenschaft, es ist maximal eine rot-schwarze Eigenschaft,
verletzt, zwei oder vier, 1-3 und 5 sind erfüllt,
das sehen wir wieder an der Zeichnung, ja,
Eingeschafft 2 ist nicht verletzt,
da der Vorgänger von Z schwarz ist, wissen wir schon,
ja, Eigenschaft 4 ist an der Stelle Z und Z Parent repariert,
Ted und Set Parent, das ist da ist der Fehler nicht mehr da,
ja, und wir haben keine weitere Verletzung der Eigenschaft 4,
die ist also auch nicht mehr verletzt, das heißt,
zu dem Zeitpunkt hier haben wir die rot-schwarze Eigenschaften erfüllt.
So, okay, jetzt ist gerade ganz leise geworden,
Ja, das ist schon sehr schwierig. Ja,
es ist ein sehr schwieriger Beweis,
weil man tatsächlich diese ganzen Fälle einzeln betrachten muss,
um sich jedes Mal überlegen muss, was macht der Code.
Und das, was es meiner Meinung nach so schwer macht,
das nachzuvollziehen, das kann man irgendwie auch irgendwie nicht anders machen,
ist, diese Variablen ändern immer die Werte.
Also Z ist irgendwie dann immer im Laufe des Algorithmus
plötzlich dann ein anderer Knoten im Baum.
Und das macht es so schwierig, das nachzuvollziehen.
Okay, so sieht der Beweis aus. Und damit haben wir gezeigt,
dass wir einen Knoten in den Rotschwarzbaum einfügen können,
das geht in Log andside und noch wichtiger,
ist natürlich,
dass die Rotschwarzeigenschaften
dann erfüllt bleiben
Okay, so. Ja, vielleicht nochmal abschließend, bevor wir mit dem Löschen anfangen.
Der Teil hier ist der Wichtige. Also an dem Teil,
an dem Teil, mit dem Teil können sie es verstehen.
Also mit dem Teil habe ich ihnen die Intuition versucht zu
geben, warum das korrekt ist. Der zweite Teil,
den wir gesehen haben, wir haben es ja jetzt gerade nochmal betrachtet,
ist nur die formale Fassung von dem,
was wir vorher intuitiv betrachtet haben.
Also wenn sie es sich nochmal angucken,
wenn sie bis hierhin klargekommen sind,
dann schaffen sie den Rest auch,
lesen sie es sich dann einfach nur nochmal gut durch
So, jetzt kommt das Löschen. Und ehrlich gesagt,
jetzt wird es leider nochmal schwerer, ja,
Löschen ist noch unangenehmer als Einfügen bei dem Ganzen.
Aber wir werden hier den Beweis nicht mehr machen. Ja,
ich werde ihnen nur noch zeigen, wie es geht.
Und ich werde ihnen dann, ich werde ihnen wieder an
den Fällen zeigen, warum das dann funktioniert.
Aber wir werden es nicht mehr versuchen, formal aufzuschreiben.
Das kostet einfach noch unendlich die Zeit. Und das ist dann
nicht mehr nötig. So, wie löschen wir in einem balancierten Suchbaum?
Das ist auch Wiederholung. Das haben wir schon gemacht.
Das heißt, wenn wir einen Knotenset löschen wollen,
dann müssen wir gucken, wie viele Kinder hat der?
Ich sage Ihnen mal lieber das Bild hier. Das Bild
hatten wir schon hier. Wenn wir Z löschen wollen,
dann kann der Fall eintreten, Z ist irgendwie ein Blatt,
dann können wir den einfach löschen.
Das ist der einfachste Fall. Der zweite Fall war,
Z war ein Knoten mit einem Kind, dann konnten wir den auch einfach löschen.
Dann hängen wir nämlich das Kind X da dran.
Und der dritte Fall war, Z waren Knoten,
der irgendwo in der Mitte des Baumes war,
dann haben wir den symmetrischen Nachfolger gesucht,
einmal nach rechts gehen und dann das Minimum.
Ja, das war hier der Knoten Y,
haben die Werte getauscht und hatten dann diesen zweiten Fall
Und konnten dann diesen Knoten Y tauschen.
Also wir müssen jetzt immer ein bisschen unterscheiden. Der Knoten,
der gelöscht wird, ist nicht notwendigerweise der,
den wir löschen wollten, sondern wir haben gegebenenfalls die Werte vertauscht.
Das passiert im Vorfeld und dann haben wir einen Knoten,
der garantiert nur einen Nachfolger hat. Also ein oder gar keinen
. Und den löschen wir. Das macht dieser Pseudocode,
den gehe ich jetzt nicht mehr Schritt für Schritt durch.
Das haben wir schon angeschaut, wie das genau funktioniert.
Wir müssen uns nur die Stellen angucken,
die wir ändern müssen für den Rot-Schwarz-Baum.
Das Erste, was wir ändern,
sehen Sie in Grün
Ist, ja, wir haben jetzt Wächterknoten eingefügt,
die waren in der ersten Variante Pseudocodes nicht und die stehen jetzt hier,
also das ist der Vergleich mit den Wächterknoten.
Der Knoten X kann nicht mehr Neil sein,
weil wir einen Wächterknoten haben,
wir können also hier einfach diese Bedingungen weglassen,
es ist aber nur Schnickschnack, das ist egal und die einzige entscheidende Stelle,
die wir haben, ist die.
Hier müssen wir mit den Rot-Schwarz-Eigenschaften operieren und zwar machen wir Folgendes,
wenn der Knoten schwarz ist,
dann rufen wir eine Reparaturfunktion auf
Die wichtige Information hier drin ist,
wenn der Knoten rot ist, machen wir es nicht.
Das heißt, wenn der Knoten, den wir löschen,
ist der Knoten Y, wenn der rot war,
dann löschen wir den einfach.
Und das können wir auch, weil der rote Knoten,
wenn wir einen roten Knoten löschen, können wir gar keine rot-schwarze-Eigenschaft verletzen.
Sieht man relativ schnell, also hier Wiederholung, die 5-rot-schwarze-Eigenschaften.
Mal angenommen, wir löschen einen roten Knoten.
Dann ist offensichtlich danach jeder Knoten immer noch rot oder schwarz,
klar, wir haben ja nur einen roten Knoten gelöscht.
Die Wurzel ist schwarz, warum sollte sich das ändern?
Wir haben ja nur
einen roten Knoten gelöscht
Jedes Blatt, das heißt, der Wächter ist schwarz,
ja, die Wächter sind immer noch alle da und sind alle schwarz.
Für jeden roten Knoten gilt, beide Nachfolger sind schwarz.
Wenn wir einen roten Knoten löschen,
dann wird ja das Kind von dem ein Kind des Vorgängers,
ja, hier, ne? Also, ne,
wenn wir den Knoten löschen, dann wird das Kind,
das ist X, ein Kind des Vorgängers hier, ne?
Jetzt gibt es zwei Knoten, die werden plötzlich,
die kriegen eine Kante, ne, die werden,
die kriegen eine Eltern-Kind-Beziehung, hatten die vorher nicht.
Könnte ja sein, oh, die sind jetzt beide rot,
haben wir zwei rote benachbarte Knoten
Geht aber gar nicht. Kann ich sein, weil der Knoten hier
ist ja rot und die benachbarten Knoten von Roten sind ja schwarz.
Das ist der und der ist garantiert schwarz.
Also kann ich sein. Das heißt,
die Eigenschaft 4 ist auf alle Fälle, oh,
die Eigenschaft 4 ist auf alle Fälle erfüllt.
Also sie sagen gar nichts. Ich rede hier was
ganz anderes als das, was auf der Folie steht.
Also hier ist schon der Teil für den schwarzen Knoten.
Ich erkläre Ihnen gerade, was passiert, wenn wir einen roten Knoten löschen.
Deswegen sind die andere Haken dran. Also die Eigenschaft ist
auf alle Fälle erfüllt. Naja, und wenn wir einen
roten Knoten löschen, dann ändert sich auch die Schwarzhöhe nicht.
Also auch in diesem Fall hier ist die Eigenschaft 5 erfüllt.
Also rote Knoten können wir immer löschen. Das,
was wir uns anschauen müssen, ist den Fall,
dass wir einen schwarzen Knoten löschen.
Wenn wir einen schwarzen Knoten löschen, dann ändert sich
die Schwarzhöhe in den Teil des Baums.
Und die muss ja überall gleich sein. Und jetzt haben wir ein Problem. Okay,
wenn wir alle fünf Eigenschaften durchgehen für den Fall,
dass wir einen schwarzen Knoten gelöscht haben, naja,
der erste Punkt ist, der Knoten ist entweder rot oder schwarz,
das ist natürlich erfüllt.
Die Wurzel ist schwarz, das kann verletzt sein,
weil vielleicht haben wir ja die Wurzel gelöscht
War ein schwarzer Knoten. Da ist ein Kind von
der Wurzel hochgerutscht und das könnte ein roter Knoten sein.
Also ist die Eigenschaft vielleicht verletzt. Die Blätter sind alle schwarz
, die Eigenschaft bleibt erhalten. Für jeden roten Knoten gilt
beide Nachfolger sind schwarz. Diese Eigenschaft kann verletzt sein,
wenn wir einen schwarzen Knoten löschen, dann kann das Kind davon rot sein,
der Elternknoten rot sein, die beiden verbinden wir,
wir haben zwei rote Knoten, die benachbart sind.
Und die fünfte Eigenschaft ist auch verletzt,
weil wir haben schließlich einen schwarzen Knoten gelöscht, die muss verletzt sein,
weil jetzt kann die Schwarzhöhe aller Knoten nicht mehr gleich sein,
weil da fehlt ja ein schwarzer Knoten.
Die ist also garantiert verletzt. Das ist extrem unangenehm.
Vor allen Dingen ist diese Eigenschaft nicht nur lokal verletzt,
die ist ja im ganzen Baum verletzt
Okay, also das zu reparieren, sieht schwierig aus.
Wir können allerdings eine etwas andere Betrachtungsweise wählen.
Und zwar sagen wir mal, wir wollen irgendwie mit dieser
Eigenschaft 5 wollen wir uns nicht rumschlagen, das ist ärgerlich.
Wir wollen, dass die auf alle Fälle irgendwie erhalten bleibt.
Und das machen wir, indem wir sagen, okay,
fünf bleibt erhalten und wir verletzen mal Eigenschaft eins.
Die die ganze Zeit so trivial aussehen und sagen,
entweder ein Knoten ist rot oder schwarz.
Wir sagen jetzt mal so ein Knoten,
der darf auch zwei Farben haben.
So ein Knoten, der darf
doppelt schwarz sein oder rot schwarz
Kariert oder so, ne? Also er darf zwei Farben haben, ne?
Wenn der doppelt schwarz sein darf, der hat also,
bin schwarz und auch noch das schwarz von einem anderen Knoten noch dazu,
dann können wir dafür sorgen, dass die Schwarzhöhen wieder gleich sind, ja?
Weil der hat ja jetzt zwei schwarz. Okay, das heißt,
Eigenschaft 5 ist erfüllt, Eigenschaft 1 verletzt, ja?
Und zwar lokal. Also stellen Sie sich es einfach so vor,
wir haben in dem Knoten,
wir haben einen schwarzen Knoten gelöscht und das Schwarz,
was der hatte, ja, der hat so,
wie so eine Marke, ne,
so eine schwarze Marke,
die gibt dir einfach an seinem Kind,
ja,
oder an seinen Elternknoten
So, und dann hat der dummerweise zweimal schwarz.
Das geht natürlich nicht, das müssen wir reparieren.
Und wir werden jetzt einfach dieses zweite schwarz durch diesen Baum schieben.
So wie wir eben die zwei roten,
benachbarten Knoten durch den Baum geschoben haben,
werden wir dieses überzählige schwarz in den Baum nach oben schieben.
Ja, das ist die Betrachtungsweise, die man wählen muss,
damit man die Löschoperation durchführen kann. Das ist der Pseudocode,
ist der Längste, den ich in der ganzen Vorlesung nicht in dieser,
sondern in der ganzen, im ganzen Semester zeigen werde.
Sie sehen auch, es geht gar nicht mehr länger,
ist fast nicht mehr auf die Folie.
Und wir brauchen vier Fälle, die wir unterscheiden müssen
Nochmal die vier symmetrischen Fälle,
die wieder durch das Vertauschen von links und rechts entstehen.
Und die stehen ja wieder nicht. Okay, so,
die vier Fälle, ich sage Ihnen jetzt,
wir gehen jetzt direkt in diese Fälle mal rein und gucken uns an, was passiert.
Das Entscheidende ist wieder, das Bild ja auf der rechten Seite,
das ist hier noch schwarz-weiß, aus gutem Grund,
weil wir jetzt noch keinen konkreten Fall angucken.
Jetzt werden die hier rot und schwarz und dann sehen wir genau, was passiert.
Beim Einfügen war ja das Entscheidende immer die Farbe von dem Onkel.
Wir mussten irgendwie erreichen, dass der Onkel schwarz ist.
Beim Löschen ist es nicht der Onkel,
beim Löschen ist es
der Bruder
Der Bruder ist entscheidend bei der ganzen Geschichte. Und also
X ist hier quasi der Knoten, den wir betrachten.
Das ist quasi das Kind von dem Knoten, den wir gelöscht haben.
Und X ist hier und W ist er unser Bruder.
Den müssen wir uns anschauen. Und wenn der die
richtige Farbe hat, dann können wir das Ganze reparieren.
Okay, so. Wann terminiert diese Wildschleife hier oben?
Wir laufen so lange, bis wir bei der Wurzel angekommen sind.
Und die Farbe von dem Knoten noch schwarz ist
Also dieses doppelt schwarz, das haben wir natürlich nur im Kopf.
Wir haben natürlich in der Datenstruktur durch schwarz, schwarz oder so.
Wir wissen nur, der Knoten hat noch ein zusätzliches Schwarz,
was wir irgendwo unterbringen müssen.
Okay, wenn wir an der Wurzel angekommen sind,
haben wir eigentlich kein Problem mehr.
Wenn auf der Wurzel ein doppeltes schwarz liegen würde,
nehmen wir einfach in schwarz weg.
Das macht ja nichts kaputt. Das ändert nichts. Dann
wird die Schwarzhöhe insgesamt verändert, aber das stört nicht.
Das heißt, deswegen sind wir da auf alle fertig,
auf alle Fälle fertig. Wenn der Knoten rot wäre,
dann hätten wir ein rot-schwarz und das ist auch prima,
weil dann lassen wir einfach das Rot weg,
weil rot ist ja egal
Wichtig ist ja, dass die Schwarzhöhe stimmt. Einen roten Knoten könnten wir
einfach entfernen. Das heißt, das ist auch gut.
Also nur die zweifach schwarz gefärbten Knoten ist ein Problem.
Und wenn der Knoten X hier die Farbe schwarz hat und wir haben im Kopf,
der hat noch einen Schwarz, nämlich das von dem gelöschten Knoten,
dann haben wir ein Problem und müssen noch irgendwas tun.
Okay, so, das sind die ersten beiden Fälle,
die auftreten können. Also wir haben die Wurzel gelöscht und
das einzige, was überbleibt, ist der Knoten X hier.
Und wenn nur der Knoten X X übrig bleibt,
dann färben wir den einfach schwarz und alles ist gut
Und der zweite Fall ist, hier zu sehen,
dass der Knoten X, hier haben wir Y,
den Vorgänger von Y und Y hatten wir gelöscht.
Und das X wird dann rot-schwarz. Also das ist jetzt rot,
die Eigenschaft ist nicht erfüllt, wird dann rot-schwarz,
wir färben den einfach schwarz, Schwarzhöhen sind wieder alle gleich, alles gut.
Also in dem Fall müssen wir diese Schleife gar nicht ausführen,
dann sind wir fertig. Okay, so,
Fall 1. Wir gucken uns an, X, hier ist X,
ist ein linkes Kind, das ist der Vorgänger,
X ist linkes Kind, Bruder ist rot.
Hier ist der Bruder, der ist rot. Also Fall 1,
die Bedingung ist, der Bruder ist rot, was machen
wir? Wir ändern ein paar Farben und machen auch eine
Rotation. Wir setzen die Farbe des Bruders auf schwarz,
wir setzen die Farbe des Vorgängers auf rot, wir machen eine Linksrotation.
Und dann kriegt unser Knoten X einen neuen Bruder und das
ist nämlich der Rechte von seinem Vorgänger,
also x Vorgänger und dann das rechte Kind.
So, also was machen wir? Der Knoten hier wird schwarz,
der Knoten B wird rot, wir machen eine Linksrotation,
das ist der neue Baum, der entsteht.
X ist nach wie vor dieser Knoten,
das ist ein bisschen nach unten gerutscht und X hat
einen neuen Bruder bekommen
Und der Bruder ist schwarz. Wir sind dem roten Bruder losgeworden.
Durch diese drei Operationen. Also im folgenden ist sichergestellt,
der Bruder ist schwarz. Okay, so. Fall 2
ist, beide Kinder sind schwarz. Hier haben wir also,
also die Kinder des Bruders, beide schwarz,
ihre Nichten und Neffen.
Beide schwarz. Was machen wir?
Wir machen w-rot. Wir färben den einfach rot
Und gehen dann zum Vorgänger und der hat jetzt das doppelt schwarz.
Also wir schieben quasi das doppelte schwarze hoch und damit die Schwarzhöhe wieder stimmt,
nehmen wir dem hier einen Schwarz weg und färben den rot.
Also hier hatten wir vorher zwei schwarz drauf,
der war auch schwarz, von beiden Knoten,
ein schwarzer 1 nach oben, dann ist hier doppelt schwarz,
hier ist einfach schwarz, der hatte nur einen schwarz,
der wird dadurch rot.
Okay, dritter Fall steht hier, W ist jetzt schwarz,
also der Bruder ist schwarz,
rechtes Kind ist schwarz,
linkes Kind ist rot
Sie meinen dieses Blank hier? Ja,
das ist gewollt. Das ist in der Tat gewollt.
Also die Situation hatten wir eben auch schon im Code.
Es sind also, es sind vier, sagen wir mal,
vier Szenarien, die auftreten können.
Die treten aber gegebenenfalls in unterschiedlichen Schleifendurchläufen auf.
Also man würde dann im nächsten Schleifen durchlaufen an
dieser Stelle rutschen
Okay. Boah, das war jetzt fies.
Jetzt muss ich erst mal wieder überlegen. Okay, also,
wir sind im dritten Fall, die Situation ist die,
jetzt haben sie mich total rausgebracht, die Kinder sind,
jetzt muss ich mal kurz... Mann.
Okay, also, der Bruder ist schwarz.
Die Kinder, nein, Das rechte Kind ist schwarz.
So, der linke ist rot. So, jetzt bin ich
wieder drin. Ja, also sie hoffentlich auch. Okay,
also rechtes Kind ist schwarz, linkes Kind ist rot,
weil die sind ja nicht beide.
Die sind nicht beide schwarz, weil den Fall hatten wir schon.
Was machen wir? Also hier, Bruder ist schwarz,
linkes Kind, rot, rechtes Kind, schwarz.
Was machen wir? Wir ändern wieder Farben. Wir machen
eine Rechtsrotation und durch diese Rechtsrotation erreichen wir dieses Szenario hier.
X ist schwarz, also eigentlich doppelt schwarz.
Der Bruder ist schwarz und das rechte Kind ist rot.
Ich hoffe, Sie sehen jetzt noch eine gewisse Symmetrie zum Einfügen.
Beim Einfügen, da warten wir X, als linkes Kind,
rot, Vorgängerrot und der Onkel schwarz.
Und jetzt haben wir der Knotenschwarz, der Bruder schwarz und der ist rechte Kind davon rot.
Diese Konstellation erreichen wir. Und dann sind wir im vierten Fall,
jetzt haben wir genau diese Konstellation, also x,
doppelt schwarz, der schwarz, der Bruder schwarz,
das rechte Kind von dem Bruder rot.
Und jetzt können wir das doppelte schwarz von dem Knoten x entfernen.
Was machen wir? Wir machen wieder einen Farbtausch,
also die Farbe von dem Bruder,
der übernimmt die Farbe von dem Vater,
Der Knoten selber wird schwarz, der rechte Knoten davon wird auch schwarz.
Wir machen eine Linksrotation, hier ist noch ein Type oder
es muss x.p heißen. Und danach springen wir zu Wurzeln,
weil wir an dieser Stelle wissen, dass die Rot-Schwarzeigenschaften komplett wieder erfüllt sind.
Sehen tut man das genau mit der gleichen Argumentation wie vorher auch.
Wenn sie die schwarz, die Schwarzpfade zäh,
also die Schwarzhöhen entlang der Pfade stehen,
dann haben sie hier ein, ja, und hier hatten sie zwei.
Also x ist ja ein Doppelschwarz. Und nach der Umorganisation
haben sie jetzt wieder zwei. Der Knoten B,
der nimmt quasi das schwarz auf, was der doppelt hatte
Okay, gut. So ist das. Den Beweis machen
wir nicht davon, dass diese Reparaturoperation, die erhält,
die Rot-Schwarze-Eigenschaften in dem Baum und es läuft auch in logorithmischer Zeit,
weil sie sich im Baum nach oben bewegt.
Die Korrektheit, ja, die können sie nochmal genau formulieren,
wenn sie wollen, die können sie im Kommen nachlesen.
Die Bearbeitung folgt in konstanter Zeit, in jedem einzelnen Schritt.
Fall 1 überführt in Fälle 2 bis 4 und nach Fälle
3 und 4 terminiert die Schleife und der Fall 2 wird,
in Fall 2 wird die Schleife auf dem Elternknoten durch geführt.
Und dann läuft das da hoch und dann haben sie die Eigenschaften repariert.
Ja, das ist eine echte Meisterleistung, oder?
Also ich muss sagen, sie haben ja schon gemerkt.
Also ich mache das ja jetzt ungefähr einmal im Jahr,
dass ich das wieder erkläre.
Ich muss mich enorm darauf vorbereiten, ihnen das überhaupt erklären zu können.
Und wenn sie eine Frage stellen, bin ich raus.
Also das ist sehr schwer nachzuvollziehen. Das ist mir durchaus
bewusst. Also ich hoffe, wir haben die Idee aufgenommen.
Das ist, glaube ich, fast das Maximum,
was man in der Vorlesung erreichen kann. Also wenn sie wirklich sagen,
ich habe das jetzt ab absolut im Kopf und weiß genau,
wie es funktioniert,
müssen sie sich bestimmt noch mal hinlesen und mal ein paar Beispiele aufmalen und vielleicht auch noch mal im Kommen nachlesen.
Ja, also der Rot-Schwarz-Baum hat tatsächlich jetzt diese optimalen Eigenschaften eines Suchbaums mit dem Rot-Schwarz-Baum,
hat man es geschafft, einen Suchbaum zu konstruieren,
der einfügen, löschen und suchen in logerithmischer Zeit ermöglicht.
Und das ist für unsere Datenbanken,
für alle Arten von Wörterbuchoperationen von uns, von unschätzbarem Wert.
Also jegliche Art von Suchmaschinen, von Funktionalität im Internet funktionieren
nicht ohne eine entsprechende Indexstrukturen auf Datenbanken, die auf balancierten Bäumen basieren.
Manchmal auch auf Hashing, das werden wir noch sehen,
aber darauf auf alle Fälle. So, in den letzten paar Minuten,
das werden wir nicht mehr im Detail machen,
möchte ich Ihnen aber trotzdem noch mal ganz kurz sagen,
was eigentlich das ursprüngliche Modell war.
Also der rote Schwarzbaum, der ist später gekommen.
Ja, den hat man später entwickelt. Der erste balancierte Suchbaum,
der entwickelt wurde, der wurde in den 60ern entwickelt,
der wurde was Seltenes in der Informatik nach den Erfindern hier benannt.
Das ist sein AVL-Baum, Adelsen, Welski und Landes haben den entwickelt.
Und das war die erste präsentierte Datenstruktur, die diese Eigenschaft hatte,
die in logorhythmischer Zeit diese Datenbank, also diese Wörterbuchoperation ermöglicht hat.
So, der war ein bisschen anders gebaut,
aber der war auch ähnlich in gewisser Weise.
Also was man hat, ist,
man hat einen Balancewert an einem Knoten und der Balancewert ist
die Differenz der Höhe des Rechten, minus der Höhe des linken Teilbaums.
Dann wissen sie ungefähr, wie das ausgenivelliert ist.
Und die Bedingung des AVL-Baums ist, dass dieser Balancewert in
dem Wertebereich von minus 1 bis plus 1 liegen darf.
Also wenn sie einen Knoten haben, der muss für jeden Knoten gelten,
dass der linke Teilbaum maximal einen Knoten tiefer dein sein darf als der rechte Knoten oder umgekehrt.
Aber es darf sich nicht um mehr als eins unterscheiden.
Das ist die AVL-Bedingung. Und die ist ein bisschen anders als im Fall von Rot-Schwarz-Bäumen. So,
dann fragt man sich natürlich als erstes wieder,
ist der überhaupt balanciert und dann kann man zeigen,
dass die Anzahl der Blätter, die man hat,
im ungünstigsten Fall so schnell wächst wie die Fibonacci-Zahl.
Auch das ist jetzt komplizierter als bei den Rot-Schwarz-Bäumen.
Also die hat man aus gutem Grund heute auch in der
Lehre und die verwendet man auch, weil sie viel einfacher auch nachzuvollziehen sind.
Hier muss man ein bisschen rechnen, dann kann man sehen,
okay, die Anzahl der Blätter steigt maximal so schnell wie die Anzahl,
die wie die Fibunachi-Zahl, die Fibunachi-Zahl hat ein exponentielles Wachstum,
also hat der Baum logorithmische Höhe.
Das ist in wenigen Worten zusammengefasst, warum der überhaupt logorithmische Höhe hat. So,
hier ist noch ein Beispiel von Som Baum,
hier stehen so Balancewerte dran, also der hat zum Beispiel plus eins,
der rechte Teilbaum ist eins tiefer als der linke,
der hat minus eins, die Wurzel hier,
weil der linke Teilbaum eins tiefer ist als der rechte Teilbaum,
ja, so sehen die aus.
Und einfügen geht dann auch wieder so,
wie in einem balancierten Suchbaum, sie laufen hier runter,
sie finden die Einfügestelle, fügen den hier ein.
Und jetzt ändern sich diese Balancewerte,
weil der Teilbaum natürlich tiefer wird, ja, wir sehen,
der hier ändert seinen Wert von null nach minus eins,
der kriegt eine plus der ist jetzt minus eins,
der ist minus zwei.
Und sie sehen die AVL-Eigenschaft, ist entlang des Pfades zur Wurzel potenziell verletzt.
So, und jetzt passiert genau das Gleiche wie bei Rot-Schwarz-Bäumen.
Sie müssen sich hier langhangeln von hier nach oben und müssen dafür sorgen,
dass alles, was hinter ihnen liegt, im Baum weiter unten,
Balancewerte zwischen 0 und minus eins hat.
Und dafür gibt es dann die ganzen verschiedenen Fälle. Ich bin linkes Kind,
ich bin rechtes Kind, der Wert ist minus eins,
der Wert ist plus eins und so weiter.
Und jedes Mal müssen sie überlegen, was machen sie da?
Und wie gesagt, was machen wir jetzt nicht nochmal?
Hier ist es sowieso nur ganz kurz zusammengefasst auf den Folien
Hier gibt es verschiedene Szenarien, unter denen wird halt wieder rotiert.
Und dann kriegen wir auch da einen balancierten Suchbaum.
Wir können auch darin löschen. Es gibt noch eine ganz,
einen Unterschied zwischen AVL-Bäumen und Rot-Schwarzbäumen, der nicht, den man nicht übersehen sollte.
Die sind zwar beide balanciert, aber der AVL-Baum braucht zur Balancierung potenziell mehrere Rotationen.
Also wenn der dem Pfad nach oben geht,
dann rotiert er und dann geht er wieder ein bisschen weit nach oben,
dann rotiert er wieder,
dann geht er wieder ein bisschen weiter nach oben und so weiter.
Der rot-Schwarzbaum, das ist ihm wahrscheinlich jetzt in dem ganzen
wirren Zeug nicht aufgefallen wie den ganzen Fallunterscheidung,
aber sie können sich das nochmal anschauen,
der rot-Schwarzbaum kann einfügen und löschen mit einer konstanten Anzahl von Rotationen.
Er ändert immer nur Farben und irgendwann fängt er an zu drehen.
Und wenn er rotiert, dann ist er danach aber auch fertig.
Das ist beim AVL-Baum nicht so. Der muss mehr rotieren.
Das ist ein ganz entscheidender Unterschied zwischen den beiden Strukturen.
Was übrigens nach wie vor ärgerlich ist bei der ganzen Geschichte ist,
sowohl der AVL-Baum als auch der Rot-Schwarz-Baum brauchen Zusatzinformationen.
Also sie haben den Binärbaum, da steht irgendwie der Schlüssel drin
und der linke und der rechte Quinte, Vorgänger und so.
Aber sie brauchen noch ein Bit. Sie müssen wissen,
ist der Knoten rot oder schwarz
Ja, der AVL-Baum braucht Zusatzinformationen. Da brauchen sie
sogar zwei Bits. Sie müssen nämlich wissen,
ist der Balance wert, null minus eins oder plus eins.
Sie müssen drei Zustände unterscheiden können. Es gibt meines Wissens,
können Sie ja mal recherchieren, meines Wissens keinen einzigen,
kein einzige Wörterbuchdatenstruktur, die nicht mindestens dieses eine Bit-Zusatzinformation braucht.
Sie müssen irgendwie diese Zusatzinformation haben, um die Balance herstellen
zu können. Das noch am Rande. Okay,
also was haben wir in diesem Teilkapitel gesehen
Suchbäume errealisieren, dynamische Datenstrukturen für Wörterbücher einfügen, löschen, suchen.
Alle Operationen gehen in logerithmischer Zeit. Wir können sogar zeigen,
dass die Baumhöhen durch zweimal Logorithmus der Anzahl der Knoten beschränkt ist.
Die Laufzeit aller Operationen sind abhängig von der Höhe des Suchbaums
im Average Case, verhält sich die Höhe bereits logorithmisch.
Also für den Average Case müssen sie gar nichts tun, ja. Okay,
er ist dann balanciert, wenn er auch im Worst Case
die Log-in-Höhe erreicht, die rot-schwarz-Wäume, die tun das.
Wir haben hier gesehen, wie die genau operieren mit diesem
zusätzlichen Farblabel, die AVL-Bäume erreichen, ähnliches.
Das ist noch nicht das Ende der, sagen wir mal,
Algorithmenentwicklung, was Bäume angeht. Der nächste Schritt,
den wir hier in der Vorlesung nicht machen werden,
können Sie aber gerne sich im Hauptstudium anhören,
ist der Versuch, die Bäume selbst organisieren zu machen.
Also abhängig von Anfragen dafür zu sorgen, dass die Positionen im Baum sich ändern.
Wenn Sie sich vorstellen, die Balance sorgt ja nur dafür,
alle Knoten haben irgendwie so eine Log-in-Tiefe.
Aber stellen Sie sich mal vor, Sie würden mit sowas
einen Suchkatalog realisieren, wo Sie ganz selten einfügen oder löschen.
So, und dann haben Sie den Amazon-Katalog,
und dann haben sie vielleicht den neuesten Harry-Potter-Roman,
der wird in jeder dritten Anfrage angefragt und der liegt auf dem Blatt.
Also wie doof, ja, der müsste ja in
der Wurzel liegen, das wäre ja viel besser.
Diese Bäume gibt es auch, das sind selbstorganisierende Bäume und
die kann man später nochmal machen.
Hier haben sie erstmal den Einstieg in das Balancieren gekriegt und
wir werden dann in der nächsten Vorlesung weitermachen mit Hashing und das
war es dann für heute