You are on page 1of 15

Algoritmos e Estrutura de Dados !!

1 f 15
Algoritmos e Estrutura de Dados 2
Apostila de curso

Prof. Andr M. C. Campos
ltima atualizao: 02/abr/2005


Algoritmos e Estrutura de Dados !!
2 f 15
ndice

INTRODUO............................................................................................................................................ 3
1 RVORES DE PESQUISA................................................................................................................ 4
1.1 BUSCA BINARIA............................................................................................................................ 4
1.2 RVORES DE PESQUISA ................................................................................................................ 5
1.3 RVORES BINARIAS DE PESQUISA................................................................................................. 6
1.4 RVORES AVL .......................................................................................................................... 10
1.5 RVORES (2,4) ........................................................................................................................... 11
1.6 RVORES RUBRO-NEGRAS.......................................................................................................... 11
2 PROCESSAMENTO DE TEXTO................................................................................................... 12
2.1 ALGORITMOS PARA PROCURA DE PADRES................................................................................ 12
2.2 BUSCA DIGITAL.......................................................................................................................... 12
2.3 COMPRESSO DE TEXTOS ........................................................................................................... 12
2.4 SIMILARIDADE DE TEXTOS ......................................................................................................... 12
3 GRAFOS............................................................................................................................................ 13
3.1 REPRESENTAES E TIPOS DE GRAFOS....................................................................................... 13
3.2 CAMINHAMENTO EM GRAFOS .................................................................................................... 13
3.3 PROBLEMAS DE CONEXIDADE..................................................................................................... 13
3.4 CAMINHOS MINIMOS .................................................................................................................. 13
3.5 RVORE GERADORA MINIMA...................................................................................................... 13
3.6 EXERCICIOS................................................................................................................................ 13
4 ALGORITMOS GEOMETRICOS................................................................................................. 14
4.1 FECHO CONVEXO........................................................................................................................ 14
4.2 TRIANGULAES........................................................................................................................ 14
4.3 DIAGRAMA DE VORONOI............................................................................................................ 14
4.4 EXERCICIOS................................................................................................................................ 14
BIBLIOGRAFIA........................................................................................................................................ 15

