\section{Introdu\c c\~ao}

\subsection{Conjuntos: opera\c c\~oes}
Opera\coes\ t\ii picas com conjuntos:
\begin{itemize}
	\item pertin\eh ncia;
	\item uni\ao\ dos conjuntos de uma cole\cao;
	\item interse\cao\ dos conjuntos de uma cole\cao;
	\item diferen\ca\ de conjuntos;
	\item constru\cao\ de um novo conjunto a partir de um conjunto e um 
		elemento dado;
	\item separa\cao\ dos elementos de um conjunto em rela\cao\ a uma 
		propriedade dada;
	\item contagem de elementos de um conjunto;
	\item ordena\cao\ dos elementos de um conjunto;
	\item identifica\cao\ de todos os elementos em um intervalo dado.
\end{itemize}

Quest\oes\ que influenciam na decis\ao\ sobre a representa\cao\ de conjuntos
em um programa:
\begin{itemize}
	\item Algoritmos que trabalham com conjuntos fixos de dados demandam
		o uso de estruturas que sejam eficientes em termos de:
		\begin{itemize}
			\item tempo de constru\cao\ das etsruturas de dados para
				armazenar os objetos em quest\ao;
			\item tempo necess\aa rio\ para consultar a estrutura em 
				rela\cao a alguma propriedade, por exemplo,
				presen\ca\ de um objeto dado;
			\item espa\co\ necess\aa rio para armazenar a estrutura.
		\end{itemize}
	\item Algoritmos que lidam conjuntos de dados, cujos elementos variam
		durante uma execu\cao\ demandam estruturas din\^amicas e tempos
		eficientes de atualiza\cao, inser\cao\ e retirada de objetos
		da estrutura.
\end{itemize}

Uma outra quest\ao\ importante diz respeito ao n\uu mero de dimens\oes\ dos 
objetos representados: a ordena\cao\ de coordenadas de pontos na linha tende
a demandar algoritmos mais simples do que a ordena\cao\ de pontos no espa\co\
com $d>1$ dimens\oes.

Considerando ainda algoritmos com conjuntos est\aa ticos de dados em uma
dimens\ao, os algoritmos cl\aa ssicos de ordena\cao, quicksort ou heapsort, por 
exemplo, associados a algoritmos como pesquisa bin\aa ria fornecem um framework
que eficiente tanto em termos de espa\co\, linear, quanto em rela\cao\
aos tempos de consulta, logar\ii tmico no caso de pertin\^encia.

