Skip to main content
Engineering LibreTexts

9.3: Summary

  • Page ID
    8474
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    The following theorem summarizes the performance of the RedBlackTree data structure:

    Theorem \(\PageIndex{1}\).

    A RedBlackTree implements the SSet interface and supports the operations \(\mathtt{add(x)}\), \(\mathtt{remove(x)}\), and \(\mathtt{find(x)}\) in \(O(\log\mathtt{n})\) worst-case time per operation.

    Not included in the above theorem is the following extra bonus:

    Theorem \(\PageIndex{2}\).

    Beginning with an empty RedBlackTree, any sequence of \(m\) \(\mathtt{add(x)}\) and \(\mathtt{remove(x)}\) operations results in a total of \(O(m)\) time spent during all calls \(\mathtt{addFixup(u)}\) and \(\mathtt{removeFixup(u)}\).

    We only sketch a proof of Theorem \(\PageIndex{2}\). By comparing \(\mathtt{addFixup(u)}\) and \(\mathtt{removeFixup(u)}\) with the algorithms for adding or removing a leaf in a 2-4 tree, we can convince ourselves that this property is inherited from a 2-4 tree. In particular, if we can show that the total time spent splitting, merging, and borrowing in a 2-4 tree is \(O(m)\), then this implies Theorem \(\PageIndex{2}\).

    The proof of this theorem for 2-4 trees uses the potential method of amortized analysis.2 Define the potential of an internal node \(\mathtt{u}\) in a 2-4 tree as

    \[ \Phi(\mathtt{u}) = \begin{cases}
    1 & \text{if $\mathtt{u}$ has 2 children}\\
    0 & \text{if $\mathtt{u}$ has 3 children} \\
    3 & \text{if $\mathtt{u}$ has 4 children} \end{cases}\nonumber\]

    and the potential of a 2-4 tree as the sum of the potentials of its nodes. When a split occurs, it is because a node with four children becomes two nodes, with two and three children. This means that the overall potential drops by \(3-1-0 = 2\). When a merge occurs, two nodes that used to have two children are replaced by one node with three children. The result is a drop in potential of \(2-0=2\). Therefore, for every split or merge, the potential decreases by two.

    Next notice that, if we ignore splitting and merging of nodes, there are only a constant number of nodes whose number of children is changed by the addition or removal of a leaf. When adding a node, one node has its number of children increase by one, increasing the potential by at most three. During the removal of a leaf, one node has its number of children decrease by one, increasing the potential by at most one, and two nodes may be involved in a borrowing operation, increasing their total potential by at most one.

    To summarize, each merge and split causes the potential to drop by at least two. Ignoring merging and splitting, each addition or removal causes the potential to rise by at most three, and the potential is always non-negative. Therefore, the number of splits and merges caused by \(m\) additions or removals on an initially empty tree is at most \(3m/2\). Theorem \(\PageIndex{2}\) is a consequence of this analysis and the correspondence between 2-4 trees and red-black trees.


    Footnotes

    2See the proofs of Lemma 2.5.1 and Lemma 3.3.1 for other applications of the potential method.


    This page titled 9.3: Summary is shared under a CC BY license and was authored, remixed, and/or curated by Pat Morin (Athabasca University Press) .

    • Was this article helpful?