Algoritmos e Estrutura de Dados !!
3 f 15
Introduo
Esta apostila apresenta os conceitos basicos apresentados na disciplina de
Algoritmos e Estruturas de Dados !!, oferecida no curso de Engenharia de
Computaao da Universidade Federal do Rio Grande do Norte.
O curso pressupoe que o estudante ja tenha cursado a disciplina Algoritmos
e Estruturas de Dados ! e, portanto, tenha familiaridade com estruturas basicas
como filha, pilha, listas encadeadas e arvores genricas.
Esta apostila esta sendo elaborada em um estilo coloquial, procurando fazer
com que a leitura seja de facil absorao. Este documento nao tem portanto a
finalidade de ser um tratado tcnico sobre algoritmos, mas apenas um
complemento a ser utilizado na recapitulaao dos assuntos abordados em sala de
aula. Da mesma maneira que o curso organizado em assuntos, essa apostila
tambm o .
O primeiro capitulo aborda arvores de pesquisa. Nele apresentamos varios
tipos de arvores de pesquisa, a comear por arvores de pesquisa binaria. Em
seguida, apresentamos arvores balanceadas, se detalhando em arvores AvL,
arvores 2-+ e arvores rubro-negras.
O segundo capitulo aborda processamento de textos. Nele apresentamos
algoritmos basicos para fazer procura otimizada em textos, para comprimir
textos e testar similaridade de textos. Nesse ponto introduzimos o conceito de
heuristica de resoluao de problemas apresentando o mtodo Guloso
(compressao atravs do algoritmo de Huffman) e Programaao Dinamica para
testar a similaridade de textos.
O terceiro capitulo dedicado a grafos. Nele apresentamos os conceitos
basicos, a representaao e estruturas de dados que dem suporte a
implementaao de grafos. Apresentamos igualmente mtodos de caminhamento
em largura e profundidade, bem como algoritmos de caminho minimo e de
geraao da arvore de cobertura minima.
O ultimo capitulo aborda algoritmos de uma area denominada Geometria
Computacional. Ele apresenta inicialmente conceitos basicos e recapitulaoes de
geometria analitica. Em seguida, aborda o problema de geraao do Fecho
Convexo de uma nuvem de pontos, da geraao da triangulaao de Delaunay e de
seu contrario, Diagrama de voronoi.
Apresentamos ao final de cada capitulo uma recapitulaao dos assuntos
abordados e propomos varios exercicios de fixaao. Alm dos exercicios,
propomos igualmente projetos de implementaao que podem ser utilizados
durante os laboratrios da disciplina.
Algoritmos e Estrutura de Dados !!
+ f 15
1 rvores de pesquisa
1.1 Busca binria
Suponha que voc tenha um conjunto de elementos a armazenar no seu
computador, de forma que possa realizar inumeras buscas sobre esses
elementos. Suponha agora que voc utilize uma lista encadeada como estrutura
de dados para armazenar esses elementos. Como vocs devem lembrar, a
complexidade de busca em uma lista encadeada (no pior caso) O(n), onde n
o numero de elementos da lista. !sso ocorre porque precisamos percorrer a lista,
no pior caso (caso onde o elemento a ser procurado se encontre no final da
lista), do inicio (cabea da lista) at o final. E se pudssemos dar saltos" nessa
procura?
Claro que podemos dar saltos" em uma procura. Alias, essa a forma
natural de otimizar processos. Para melhor visualizar esse processo, imagine que
a busca, ao invs de utilizar uma lista como estrutura, possui um vetor de
tamanho fixo, com elementos dispostos em ordem crescente e possuindo, por
exemplo, 100 elementos, . Ao invs de iniciar sua busca no elemento inicial (0) e
se estender at o ultimo (100), voc pode testar o mdio (50) e verificar se o
numero a ser encontrado maior ou menor que o valor contido naquele indice.
Se for menor, como o vetor esta em ordem crescente, podemos desprezar todos
os numeros acima de do indice 50 e recomear a busca no intervalo de 0 a 50.
Esse procedimento devera se repetir at que o numero correspondente seja
encontrado ou nao exista no vetor. Esse procedimento, conhecido como busca
binria, gerou implicitamente uma arvore de busca, conforme ilustrado na
Figura 1-1.

Figura 1-1 Representao de uma busca binria.
O exemplo da Figura 1-1 ilustra o processo de busca de um elemento na
28 posiao do vetor. O processo comea a pesquisar no elemento mdio (50) e,
verificando-se que o elemento procurado menor que o elemento da 50
posiao, todos os elementos depois do 50 sao desprezados (sao maiores
mesmo!). Em seguida, o mesmo procedimento realizado para o subconjunto de
0 a 50, depois no subconjunto de 25 a 50, etc., reduzindo, a cada iteraao,
50
25
37
31
28
Maiores de 50

Algoritmos e Estrutura de Dados !!
5 f 15
metade dos possiveis elementos at chegar no elemento desejado, que, no
exemplo da figura, o 28.
Prestando bem atenao, vamos notar que esse processo de pesquisa gerou
implicitamente uma arvore. E se fizssemos o contrario?
Se ao invs da busca gerar uma arvore, termos uma arvore para fazer a
busca. Bom, parece que podemos agilizar o processo. Ao invs do processo de
busca criar uma arvore, podemos definir uma arvore que facilite o processo de
busca. Essa arvore apresentada na seao seguinte.
1.2 rvores de pesquisa
Como dito anteriormente, a busca binaria apresentada na seao anterior
pode ser estruturada nao mais em um vetor, mas em uma arvore. E, como em
cada comparaao temos duas opoes a seguir (elementos menores e elementos
maiores), a arvore sera binaria.
A vantagem dessa forma de representaao o custo associado ao processo
de inserao e remoao de elementos no conjunto. Para melhor justificar essa
proposiao, suponha que temos um problema que precise fazer busca de
elementos em um conjunto. Otimo! Temos o conceito de busca binaria e
podemos utilizar um vetor, como descrito na seao anterior, para facilitar a
busca. Porm, se no nosso problema, precisassemos repetidamente inserir novos
elementos ao conjunto e remover elementos existentes. Qual o custo do pior
caso dessas operaoes se usarmos um vetor ordenado?
O custo seria de O(n) tanto na inserao quanto na remoao, nao mesmo?
Pois , em ambos os casos teriamos que, na pior hiptese, deslocar todos os
elementos que se encontram a direita do novo ou existente elemento para a
esquerda (no caso da remoao) ou para a direita (no caso da inserao).
Para melhorar esse custo, podemos utilizar uma estrutura mais dinamica
que o vetor. Podemos usar uma arvore onde todos os elementos a esquerda de
um determinado n sao sempre menores que seu elemento (do n) e todos os
elementos a direita sao maiores. Esse tipo de arvore conhecido como rvore
de pesquisa.
Uma arvore de pesquisa uma arvore estrutura de forma a facilitar a busca
em seus elementos. Cada elemento deve estar associado a uma chave, cujo
conjunto define a seqncia ordenada" de busca de seus elementos. Cada n
da arvore possui, portanto, uma chave e um elemento, e deve fazer com que
todos os elementos cuja chave sejam menores que a sua se encontrem a
esquerda e todos aqueles cuja chave sejam maiores estejam a sua direita,
conforme ilustra a Figura 1-2.
Algoritmos e Estrutura de Dados !!
6 f 15

