diff --git a/305_RBT.tex b/305_RBT.tex index d2ef4aa2e205b832db89af020017d0dda243dd4e..2c440ddf27d167991e20c4ea5a54857ae403d80c 100644 --- a/305_RBT.tex +++ b/305_RBT.tex @@ -55,6 +55,8 @@ Die Details des Beweises sind eine Übungsaufgabe. Umgekehrt ist die Kapazität eines RBT zwischen $2^{h'}$ und $4^{h'}$. \subsection{Einfügen in Red-Black-Trees} +Dieser Abschnitt orientiert sich stark an Chris Okasakis Version: +\url{https://www.cs.tufts.edu/comp/150FP/archive/chris-okasaki/redblack99.pdf}. Da RBT insbesondere Binäre Suchbäume sind, sind die Operationen zum Suchen von Elementen, dem Finden des Maximums, Minimums, Nachfolgers etc identisch. @@ -113,7 +115,11 @@ Fall in binären Suchbäumen ist, muss zur Korrektheit lediglich überprüft wer \item die lokale Invarianz wiederhergestellt wird. \end{itemize} Für den ersten Punkt hilft folgende Beobachtung: Alle vier Ausgangspositionen in Abbildung \ref{fig:rbt_balance} treffen -folgende Aussagen über die Ordnung in $D$: $a < x < b < y < c < z < d$, wobei wir mit $a,b,c,d$ hier streng genommen alle Elemente +folgende Aussagen über die Ordnung in $D$: +\[ + a < x < b < y < c < z < d, +\] +wobei wir mit $a,b,c,d$ hier streng genommen alle Elemente aus den entsprechenden Teilbäumen meinen. Genau diese Eigenschaft wird auch im balancierten Graphen repräsentiert. @@ -143,13 +149,13 @@ Die Laufzeit von \texttt{insert} ist immer $Θ(h)$, da allein das Suchen der ric nimmt. Interessanter wird die Analyse, wenn man nur Schreibzugriffe betrachtet. In dem Fall ist der best-case -$\mathcal{O}(1)$, aber der worst-case Aufwand $\mathcal{O}(log n)$. +$\mathcal{O}(1)$, aber der worst-case Aufwand $\mathcal{O}(\log n)$. Dieses Ergebnis lässt sich noch verfeinern, da tatsächlich amortisiert $\mathcal{O}(1)$ Schreibaufwand garantiert werden kann: \begin{lemma} - Bei mehrfacher, sukzessiver Anwendung von \texttt{insert} passieren lediglich $\mathcal{O}(1)$ Schreibaufrufe, also + Bei mehrfacher, sukzessiver Anwendung von \emph{\texttt{insert}} passieren lediglich $\mathcal{O}(1)$ Schreibaufrufe, also Anwendungen der Regeln (3.1), (3.3) und (3.5). \label{lemma:rbt_amortisiert} \end{lemma} @@ -160,7 +166,7 @@ kann: einem Blatt beschreibt. Nach der Umstrukturierung hat jedoch jeder Teilbaum mit der Wurzel $x$ bzw $z$ die maximale Kapazität $4^{h'}$, d.h. - der Teilbaum mit $y$ als Wurzel hat $2 4^{h'}$ Kapazität. + der Teilbaum mit $y$ als Wurzel hat $2\cdot 4^{h'}$ Kapazität. Dadurch ergeben sich beim Einfügen die in Abbildung \ref{fig:RBT_aufwand} skizzierten Schreibaufwände - eine Umstrukturierung in der $i.$ Ebene ist doppelt so häufig wie in der Ebene $(i-1)$. @@ -168,7 +174,7 @@ kann: Akkumuliert man also über $k=2^l$ mal subsequent einfügen, ergeben sich eine folgende Anzahl von Schreiboperationen: \[ - 2^l + 2^{l-1} + 2^{l-2} + \dots + 2^0 ≤ 2^{l+1} = 2*k, + 2^l + 2^{l-1} + 2^{l-2} + \dots + 2^0 ≤ 2^{l+1} = 2k, \] und damit amortisiert über $k$ Schritte $\mathcal{O}(1)$ Aufwand. @@ -178,5 +184,12 @@ kann: \centering \input{bilder/RBT_aufwand.tex} \label{fig:RBT_aufwand} + \caption{Die Schreibaufwande beim Einfügen in einen Red-Black-Tree. In Rot in die gelegentlich auftauchenden Aufwände + zur Umstrukturierung. Tiefergehende Umstrukturierungen kommen seltener vor.} \end{figure} +\subsection{Löschen aus Red-Black-Trees*} +Wir orientieren uns an Kimball Germanes und Matthew Mights Publikation +\url{https://matt.might.net/papers/germane2014deletion.pdf}. + +TODO. diff --git a/Datenstrukturen_und_Algorithmen.tex b/Datenstrukturen_und_Algorithmen.tex index 3f53d5b6d2bce94d3cebc692a255c17b1bf218f0..7d36fc1a60b73bfdfa8c3b4f2b4cc14c1d98ebec 100644 --- a/Datenstrukturen_und_Algorithmen.tex +++ b/Datenstrukturen_und_Algorithmen.tex @@ -66,6 +66,7 @@ \usepackage{scrextend} %\usepackage{hhline} \usepackage{appendix} +\usepackage{hyperref} %custom macros \makeatletter diff --git a/bilder/RBT_aufwand.tex b/bilder/RBT_aufwand.tex index 41918b492f4ba93365191551a2b99ce1e166d41c..7b28a5483d1c179a0affc0a2a169803d41b49b1d 100644 --- a/bilder/RBT_aufwand.tex +++ b/bilder/RBT_aufwand.tex @@ -1,18 +1,22 @@ -\tikzsetnextfilename{dynamic_array_aufwand} +\tikzsetnextfilename{RBT_aufwand} \begin{tikzpicture} + \pgfplotsset{% + width=.8\textwidth, + %height=1.5\textwidth + } \begin{axis}[ ybar stacked, - enlargelimits=0.05, + %enlargelimits=0.05, ylabel={Zeitaufwand}, xlabel={$n$}, - symbolic x coords={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}, + symbolic x coords={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22}, nodes near coords, nodes near coords align={vertical}, ] \addplot+[ybar] coordinates {(1,1) (2,1) (3,1) (4,1) (5,1) (6,1) (7,1) (8,1) (9,1) (10,1) - (11,1) (12,1) (13,1) (14,1) (15,1) (16,1) (17,1) (18,1)}; - \addplot+[ybar] coordinates {(1,0) (2,1) (3,2) (4,0) (5,4) (6,0) (7,0) (8,0) (9,8) (10,0) - (11,0) (12,0) (13,0) (14,0) (15,0) (16,0) (17,16) (18,0)}; - \legend{\strut $n$ Einfügen, \strut Umstrukturierung} + (11,1) (12,1) (13,1) (14,1) (15,1) (16,1) (17,1) (18,1) (19,1) (20,1) (21,1) (22,1)}; + \addplot+[ybar] coordinates {(1,0) (2,1) (3,0) (4,2) (5,0) (6,1) (7,0) (8,3) (9,0) (10,1) + (11,0) (12,2) (13,0) (14,1) (15,0) (16,4) (17,0) (18,1) (19,0) (20,2) (21,0) (22,1)}; + \legend{\strut (3.3) (\texttt{ins}), \strut (3.5) (\texttt{balance}))} \end{axis} \end{tikzpicture}