\subsection{Grafos e \'arvores}
Conjuntos de dados din\^amicos e at\ee\ mesmo conjuntos est\aa ticos com dados
representadoos em uma mais de uma dimens\ao\ geralmente demandam estruturas e
algoritmos mais complexas: entre as op\coes\ dispon\ii veis est\ao\ \aa rvores e
hashes.


\begin{definition}
	Um grafo $G$ \dfn\ um par $(V,E)$ onde $V$ \ee\ um conjunto de v\ee rtices 
	e $E\subseteq \xset{x,y:x,y\in V:\xset{x,y}}$, 
	chamado conjunto de pares. Dado um grafo $G$,
        $V.G$ denotar\aa\ o conjunto de v\ee rtices e $E.G$ denotar\aa\ o 
	conjunto de arestas. 
\end{definition}

A \rffig{graph} mosta uma grafo onde
\begin{gather*}
	V = \xset{a,b,c,d,e,f}\\
	E = \xset{\xset{a,d},\xset{d,e},\xset{e,f},\xset{f,c},\xset{c,a}}
\end{gather*}

\begin{figure}
%\psfig{file=graph1}
\ingraphics{scale=0.25}{graph1.jpg}{scale=0.8}{graph1.ps}
\caption{Um grafo n\ao\ dirigido}\label{graph}
\end{figure}


Grafos em que os elementos de $E$ s\ao\ pares ordenados, ou seja $E\subseteq VxV$,
s\ao\ chamados grafo dirigidos, veja um 
exemplo na \rffig{digraph}


\begin{figure}
\ingraphics{scale=0.25}{digraph0.jpg}{scale=0.8}{digraph0.ps}
\caption{Grafo dirigido}\label{digraph}
\end{figure}


\begin{definition}
	V\ee rtices $v,u\in V.G$ s\ao\ adjacentes em $G$ \dfn $\xset{u,v}\in E$.
\end{definition}

\begin{definition}
	Grau de um v\ee rtice $v\in V.G$  \dfn n\uu  mero de v\ee rtices a
	ele adjacentes em $G$.
\end{definition}

\begin{definition}
	Caminho em um grafo $G$ \dfn 
	\sqn\ de v\ee rtices tal que se $v_{i+1}$
	sucede $v_i$ na \sqn, ent\ao\ $\xset{v_i,v_{i+1}}\in E.G$.
\end{definition}

\begin{definition}
	\'Arvore \dfn  grafo em que existe exatamente um caminho conectando
	qualquer par de v\ee rtices.
\end{definition}

O grafo da \rffig{atree} \ee\ uma \aa rvore.

\begin{figure}
%\epsfig{file=unrootedtree.ps}
\ingraphics{scale=0.25}{unrootedtree.jpg}{scale=0.8}{unrootedtree.ps}
\caption{Uma \'arvore}\label{atree}
\end{figure}
 

\begin{definition}
	Uma \aa rvore com raiz \ee\ uma \aa rvore em que um v\ee rtice distinto 
	\ee\ designado como raiz.
\end{definition}

Usualmente os v\ee rtices de uma \aa rvore com raiz s\ao\ chamados de n\oo s.

\begin{definition}
	Descendentes de um n\oo $u$ em uma \aa rvore $G$ \dfn conjunto 
	de n\oo s $x\in V.G$ tal que
	$x$ n\ao\ est\aa\ no caminho que liga a raiz 
	da \aa rvore a $u$.

	Filhos de um n\oo\ $u$ em uma \aa rvore $G$ \dfn conjunto de descentes
	de $u$ que lhe s\ao\ adjacentes.

	Folha ou n\oo\ externo \dfn n\oo\ sem descendentes. 

	N\oo\ interno \dfn n\oo\ que tem descendentes.
\end{definition}

\begin{definition}
	Grau (ou \emph{branching factor}) de um n\oo\ em uma \aa rvore com raiz
	\dfn n\uu mero de filhos do n\oo.

	Ordem de uma \aa rvore com raiz \dfn  grau m\aa ximo de qualquer de seus 
	n\oo s.
\end{definition}

\begin{definition}
	Profundidade (ou n\ii vel) de um n\oo\ $u$ \dfn\ 
	n\uu mero de arestas do  caminho que liga
	a raiz ao n\oo\ $u$.
	
	Profundidade da \aa rvore \dfn\ m\aa ximo das profundidades das folhas.
\end{definition}

\begin{definition}
	Altura de um n\oo\ $u$ \dfn\ profundidade da sub\aa rvore com raiz em $u$.

	Altura da \aa rvore \dfn\ altura da raiz da \aa rvore.
\end{definition}

\'Arvore tem um interesse especial em computa\cao\ como estruturas eficientes 
para representar conjuntos de dados. Nesses casos, seus n\oo s e, possivelmente,
suas arestas podem 
ser rotulados com os dados armazenados.

A \rffig{bst:zero} representa uma \aa rvore bin\aa ria (ordem 2)
de pesquisa de inteiros.
Alguns dados sobre essa \aa rvore:
\begin{itemize}
	\item A raiz \ee\ o n\oo\ cujo r\oo tulo \ee\ $10$.
	\item Sua profundidade \ee\ tr\^es, a profundidade da folha rotulada com
		$22$.
	\item Sua ordem \ee\ dois, cada n\oo\ tem no m\aa ximo dois descendentes.
	\item O n\oo\ rotulado com $25$ \ee\ o \uu nico com grau um.
	\item Os r\oo tulos dos n\oo s est\ao\ ordenados da direita para a 
		esquerda.
\end{itemize}

\begin{figure}
%\epsfig{file=bst0.ps}
\ingraphicsfix{bst0}
\caption{\'Arvore com raiz}\label{bst:zero}
\end{figure}