Figura 1-2 Exemplo de rvore de pesquisa. Os valores contidos nos ns representam as chaves dos
elementos.
De maneira mais formal, as arvores de pesquisa possuem a seguinte
propriedade:
Propriedade de rvores de pesquisa:
Seja u, v e w trs elementos de uma arvore de pesquisa, tal que
chave(u) S chave(v) S chave(w). Entao u se encontra a esquerda de v e w a
direita.
Cabe aqui salientar que uma arvore de pesquisa nao necessariamente
uma arvore binaria. Podemos ter, por exemplo, arvores de pesquisa com mais de
uma chave por n, como ilustrado na Figura 1-3. O importante em uma arvore
de pesquisa seguir a propriedade citada anteriormente.

Figura 1-3 Exemplo de rvore de pesquisa que no uma rvore binria.
A arvore da Figura 1-3 uma arvore (2-+), que veremos mais adiante.
Porm, a arvore de pesquisa mais utilizada a arvore binaria, apresentada a
seguir.
1.3 rvores binrias de pesquisa
Arvores binarias de pesquisa possuem a propriedade anterior com a
restriao que cada n possua no maximo dois filhos (ou sub-arvores), um a
esquerda e outro a direita, como ilustra a Figura 1-2. Para isso precisamos que
sua estrutura seja composta dos seguintes campos:
6
9 2
4


1

8

11 2+
2 6 8
15
30
27 32
Algoritmos e Estrutura de Dados !!
7 f 15
Estrutura N:
pai: referncia (ponteiro) para o n-pai do n corrente;
esq: referncia para seu filho esquerda;
dir: referncia para seu filho direita;
terminal: bandeira indicando se o n terminal ou no;
chave: chave do n
elemento: elemento do n

varias operaoes podem ser realizadas sobre esta estrutura, sendo as
operaoes de busca, inserao e remoao as principais.
De acordo com as propriedades da arvore, uma busca pode ser realizada
pelo algoritmo do Cdigo 1-1:
Algoritmo busca (k, r)
Entrada: k = chave a ser procurada
r = raiz da rvore de pesquisa
Sada: n de chave k ou um n terminal

se r.terminal = verd.
retorna r
se k < r.chave
// busca na sub-rvore da esquerda
retorna busca(k, r.esq)
seno se k > r.chave
// busca na sub-rvore da direita
retorna busca(k, r.dir)
seno
// achou
retorna r
Cdigo 1-1 Algoritmo de busca em uma rvore de pesquisa binria.
Ao inserir um novo n na arvore, necessario que a propriedade de
ordenaao das chaves continue sendo valida. Precisamos entao inserir o
elemento em uma posiao de forma que as chaves menores estejam a esquerda
e as chaves maiores a direita para qualquer n da arvore. O processo de busca
do Cdigo 1-1 ajuda a localizar o local ideal para inserirmos um novo elemento.
Caso a arvore ainda nao possua um elemento com a chave a ser inserida, o
algoritmo de busca ira retornar um n terminal. Esse o local ideal para
inserirmos o novo n!
Aps a localizaao do local, basta definir que o n encontrado nao mais
terminal, afinal iremos copiar os dados do novo elemento para ele, e criarmos
dois filhos terminais, um a esquerda e outro a direita.
Algoritmos e Estrutura de Dados !!
8 f 15
Algoritmo insereElemento(k, e)
Entrada: k = chave do elemento a ser inserido
e = elemento a ser inserido
Sada: verdadeiro, se a insero ocorreu, ou falso, c.c.

