Wir notieren RBT über einen Datentyp $D$ analog zu BST und speichern lediglich zusätzlich die Farbe $R,B \in C$ im Node:
\begin{align*}
\text{RBT}\; D &= ε\ |\; C\quad\text{RBT}\; D\quad D\quad\text{RBT}\; D \\
\mathcal{B}\quad&= ε\ |\;\, c\qquad\ l\qquad\ \ \ x\;\ \qquad r
\end{align*}
Per Konvention nehmen wir an, dass der Wurzelknoten immer Schwarz ist.
Per Konvention nehmen wir an, dass der Wurzelknoten immer Schwarz ist.
Wenn der kürzeste vorstellbare Pfad von der Wurzel zu einem Blatt in einem RBT-Tree durch $l$ ausschließlich durch schwarze Knoten geht, ist der längste
Wenn der kürzeste vorstellbare Pfad von der Wurzel zu einem Blatt in einem RBT-Tree durch $l$ ausschließlich durch schwarze Knoten geht, ist der längste
Pfad dann durch $2l$ Knoten, immer einen Schwarzen und einen roten. Dadurch ist gewährleistet, dass das höchste Blatt
Pfad dann durch $2l$ Knoten, immer einen Schwarzen und einen roten. Dadurch ist gewährleistet, dass das höchste Blatt
...
@@ -55,178 +61,99 @@ Auch die grundsätzliche Idee des Einfügens bleibt gleich: Wie bei BST gehen wi
...
@@ -55,178 +61,99 @@ Auch die grundsätzliche Idee des Einfügens bleibt gleich: Wie bei BST gehen wi
den passenden Platz für das neue Element. Eingefügte Elemente sind also erst einmal Blätter.
den passenden Platz für das neue Element. Eingefügte Elemente sind also erst einmal Blätter.
Würde man das neue Blatt schwarz färben, wäre sofort die globale Invarianz verletzt. Daher färben wir das neue Blatt
Würde man das neue Blatt schwarz färben, wäre sofort die globale Invarianz verletzt. Daher färben wir das neue Blatt
rot. Allerdings kann es dabei zu einer Verletzung der lokalen Invarianz kommen. Skizze \ref{fig:rbt_balance}
rot. Allerdings kann es dabei zu einer Verletzung der lokalen Invarianz kommen. Wie in Abbildung \ref{fig:rbt_balance}
veranschaulicht dabei, welche Fälle auftreten können und wie der rebalancierte Baum aussieht:
skizziert, wird die lokale Invarianz durch eine \texttt{balance}-Operation wieder repariert. Es kann dabei sein, dass
die Verletzung dabei eine Ebene nach oben verschoben wird, also sind bis zu $h$\texttt{balance}-Operationen notwendig.
Am Ende wird die Wurzel des Baums immer schwarz gefärbt.
\begin{figure}[h!]
\begin{figure}[h!]
\centering
\centering
\input{bilder/rbt_balance.tex}
\input{bilder/rbt_balance.tex}
\caption{Die potentiellen Verletzung der lokalen Invarianz nach dem Einfügen und wie sie ausbalanciert werden.}
\caption{Die potentiellen Verletzung der lokalen Invarianz nach dem Einfügen und wie sie ausbalanciert werden.
Potentiell leere Teilbäume werden durch $a, b, c$ und $d$ repräsentiert. Insbesondere direkt nach dem Einfügen des
neuen Elements sind $a,b,c,d=ε$.}
\label{fig:rbt_balance}
\label{fig:rbt_balance}
\end{figure}
\end{figure}
\paragraph{Suchen in (2-4)-Bäumen}
Formaler wird der Algorithmus zum Einfügen von $x$ in den RBT $T$ wird durch die Funktion
Mit Hilfe der Hilfsinformationen in den inneren Knoten kann, von der Wurzel
absteigend, der entsprechende Wert gesucht werden. Pro Knoten
benötigt der Suchprozess eine konstante Zeit $\mathcal{O}(1)$. Die gesamte
Laufzeit hängt also direkt von der Höhe des Baumes ab und ist damit $Θ(\log n)$.
Wir starten dabei folgenden Algorithmus mit $\texttt{search\_24}(\texttt{root}(\mathcal{B}_{2,4}), v)$.
\begin{algorithm}[h]
\SetNlSty{texttt}{[}{]}
\caption{\texttt{search\_24}($k, v$)}
\KwIn{A node $k$ and and a data value $v$.}
\KwOut{The node $k'$ of the subtree of $k$ which has $\texttt{data}(k')= v$. an error, if there is no such $k'$.}
\eIf{$α(k)=0$}{
\eIf{$\texttt{data}(k)= v$}{
\KwRet$k$\;
}{
\texttt{error: value not found}\;
}
}{
\uIf{$\texttt{child}_3(k)\neq\texttt{void\_node}$ and $m_2 < v$}{