Algoritmos e Estrutura de Dados 2
Apostila de curso
INTRODUÇÃO ... 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 PADRÕES... 12
2.2 BUSCA DIGITAL... 12
2.3 COMPRESSÃO DE TEXTOS... 12
2.4 SIMILARIDADE DE TEXTOS... 12
3 GRAFOS... 13
3.1 REPRESENTAÇÕES 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 TRIANGULAÇÕES... 14
4.3 DIAGRAMA DE VORONOI... 14
4.4 EXERCICIOS... 14
Introdução
!"
# $
%
&
'
(
)
*
+ ,
-$
.
)
,
/
,
-
!" )
"
.
/
!"
)
,
.
/
.
.)
*
0
$
,
) (
$
$
,
!
$
,
)
$
$
12
$
34
$
3
)
*
0
5
) (
/
/
5
5
5
) (
/
0
!"
.
'
6
"
$.
7
8
9
!"
:
5
)
*
0
.
) (
!"
,
;
!"
)
.
0
!"
$
0
)
* <
0
'
)
!+
0
)
!"
%
$ 5
$
!"
!"
=
1
)
0
!"
$
5
0
5 !" )
.
5
0
-
!"
,
/
4
1 Árvores de pesquisa
1.1 Busca binária
?
,
$ ;
-
/
,
/
<
) ?
,
$ ;
/
/
)
$ ;
$
5
. 6
8 *6 8
.
<
)
,
6
8
0
6
!
8
.
)
.
@
A
B
,
@
A
)
.
/
) 9
$
/
,
$.
/
$
5
5
CC
)
$.
6C8
.
<
6 CC8 $ ;
.
6 C8
$
<
.
,
$
,
0
)
?
$
/
<
0
C
!
$
C
C)
$
. ,
<
-"
5
$
)
$
%
3 )
Figura 1-1 – Representação de uma busca binária.
* 5
%
3
DE
!"
$
) *
!
,
.
6 C8
$
3
,
.
,
CE
!"
CF
"
/
6 "
G8)
.
/
-C
C
-
C
)
/
!"
50
25
37
31
28
0$
.
-
,
5
.
DF)
9
!"
$
,
,
$
)
/.
B
?
$.
$
$
/
) H
,
/
)
$.
$
$
,
)
$
.
!"
)
1.2 Árvores de pesquisa
!"
"
$
$
)
!"
!+
6
8
$
)
$
!" .
!"
!"
-
) 9
-!"
,
,
/
-
) I
G J
/
$
!"
) 9 .
$
-
$
5
) K
!+
$
B
*
*6 8
!" ,
!"
" .
B
9
.
0
,
>
,
L
$
5
,
6
!" 8
6
!" 8)
9
/
:
,
$
) 9
$
L
,
> "
,
6
>8
L
"
)
$
.
)
#
$
,
.
$
)
$
$
--
@ ,M;
A
)
>
$
$
$
/
,
-
$
-
,
L
,
,
-
$
-
N
Figura 1-2 – Exemplo de árvore de pesquisa. Os valores contidos nos nós representam as chaves dos elementos.
$
,
O
? -
$
P
;
$
,
,
$ 6 8 Q
$ 6
$
8 Q
$ 6
P
8)
"
L
,
$
P
L
)
,
,
$
,
"
.
$
) 9
5
$
,
$
>
%
3 ) *
$
,
.
)
Figura 1-3 – Exemplo de árvore de pesquisa que não é uma árvore binária.
$
%
3
.
$
6 348 ,
$
)
9 .
$
,
/
.
$
)
1.3 Árvores binárias de pesquisa
R $
,
!"
,
>
5
6
3 $
8
L
,
L
%
3 ) 9
,
-
O
6
9
2
4
1
8
4
N D
S
Estrutura Nó:
pai: referência (ponteiro) para o nó-pai do nó corrente; esq: referência para seu filho à esquerda;
dir: referência para seu filho à direita;
terminal: bandeira indicando se o nó é terminal ou não; chave: chave do nó
elemento: elemento do nó
1
!+
/
!+
!"
!"
)
$
/
>
3 O
Algoritmo busca (k, r)
Entrada: k = chave a ser procurada r = raiz da árvore de pesquisa Saída: 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)
senão se k > r.chave
// busca na sub-árvore da direita retorna busca(k, r.dir)
senão
// achou retorna r
Código 1-1 – Algoritmo de busca em uma árvore de pesquisa binária.
$
>
$
.
,
!"
$
$
) 9
"
!"
,
$
-
L
,
$
L
,
,
>
$
) *
>
3
-
/
$
)
$
"
$
>
)
.
$
>G
>
/ !"
,
>
" .
$
D
Algoritmo insereElemento(k, e)
Entrada: k = chave do elemento a ser inserido e = elemento a ser inserido
Saída: verdadeiro, se a inserção ocorreu, ou falso, c.c.
n = busca(k, raiz da árvore) se n.terminal = verd.
// não existe: novo nó n.terminal falso n.chave k
n.elemento e
n.esq novo nó terminal n.dir novo nó terminal retorna verd.
senão
// já existe retorna falso
Código 1-2 – Algoritmo de inserção de um novo elemento em uma árvore binária de pesquisa.
*
!" .
) 9
>
$
$;3 ) ?
>
$
.
>
-
> ,
>
"
$
>
3
6
"
-
"
,
8)
%
34 5
!" )
Figura 1-4 – Remoção do elemento de chave 4, que possui um dos filhos não-terminal.
$
-
>
6
"
8
03
,
"
-
$
,
) * <
,
03
.
L
,
6
-
8
L
6
-
8)
" ,
$
$
$ N
$
)
> .
"
5
T
$ / ,
T
-,
) % /3
,
>
3
$
> ,
,
$
6
$
3
8
"
$
!"
6
9 2
1 5 8
6
9 2
4
1 8
T
$
>
,
%
34)
%
3
)
Figura 1-5 – Remoção do elemento de chave 4, que possui um dos filhos não-terminal.
*
!"
5 )
Algoritmo remove(k)
Entrada: k = chave do elemento a ser removido
Saída verdadeiro, se a remoção 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) senão se n.dir.terminal = falso
n.copia(n.dir)
removeTerminal(n.dir) senão
removeTerminal(n)
retorna verd.
Código 1-3 – Algoritmo de remoção de elemento em uma árvore binária de pesquisa.
$
5
!"
!"
L
$
) 9 .
!"
>
,
!"
!"
5
G
9
$
/
%
3N6 8
!"
-
$ .
,
5
!"
6
9 2
1 5 8
5
9 2
C
$ )
0
,
-/
!" ) *
-
0
5
*6 8)
5
/
,
$
%
3N6 8 ,
*6
8
!" ,
!" )
Figura 1-6 – Melhor e pior caso de uma árvore binária de pesquisa.
H
$
"
,
"
B
5
,
$
$
) 7
$
,
,
*6
8
)
"
)
,
,
!"
$
/
,
"
!+
%
3N6 8)
5
$
/
,
@
A
)
,
$
$
"
$
12)
1.4 Árvores AVL
*
L
$
12
1
U
2
.
)
$
12 .
$
-!"
!"
@ 3 ,
A
$
$
%
3N)
9
0
$
12
L
$
,
O
#
$
,
>
3 $
5
)
$.
!"
!" O
$
12
. *6
8)
9
-
!" $
O *
.
,
<
$
0$ ) 9
/
O
$
<
0
> )
,
>
$
3 $
%
3S)
Figura 1-7 – Exemplo de árvore AVL com altura máxima para um dado número de elementos.
9
-
!"
!"
5
0
) 9
/
!"
6 8 ,
<
0
>
$
!
) #
$
>) #
$
0
> ) 9
V
$
12
0
>
/
3 $
3
3 )
$
O
W
!" X
)))
1.5 Árvores (2,4)
2 Processamento de texto
2.1 Algoritmos para procura de padrões
2.2 Busca digital
2.3 Compressão de textos
3 Grafos
3.1 Representações e tipos de Grafos
3.2 Caminhamento em Grafos
3.3 Problemas de conexidade
3.4 Caminhos mínimos
3.5 Árvore geradora mínima
4