n = busca(k, raiz da rvore)
se n.terminal = verd.
// no existe: novo n
n.terminal falso
n.chave k
n.elemento e
n.esq novo n terminal
n.dir novo n terminal
retorna verd.
seno
// j existe
retorna falso
Cdigo 1-2 Algoritmo de insero de um novo elemento em uma rvore binria de pesquisa.
O processo de remoao similar. Precisamos inicialmente achar o n com a
chave para em seguida remov-lo. Se o n a ser removido um n folha, ou
seja um n que possui como um dos filhos um n terminal, entao podemos
simplesmente remover o n, substituindo-o por um de seus filhos (caso um dos
filhos nao seja terminal, entao este que sera colocado no seu lugar). A Figura
1-+ exemplifica a descriao.

Figura 1-4 Remoo do elemento de chave 4, que possui um dos filhos no-terminal.
Caso o elemento a ser removido esteja em um n interno (nenhum de seus
filhos sao terminais), precisamos substitui-lo com outro elemento de tal maneira
que nao infrinjamos a propriedade da arvore de pesquisa. Os unicos elementos
que podem substitui-lo facilmente sem infringir a propriedade o maior dos
elementos a esquerda (ou seja, o maior dos menores) ou o menor a direita (ou
seja, o menor dos maiores).
Digamos entao que vamos remover o elemento de chave 6 da arvore da
figura anterior. Como seu n interno, ele nao pode simplesmente colocar um
de seus filhos no lugar, por exemplo o 9, uma vez que o 9 ja tem filho a
esquerda. Faz-se, portanto, necessario que um n folha substitua-o, copiando
sua chave e elemento sobre o n que queremos remover (no fim das contas,
estamos removendo-o nesse momento) e, para nao haver duplicaao de dados,
6
9
2

1

8

5

6
9 2
4


1

8

5

Algoritmos e Estrutura de Dados !!
9 f 15
removemos o n folha que foi copiado, como no caso da Figura 1-+. A Figura 1-5
ilustra o caso.

Figura 1-5 Remoo do elemento de chave 4, que possui um dos filhos no-terminal.
O processo de remoao segue o algoritmo descrito abaixo.
Algoritmo remove(k)
Entrada: k = chave do elemento a ser removido
Sada verdadeiro, se a remoo ocorreu, ou falso, c.c.

n busca(k, raiz da rvore)

se n.terminal = verd.
retorna falso

// verifica se n interno
se n.esq.terminal = falso e n.dir.terminal = falso
// recupera menor chave da sub-rvore direita
f menorChave(n.dir)
// copia chave e elemento de f em n
n.copia(f)
// faz f (n folha) ser o novo n a ser removido
n f

// remove n folha
se n.esq.terminal = falso
n.copia(n.esq)
// remove terminais de n.esq e o faz terminal
removeTerminal(n.esq)
seno se n.dir.terminal = falso
n.copia(n.dir)
removeTerminal(n.dir)
seno
removeTerminal(n)

retorna verd.
Cdigo 1-3 Algoritmo de remoo de elemento em uma rvore binria de pesquisa.
Como falamos anteriormente, as arvores binarias poderiam diminuir a
complexidade dos procedimentos de inserao e remoao, comparados a busca
binaria em um vetor. Porm, se prestarmos bem atenao aos cdigos e a
maneira que a inserao e remoao funcionam, suas complexidades no pior caso
continuam sendo linear!
Para visualizar isto, basta imaginar na Figura 1-6(a) a inserao de um
elemento cuja chave maior que as existentes, ou a remoao do elemento de
6
9
2

