\section{Indexa\c c\~ao baseada em compara\cao}

\'Arvores podem ser usadas para representar conjuntos de dados ou
para representar \ii ndices que facilitam o acesso r\aa pido a grandes 
conjuntos de dados. Quando um n\oo\ $u$ de uma \aa rvore \ee\ rotulado com
um valor $x$ diz-se que $u$ cont\ee m (ou armazena) a chave $x$.

Esta se\cao\ apresenta \aa rvores de pesquisa, cuja organiza\cao\ est\aa\ baseada
em compara\coes\ entre chave. Assume-se de agora em diantes que as chaves 
armazenadas nas \aa rvores (r\oo tulos dos n\oo s) s\ao\ retiradas de um
algum conjunto $A$ que suporta uma rela\cao\ de ordem total $\prec$:
\[ \bndA{x,y}{x,y\in A}{x\prec y\lor y\prec x\lor x=y}\]

\begin{definition}
	Os elementos de uma \aa rvore $G$ sobre $A$ s\ao\ os elementos de $A$
	que ocorrem em r\oo tulos de $G$.
\end{definition}

\begin{definition}
	\'Arvore de pesquisa de ordem $m$ \dfn\ \aa rvore rotulada com elementos
	de uma conjunto ordenado $A$ tal que:
	\begin{itemize}
		\item cada n\oo\ tem no m\aa ximo $m$ descendentes;
		\item um n\oo\ com $k+1$ descendentes cont\ee m (\ee\ rotulado com)
			uma \sqn\ ordenada de $k>0$ elementos distintos de $A$;
		\item se $\xsqn{s_1,s_2,\cdots,s_k}$ rotula o n\oo\ $t$ e 
			$\xsqn{p_0,p_1,\cdots,p_k}$ \ee\ a \sqn\ de seus 
			descendents, valem as propriedades:
			\begin{itemize}
				\item todos os elementos de $p_0$ s\ao\ menores
					do que $s_1$.
				\item 
			$\bndA{i}{\lelt 0ik}{\forall x\in p_i: s_i<x<s_{i+1}}$
			        \item todos os elementos de $p_k$ s\ao\ maiores do
					que $s_k$.
			\end{itemize}
	\end{itemize}
\end{definition}

A \aa rvore da \rffig{bst:zero} \ee\ uma \aa rvore bin\aa ria  de pesquisa: tem
ordem $m$.


Uma representa\cao\ comum de \aa rvores de pesquisa \ee\ aquela em que os
n\oo s internos representam um \ii ndice e as folhas cont\^em o conjunto 
representado, possivelmente, repetindo itens que ocorem em n\oo s internos.
Essa s\ao\ chamadas \emph{leaf search trees}, \aa rvores de pesquisa em folha. 
A \rffig{lbst:zero} representa uma \aa rvore de pesquisa em folha equivalente
\aa\ \aa rvore de pesquisa da \rffig{bst:zero}.

