48 lines
3.9 KiB
TeX
48 lines
3.9 KiB
TeX
|
\chapter{Implementation}
|
||
|
|
||
|
For the implementation of rank-balanced trees we have used two programming languages: C\# and Python. C\# implementation has not been finished and therefore is not part of the submitted attachments. However it has given a valuable insight into the role of preconditions and invariants in algorithms while \texttt{null}-checking is enforced, since, for example, static type control cannot be aware of a node \textbf{not} being a \texttt{null} after checking specific set of conditions that forbid such scenario.
|
||
|
|
||
|
Python has been chosen as the \textit{go-to} language, since it is used for teaching foundations of programming~\cite{ib111} and also introductory course of algorithms and data structures~\cite{ib002} at our faculty.
|
||
|
|
||
|
We have started by implementing a general idea of a rank-balanced tree. Rank-balanced tree is an abstract class that \textbf{does not} implement methods specific to different kinds of trees such as
|
||
|
|
||
|
\begin{enumerate}
|
||
|
\item \texttt{is\_correct\_node} is used to check whether node and its subtrees satisfy rank rules
|
||
|
\item \texttt{\_insert\_rebalance} rebalances the tree from the given node after insertion
|
||
|
\item \texttt{\_delete\_rebalance} rebalances the tree from the given nodes (deleted node and parent) after deletion
|
||
|
\end{enumerate}
|
||
|
|
||
|
Apart from the abstract methods there is provided following interface that is either shared by the specific trees or used by them:
|
||
|
|
||
|
\begin{enumerate}
|
||
|
\item \texttt{\_get\_unwrapped\_graph} that is used to generate DOT format of the tree for purpose of either debugging or sharing
|
||
|
\item \texttt{rank} returns rank of the root of the tree
|
||
|
\item \texttt{is\_correct} calls \texttt{is\_correct\_node} on the root of the tree
|
||
|
\item \texttt{search} is used to look up keys in the tree
|
||
|
\item \texttt{insert} implements generic insertion into the tree followed by a call to tree-specific rebalance function
|
||
|
\item \texttt{delete} is identical to \texttt{insert}, but for the deletion from the tree
|
||
|
\end{enumerate}
|
||
|
|
||
|
Apart from that we have also implemented class for representation of nodes that provides quite rich interface that is utilized during rebalancing and also in generic methods on generic tree.
|
||
|
|
||
|
\section{Testing and validation}
|
||
|
|
||
|
From the beginning we have employed the techniques of property-based testing (done manually during C\# implementation and uses Hypothesis~\cite{hypothesis} for Python implementation). The elementary requirement for testing and validation of implemented algorithms was a \textbf{correct} \texttt{is\_correct\_node} method that validates properties of a specific rank-balanced tree and a good set of invariants. List of set invariants follows:
|
||
|
|
||
|
\begin{enumerate}
|
||
|
\item for insertion we have set following invariants
|
||
|
\begin{itemize}
|
||
|
\item Rank rules have not been broken after the insertion.
|
||
|
\item Inserted value can be found in the tree after the insertion.
|
||
|
\item All previously inserted values can still be found in the tree.
|
||
|
\end{itemize}
|
||
|
\item for deletion we have set following invariants
|
||
|
\begin{itemize}
|
||
|
\item Rank rules have not been broken after the deletion.
|
||
|
\item Deleted node can no longer be found in the tree after the deletion.
|
||
|
\item All other values can still be found in the tree.
|
||
|
\end{itemize}
|
||
|
\end{enumerate}
|
||
|
|
||
|
We also admit abuse of property-based testing to find a \textit{minimal} sequence of operations when WAVL tree relaxation manifests. For that purpose we have implemented a \textit{comparator} class that takes two different instances of rank-balanced trees and provides rudimentary \texttt{insert} and \texttt{delete} interface enriched with \texttt{are\_same} (evaluates isomorphism and ranks) and \texttt{are\_similar} (evaluates just isomorphism) methods. While trying to find minimal counter-example, we have also discovered a bug in rebalance after deletion of WAVL tree that caused enforcement of the AVL rank rules.
|