1

8

5

5
9
2

1

8

5
Algoritmos e Estrutura de Dados !!
10 f 15
maior chave. Em ambos os casos, teriamos que percorrer todo o conjunto para
realizar a operaao. Ou seja, teriamos uma complexidade de O(n). A
complexidade seria reduzida apenas no melhor caso, quando a arvore esta
estruturada como na Figura 1-6(b), quando passa a ser O(log n) tanto na
inserao quanto na remoao.

Figura 1-6 Melhor e pior caso de uma rvore binria de pesquisa.
Bom, se para o pior caso, uma arvore binaria nao melhora nosso
desempenho inicial, qual entao o interesse delas?
De fato, apesar de terem a mesma complexidade de pior caso que vetores,
arvores binarias possuem, em geral, um desempenho melhor. Ha, entretanto,
uma tipo especial de arvore binaria de pesquisa que garante um custo O(log n)
mesmo no pior caso. Elas sao chamadas rvores balanceadas. !sso porque
elas procuram equilibrar a distribuiao dos elementos na arvore, fazendo com
que nao ocorra situaoes como na Figura 1-6(a).
Existem varias formas de fazer com que esse balanceamento" ocorra. A
primeira que vamos ver sao as arvores AvL.
1.4 rvores AVL
Os algoritmos associados as arvores AvL foram inicialmente definidos por
Adelson, velskii e Landis, por isso seu nome este, dado em homenagem a seus
autores. A arvore AvL uma arvore binaria de busca cujos mecanismos da
inserao e da remoao procuram re-equilibrar" a arvore, evitando um
crescimento desproporcional apenas de um lado, como ilustra o pior caso da
Figura 1-6.
Para ser mais especifico, a arvore AvL adiciona uma propriedade as arvores
binarias de busca, que define o seguinte:
Propriedade de balanceamento:
Uma arvore esta balanceada quando para todo n interno a altura de suas
sub-arvores diferenciam de no maximo uma unidade.
Atravs desta proposiao, temos a seguinte proposiao:
Proposio:
A altura de uma arvore AvL com n elementos O(log n).
















a. pior caso b. melhor caso
Algoritmos e Estrutura de Dados !!
11 f 15
Justificativa:
Para justificar esta proposiao vamos pensar no pior caso: O pior caso
aquele onde para um determinado numero de elementos n, temos uma arvore
com a maior altura possivel. Podemos dizer isso de uma maneira diferente: para
uma arvore de altura h, temos o menor numero minimo de ns.
!sso ocorre quando para cada n da arvore, a altura de suas sub-arvores
diferenciam de uma unidade, como ilustra a Figura 1-7.

Figura 1-7 Exemplo de rvore AVL com altura mxima para um dado nmero de elementos.
Para justificar a proposiao precisamos definir a relaao existente entre n e
h nesse caso especifico. Para generalizarmos uma funao n(h), que dado uma
altura h podemos calcular o numero minimo de ns, devemos comear pelos
casos basicos. Uma arvore de altura 1 tera certamente apenas 1 n. Uma arvore
de altura 2 tera no minimo 2 ns. Para h a 3, a arvore AvL tera no minimo n
raiz, uma sub-arvore de altura h-1 e outra de altura h-2. Em outras palavras:
[funao|
...





1.5 rvores (2,4)

1.6 rvores rubro-negras







Algoritmos e Estrutura de Dados !!
12 f 15
2 Processamento de texto

2.1 Algoritmos para procura de padres

2.2 Busca digital

2.3 Compresso de textos

2.4 Similaridade de textos

Algoritmos e Estrutura de Dados !!
13 f 15
3 Grafos

3.1 Representaes e tipos de Grafos

3.2 Caminhamento em Grafos

3.3 Problemas de conexidade

3.4 Caminhos mnimos

3.5 rvore geradora mnima

3.6 Exerccios

Algoritmos e Estrutura de Dados !!
1+ f 15
4 Algoritmos geomtricos

4.1 Fecho convexo

4.2 Triangulaes

4.3 Diagrama de Voronoi

4.4 Exerccios

Algoritmos e Estrutura de Dados !!
15 f 15
Bibliografia

You might also like