\begin{figure}
%\epsfig{file=lbst0.ps}
\ingraphicsfix{lbst0}
\caption{\'Arvore de pesquisa em folha}\label{lbst:zero}
\end{figure}

\subsection{\'Arvores balanceadas}
Overmars, em \cite{overmars:dynamic-ds}, apresenta o seguinte conceito de
\aa rvore balanceada.

\begin{definition}
	Uma \'arvore de pesquisa de ordem $m$ est\aa\ balanceada quando sua 
	profundidade \ee\ menor ou igual do que $c\log n$, onde $n$ \ee\ o
	n\uu mero de itens na \aa rvore e $c$ \ee\ uma constante que depende apenas
	do tipo da \aa rvore.
\end{definition}

A import\^ancia desse conceito est\aa\ relacionada ao seguinte teorema que define
o upper-bound para a pesquisa em uma \aa rvore de pesquisa balanceada.
\begin{ex}
	Prove que s\ao\ necess\aa rias no m\aa ximo $O(\log n)$ compara\coes\ de chaves
	para determinar se um dado item ocorre em uma \aa rvore de pesquisa 
	balanceada.
	
\end{ex}

Overmars prop\~oe classificar \aa rvores de acordo com 
os seguintes crit\ee rios para balanceamento:
\begin{itemize}
	\item balanceamento de altura: a \tree\ \ee\ balanceada impondo-se
		restri\coes\ na altura de suas sub-\tree s.
		\begin{definition}
			\'Arvore AVL \dfn\ \bintree\ em que, para qualquer
			\innode, a altura de \subtree\ esquerda difere da
			altura da \subtree\ da direita por no m\aa ximo um.
			(Veja \cite{dek:taocp:iii} para algoritmos.)
		\end{definition}
	\item balanceamento de peso: a \tree\ \ee\ mantida balanceada impondo
		a restri\cao\ de que para qualquer \innode\ o n\uu mero de 
		folhas na \subtree\ da esquerda dividido pelo n\uu mero total
		de folhas fica dentro de um intervalo fixo. 
		(\emph{BB$[\alpha]$-trees} s\ao\ exemplo.)
	\item balanceamento de grau: todas as folhas da \aa rvore t\^em a
		mesma profundidade e o balanceamento \ee\ obtido variando
		o grau dos \innodes. A \aa rvore B, \cite{dek:taocp:iii} e
		\cite{comer:btree}, e suas variantes s\ao\ os exemplos 
		cl\aa ssicos.
	\item balanceamento de profundidade: o balanceamento \ee\ obtido
		impondo-se restri\coes\ sobre a diferen\ca\ entre a maior e
		menor profundidade poss\ii vel das folhas. 
		\emph{$\alpha BB$-trees} s\ao o exemplo 
		(\cite{overmars:dynamic.ds}.)
\end{itemize}
\begin{definition}
	\Tree-2-3  \dfn\ 
	\tree\ de pesquisa de ordem $3$ em que todas as folhas
	est\ao\ no mesmo \lvl, ver \cite{ahu:daca} e \cite{dek:taocp:iii}.
\end{definition}

Estrutura criada por Hopcroft em 1971, \ee\ apresentada com pequenas varia\coes\
dependendo do texto: veja, por exemplo \cite{cormen:lrs:algo} e 
\cite{overmars:dynamic.ds}.

A seguir s\ao\ introduzidos construtores para os tr\^es tipos de \node s da
\tree-2-3. 

\begin{definition}
	\Tree-2-3 sobre A (denotada \textbf{Tree.A} \dfn\ 
	\tree\ de pesquisa de ordem $3$ cujos \node s s\ao\
	constu\ii dos de acordo com seguintes axiomas:
	\begin{enumerate}
		\item se $s\in A$ ent\ao\ $Leaf.a\in Tree.A$
		\item se $p_0,p_1\in Tree.A$ e $s\in A$ ent\ao\ 
			\[ Node2 (p_0,s,_p1)\in Tree.A\]
			desde que:
			\begin{itemize}
				\item $s$ seja maior ou igual do que 
					($\not\prec$ na defini\cao\ original
					de \tree\ de pesquisa) qualquer
					item em $p_0$;
				\item $s$ seja menor do que ($\prec$) qualquer
					item em $p_1$.
			\end{itemize}
		\item se $p_0,p_1p_2\in Tree.A$ e $s_1,s_2\in A$ ent\ao\ 
			\[ Node3 (p_0,s_1,_p1,s_2,p_2)\in Tree.A\]
			desde que:
			\begin{itemize}
				\item $s_i$ seja maior ou igual do que 
					($\not\prec$ na defini\cao\ original
					de \tree\ de pesquisa) qualquer
					item em $p_{i-1}$, quando $\lele1i2$;
				\item $s_2$ seja menor do que ($\prec$) qualquer
					item em $p_2$.
			\end{itemize}
	\end{enumerate}
\end{definition}

Essa defini\cao\ introduz uma \aa rvore de pesquisa em folha: os \innodes\
servem apenas de \ii ndice para as folha.

Note que essa defini\cao\ n\ao\ pode ser considerada como rigorosa porque
acaba introduzindo os construtores e a pertin\^encia simultaneamente.

\begin{ex}
	Apresente um defini\cao\ axiom\aa tica rigorosa de \tree-2-3.
\end{ex}

\begin{ex}
	Propriedades sobre a \tree\ podem ser provadas de forma indutiva, usando
	indu\cao\ sobre a profundidade (ou altura) da \aa rvore. Estabel\ca\
	um princ\ii pio de indu\cao\ para a \tree-2-3.
\end{ex}

\begin{ex}
	Defina um operador de pertin\^encia: dados $x\in A$ e $t\in Tree.A$,
	\[ x\in t\]
	determina se $x$ ocorre em $t$.
\end{ex}

\begin{ex}
	Defina um predicado que \ee\ satistfeito por $t\in Tree.A$ quando
	$t$ \ee\ uma \aa rvore ordenada.
\end{ex}

\begin{ex}
	Defina o predicado $depthbal.t$ que \ee\ satisfeito quando $t$ \ee\
	uma $Tree.A$ e suas folhas est\ao\ todas no mesmo \lvl.
\end{ex}

A \rffig{fig:2.3.tree.data} apresenta um tipo de dados em Haskell para 
representar uma \aa rvore-2-3. Note que esse tipo nao estabele as condi\coes\ 
de balanceamento e ordena\cao. Por isso, \ee\ ``heresia'' afirmar que em 
Haskell, C, ou Java, por exemplo, existem tipos abstratos de dados. Essas
linguagens apresentam apenas o suporte para de defini\cao\ de representa\cao\
e de algoritmos para manipula\cao\ de tipos encapsulados. Um dos
fundamentos de tipos abstratos que \ee\ a defini\cao\ l\oo gica de operadores
e a rela\cao\ entre eles n\ao\ pode ser constru\ii da nessas linguagens.

\begin{figure}
	\lstinputlisting[language=Haskell]{data.23tree.hs}
	\caption{Inser\cao\ \tree-2-3}
	\label{fig:2.3.tree.data}
\end{figure}

A \rffig{fig:2.3.tree.insert} apresenta a inser\cao\ em \innode\ de grau dois.
Note que o construtor \textbf{Up} do tipo \textbf{NodeSplit} \ee\ usado
para indicar quebra de \node.\footnote{
\href{http://www.inf.ufes.br/~raulh/ufes/teaching/courses/s.and.s/cw/23tree.hs}
{Baixe} c\oo digo completo.}

\begin{figure}
	\lstinputlisting[language=Haskell]{nodeins.23tree.hs}
	\caption{Inser\cao\ \tree-2-3 (\innode\ de grau 2)}
	\label{fig:2.3.tree.insert}
\end{figure}


\begin{ex}
	Prove que o algoritmo de inser\cao\ em \tree-2-3 preserva a ordena\cao\
	da \tree.
\end{ex}

\begin{ex}
	Prove que o algoritmo de inser\cao\ em \tree-2-3 preserva a 
	propriedade de que todas as folhas ficam no mesmo n\ii vel.
\end{ex}


\begin{ex}
	Prove que a \tree\ \emph{Tree.A} com profundidade $k$ tem de
	$2^k$ a $3^k$ folhas.
\end{ex}

\begin{ex}
	Prove que para determinar se um item ocorre na \tree\ definida s\ao\
	necess\aa rias $Theta(\lg n)$ compara\coes.
\end{ex}

\begin{ex}
	Prove que para inserir novo item em uma \emph{Tree.A} s\ao\ 
	necess\aa rios $\Theta(N)$ acessos a \node s.
\end{ex}

\begin{ex}
	Construa um algoritmo de exclus\ao\ de itens para
	a \tree\ \emph{Tree.A} e prove sua corre\cao.
\end{ex}

\subsubsection{\'Arvore B}
Uma generaliza\cao\ \oo bvia da \tree-2-3 \ee\ a \textbf{\tree-B}.
\begin{definition}
	\Tree-B de ordem $m$ \dfn\ \tree\ de pesquisa de ordem $m$ satisfazendo
	as seguintes restri\coes:
	\begin{itemize}
		\item todas as folhas est\ao\ no mesmo n\ii vel;
		\item o grau da raiz pode variar de $2$ a $m$;
		\item o grau de outros \innodes\ varia de $m/2$ a $m$.
	\end{itemize}
\end{definition}

A defini\cao\ acima \ee\ apresentada em \cite{dek:taocp:iii}. Note essa
defini\cao\ tamb\ee m varia de acordo com o autor: por exemplo, 
\cite{wirth:a.ds} apresenta como \btree\ de ordem aquilo que 
\cite{dek:taocp:iii} chama de \btree\ de ordem $2m+1$.

Varia\coes\ de \btree\ encontradas na literatura objetivam principalmente
reduzir o n\uu mero de acessos a disco, assumindo que a \tree\ esteja armazenada
em disco. Entre as estrat\ee gias est\ao: aumentar a ordem da \tree, o que 
reduz sua profundidade e tentar obter ocupa\cao\ maior por \node.
As seguintes variantes de \btree\ s\ao\ frequentemente citadas:
\begin{itemize}
	\item \'arvore $B^+$, em \cite{dek:taocp:iii}, chamadas \tree\ $B^*$
		em \cite{bayer:prefix.btree}: \btree\ de pesquisa em folha
		em que as folhas s\ao\ parte de uma lista encadeada, 
		facilitando a listagem sequencial dos itens da \tree;
	\item \tree\ $B^*$ em \cite{dek:taocp:iii}: o grau da raiz varia
		de $2$ a $2\lfloor(2m-2)/3\rfloor+1$ e outros \innodes\
		t\^em grau maior ou igual $(2m-1)/3$.
	
\end{itemize}

\subsubsection{\'Arvore B e a indexa\c c\~ao de strings}
V\aa rias alternativas t\^em sido identificadas para aplicar \tree s $B$ \`a 
indexa\cao\ de strings. A indexa\cao\ de strings traz a dificuldade de que
chaves tendem a ter tamanhos diferentes, o que n\ao\ combina com a id\ee ia
de \node s de tamanho fixo e n\uu mero m\aa ximo de chaves tamb\ee m fixo.
As alternativas s\ao:
\begin{itemize}
	\item Armazenar nos \node s refer\^encias para as chaves. Isso, no
		m\ii nimo duplica o n\uu mero de acessos a disco para 
		qualquer opera\cao.
	\item Fixar o tamanho em bytes do \node\ permitindo que varie
		o tamanho das chaves. Neste caso, \ee\ importante ter um
		caracter distinto para ser separador dos strings que
		s\ao\ as chaves: veja \cite{dek:taocp:iii}. Esta alternativa
		ainda pode ser invi\aa vel quando os strings t\^em longas
		repeti\coes de caracteres.
\end{itemize}

A seguir considere que o objetivo consiste em indexar os sufixos de
\[ aabaadac\]

As figuras a seguir mostram uma \emph{leaf search} \btree\ de ordem $3$.
Note que:
\begin{itemize}
	\item as folhas cont\^em todos os sufixos ordenados da esquerda para
		a direita;
	\item embora sejam mostrados partes dos sufixos, a respresenta\cao\ real
		deveria conter em todos os \node s refer\^encias para os
		respectivos sufixos.
\end{itemize}


As figuras em apresentam os est\aa gios sucessivos da \tree.
A \rffig{fig:btree.0} ap\oo s a inser\cao\ dos $3$ primeiros sufixos: 
note que o sufixo $1$, iniciado com \emph{ab}, ocorre em
\innode, como \ii ndice e e em \node\ externo, como informa\cao. 
Al\ee m disso, s\oo\ a parte inicial de cada sufixo \ee\ exibida. Em uma
implementa\cao, provavelmente uma refer\eh cia para o sufixo \textbf{baadac}
apareceria no lugar de \textbf{ba}.
		
\begin{figure}
	\begin{center}
		%\psfig{figure={btree0.ps}}
		\ingraphics{width=2in,height=2in}{btree0.jpg}{scale=0.8}{btree0.ps}
	\end{center}
	\caption{A \btree\ com tr\^es sufixos}
	\label{fig:btree.0}
\end{figure}

A \rffig{fig:btree.1} mostra a \tree\ com os primeiros $4$ sufixos.

\begin{figure}
	\begin{center}
		%\psfig{figure={btree1.ps}}
		\ingraphicsfix{btree1}
	\end{center}
	\caption{A \btree\ com quatro sufixos}
	\label{fig:btree.1}
\end{figure}

As figuras \ref{fig:btree.2}, \ref{fig:btree.3} e \ref{fig:btree.4} mostram
as \tree s, respectivamente com $5$, $6$ e $8$ sufixos.

\begin{figure}
	\begin{center}
		%\psfig{figure={btree2.ps}}
		\ingraphicsfix{btree2}
	\end{center}
	\caption{A \btree\ com cinco sufixos}
	\label{fig:btree.2}
\end{figure}

\begin{figure}
	\begin{center}
		%\psfig{figure={btree.3.ps}}
		\ingraphicsfix{btree3}
	\end{center}
	\caption{A \btree\ com seis sufixos}
	\label{fig:btree.3}
\end{figure}

\begin{figure}
	\begin{center}
		%\psfig{figure={btree.4.ps}}
		\ingraphicsfix{btree4}
	\end{center}
	\caption{A \btree\ com oito sufixos}
	\label{fig:btree.4}
\end{figure}

Ferragina e Grossi, em \cite{ferragina:string.btree},
prop\~oem uma representa\cao\ alternativa onde os
\node \ internos cont\eh m pares que definem os limites inferior e
superior dos descendentes respectivos. A figura \ref{fig:sbtree.0} mostra
a \tree\ com os $8$ sufixos. Eles denominam essa estrutura \emph{String B-Tree} 
simples. \'E interessante que essa id\ee ia j\aa\ aparece em
estrutura de indexa\cao\ multi-dimensional como \emph{k-d-b-tree} e 
\emph{R-tree}. A vers\ao\ completa da \emph{String B-tree} representa os
n\oo s internos em uma \aa rvore digital.

\begin{figure}
	\begin{center}
		%\psfig{figure={sbtree0.ps}}
		\ingraphicsfix{sbtree0}
	\end{center}
	\caption{A \emph{String B-tree} simples}
	\label{fig:sbtree.0}
\end{figure}



