You are on page 1of 89

Estruturas de Dados

e
Tecnicas de Programacao
Tomasz Kowaltowski
Instituto de Computacao
Universidade Estadual de Campinas
www.ic.unicamp.br/tomasz
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao 1
Copyright c _ 2010-2011 Tomasz Kowaltowski
Instituto de Computa cao
Universidade Estadual de Campinas
Algumas transparencias foram adaptadas da apostila Estruturas de Dados
e Tecnicas de Programacao de autoria de Claudio L. Lucchesi e Tomasz
Kowaltowski.
Estas transparencias somente podem ser copiadas para uso pessoal dos
docentes e alunos das disciplinas oferecidas pelo Instituto de Computacao
da UNICAMP.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao 2
Introdu cao
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 3
Pre-requisito e objetivos

Pre-requisito: curso basico de programa cao em C

Objetivos:

Programa cao em (relativamente) baixo nvel

Tecnicas de programa cao e estruturacao de dados

Preparacao para:

Analise de algoritmos

Programa cao de sistemas

Programa cao em geral

Bancos de dados

Engenharia de software

. . .
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 4
Programa

Introdu cao `a analise de algoritmos

Estruturacao elementar de dados: matrizes, registros, apontadores

Estruturas lineares: pilhas, las, las duplas

Recursao e retrocesso


Arvores binarias: representacao, percursos


Arvores gerais: representacao, percursos

Aplicacao de arvores:
arvores de busca (AVL), las de prioridade,
arvores B, arvores rubro-negras, arvores digitais

Listas generalizadas

Espalhamento

Processamento de cadeias de caracteres

Gerenciamento de memoria

Algoritmos de ordenacao

Algoritmos em grafos

Tipos abstratos de dados e orienta cao a objetos


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 5
Bibliograa
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliograa 6
A. V. Aho, J. E. Hopcroft, and J. Ullman.
Data Structures and Algorithms.
Addison-Wesley, 1983.
A. Drozdek.
Estrutura de Dados e Algoritmos em C++.
Thomson, 2002.
J. L. Szwarcter e L. Markenzon.
Estruturas de Dados e seus Algoritmos.
LTC Editora, 1994.
C. L. Lucchesi e T. Kowaltowski.
Estruturas de Dados e Tecnicas de Programacao.
Instituto de Computa cao UNICAMP, 2003.
P. Feolo.
Algoritmos em Linguagem C.
Elsevier Editora Ltda., 2009.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliograa 7
G. H. Gonnet.
Handbook of Algorithms and Data Structures.
Addison-Wesley, 1984.
E. Horowitz and S. Sahni.
Fundamentals of Data Structures in Pascal.
Computer Science Press, 1984.
D. E. Knuth.
The Art of Computer Programming, volume I: Fundamental
Algorithms.
Addison-Wesley, 1978.
E. M. Reingold and W. J. Hanson.
Data Structures.
Little Brown and Company, 1983.
R. Sedgewick.
Algorithms in C.
Addison-Wesley, 1990.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliograa 8
D. F. Stubbs and N. W. Webre.
Data Structures with Abstract Data Types and Pascal.
Brooks/Cole, 1985.
A. M. Tenenbaum, Y. Langsam, and M. J. Augenstein.
Data Structures using C.
Prentice-Hall, 1990.
N. Wirth.
Algorithms + Data Structures = Programs.
Prentice-Hall, 1976.
N. Ziviani.
Projeto de Algoritmos (2a. ed.)
Thomson, 2004.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliograa 9
No coes de Analise de Algoritmos
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 10
Escolha da estrutura
Importancia da escolha de estrutura de dados busca do k-esimo
elemento numa seq uencia:
. . .
x = a [ k ] ;
. . .
. . .
p = a ; i = 0;
whi l e ( i <k ) {
p = p>pr ox ;
i ++;
}
x = p>i n f o ;
. . .
(a) (b)
(a) N umero de operacoes constante (vetor).
(b) N umero de operacoes proporcional a k (lista ligada).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 11
Exemplo de analise de trechos de programas
. . .
x = a+b ;
. . .
. . .
f or ( i =0; i <n ; i ++)
x = a+b ;
. . .
. . .
f or ( i =0; i <n ; i ++)
f or ( j =0; j <n ; j ++)
x = a+b ;
. . .
(a) (b) (c)
a b c
analise simples (1) 1 n n
2
analise detalhada (2) 2 5n + 2 5n
2
+ 5n + 2
(1): atribuicoes (2): atribuicoes, opera coes aritmeticas e compara coes
As duas analises produzem resultados proporcionais para valores crescentes
de n.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 12
Notacao O()
Denicao:
f(n) = O(g(n)) se existem n
0
e k com f(n) k g(n) para todo n > n
0
.
Exemplos:
c = O(1) para qualquer constante c
2 = O(1)
5n + 2 = O(n)
5n
2
+ 5n + 2 = O(n
2
)
n
2
= O(n
3
)
n
k
= O(n
k+1
), k 0
log
a
n = O(log
b
n), a, b > 0
log
2
n = O(log
10
n)
Outras notacoes importantes: (), (), etc.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 13
Exemplo de analise de um procedimento de ordenacao
voi d Ordena ( i nt v [ ] , i nt n) {
i nt i , k , m, t ;
f or ( i =0; i <n1; i ++) {
m = i ;
f or ( k=i +1; k<n ; k++)
i f ( v [ k]<v [m] ) m = k ;
t = v [ i ] ; v [ i ] = v [m] ; v [m] = t ;
}
} / Ordena /
O n umero de comparacoes de elementos de v, para cada valor de i, e
n i 1. O n umero total de comparacoes sera:
n2

i=0
(n i 1) =
n
2
2
+
n
2
ou seja, o n umero de compara coes e da ordem de O(n
2
).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 14
Crescimento de algumas func oes
n log
2
n nlog
2
n n
2
n
3
2
n
1 0 0 1 1 2
2 1 2 4 8 4
4 2 8 16 64 16
8 3 24 64 512 256
16 4 64 256 4.096 65.536
32 5 160 1.024 32.768 4.294.967.296
64 6 384 4.096 262.144 1810
18
128 7 896 16.384 2.097.152 3410
37
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 15
Exemplo
Suponha duas maquinas M
1
e M
2
, sendo a primeira cem vezes mais
rapida do que a segunda. Ambas as maquinas executam um algoritmo de
busca num vetor ordenado de comprimento n. A maquina M
1
executa o
algoritmo de busca sequencial (pior caso: n opera coes); a maquina M
2
executa o algoritmo de busca binaria (pior caso: log
2
n opera coes).
A seguinte tabela poderia ser obtida atraves de medidas experimentais de
tempo de execu cao para vetores de diversos tamanhos, usando alguma
unidade de tempo conveniente.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 16
Exemplo (cont.)
n M1 (rapida) M2 (lenta)
16 16 400
32 32 500
64 64 600
128 128 700
256 256 800
512 512 900
1024 1024 1000
2048 2048 1100
. . . . . . . . .
2
20
1.048.576 2000
2
21
2.097.152 2100
. . . . . . . . .
2
30
1.073.741.824 3000
Supondo que a unidade seja 1s (microssegundo), 2.097.152s corresponde a 17
minutos e 1.073.741.824s equivale a cerca de 12 horas.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Noc oes de Analise de Algoritmos 17
Execu cao de programas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execu cao de programas 18
Exemplo de func oes simples
voi d g ( i nt x , i nt y ) {
y = x ;
} / g /
voi d f ( i nt z ) {
i nt y ; char b ;
y = 235;
g ( y , z ) ;
} / f /
i nt mai n ( ) {
i nt i ; char c ;
char v [ 5 ] ;
f (&i ) ;
r et ur n 0;
} / mai n /
Pilha de execu cao (supoe inteiros de dois bytes):
i c v
main
z y
b
f
235
x y
235
g
235
Obs.: Na realidade, os inteiros sao armazenados sob a forma binaria.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execu cao de programas 19
Exemplo de func oes com alocacao dinamica
typedef char Cadei a [ 5 ] ;
typedef Cadei a ApCadei a ;
typedef s t r uc t {
Cadei a nome ;
i nt i dade ;
} Reg , ApReg ;
ApCadei a apc ;
ApReg apr ;
i nt api ;
voi d Al oca ( ApCadei a c , ApReg r ) {
api = mal l oc ( s i z e of ( i nt ) ) ;
api = 10;
c = mal l oc ( s i z e of ( Cadei a ) ) ;
r = mal l oc ( s i z e of ( Reg ) ) ;
} / Al oca /
i nt mai n ( ) {
Al oca(&apc ,&apr ) ; f r e e ( apc ) ;
f r e e ( apr ) ; f r e e ( api ) ;
r et ur n 0;
} / mai n /
memoria dinamica
pilha de execu cao
apc apr api
global main
c r
Aloca
10 10
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execu cao de programas 20
Exemplo de funcao recursiva
i nt mai n ( ) {
i nt m;
m = f a t ( 4 ) ;
r et ur n 0;
} / mai n /
i nt f a t ( i nt n) {
i f ( n==0)
r et ur n 1;
el s e
r et ur n n f a t ( n1);
} / f a t /
m res n
4
res n
3
res n
2
res n
1
res n
0 1 1 2 6 24 24
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execu cao de programas 21
Estruturas ligadas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 22
Listas ligadas simples
p
. . .
Declaracoes (equivalentes):
typedef
s t r uc t Re gLi s t a L i s t a ;
typedef
s t r uc t Re gLi s t a {
T i n f o ;
L i s t a pr ox ;
} Re gLi s t a ;
typedef
s t r uc t Re gLi s t a {
T i n f o ;
s t r uc t Re gLi s t a pr ox ;
} RegLi s t a , L i s t a ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 23
Insercao e remocao com passagem por valor
. . . x . . .
p q
voi d I n s e r e ( L i s t a p , T x ) {
L i s t a q =
mal l oc ( s i z e of ( Re gLi s t a ) ) ;
q>i n f o = x ;
q>pr ox = p>pr ox ;
p>pr ox = q ;
}
voi d Remove ( L i s t a p , T x ) {
L i s t a q = p>pr ox ;
x = q>i n f o ;
p>pr ox = q>pr ox ;
f r e e ( q ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 24
Insercao e remocao com passagem por valor (cont.)
. . . x . . .
p q

O argumento p e o apontador para o predecessor do no a ser inserido


ou removido.

A funcao Remove nao pode remover um no que e o unico da lista.

A funcao Insere nao pode inserir um no no incio da lista, inclusive


se ela for vazia.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 25
Insercao e remocao com passagem por referencia
. . . x . . .
p q
voi d I n s e r e ( L i s t a p , T x ) {
L i s t a q =
mal l oc ( s i z e of ( Re gLi s t a ) ) ;
q>i n f o = x ;
q>pr ox = p ;
p = q ;
}
voi d Remove ( L i s t a p , T x ) {
L i s t a q = p ;
x = q>i n f o ;
p = q>pr ox ;
f r e e ( q ) ;
}
Esta convencao elimina os problemas da passagem por valor. Note-se que
as variaveis p e q tem tipos diferentes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 26
Lista simples com no cabeca
p
. . .
Lista vazia:
p
Esta convencao permite o uso de passagem por valor nas fun coes basicas.
O campo de informacao do no cabeca pode ser aproveitado para guardar
alguma informacao adicional (por exemplo, o comprimento da lista).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 27
Lista simples circular
p
. . .
Problema: lista vazia?
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 28
Lista circular com n o cabeca
p
. . .
Lista vazia:
p
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 29
Busca em lista circular com n o cabeca sentinelas
L i s t a Bus c a Ci r c ul a r (
L i s t a p , T x ) {
/ Busca sem s e n t i n e l a /
L i s t a q = p ;
do {
q = q>pr ox ;
} whi l e ( ( q!=p) &&
( q>i n f o !=x ) ) ;
i f ( q==p)
r et ur n NULL;
el s e
r et ur n q ;
}
L i s t a Bus c a Ci r c ul a r (
L i s t a p , T x ) {
/ Busca com s e n t i n e l a /
L i s t a q = p ;
q>i n f o = x ;
do {
q = q>pr ox ;
} whi l e ( q>i n f o !=x ) ;
i f ( q==p)
r et ur n NULL;
el s e
r et ur n q ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 30
Lista duplamente ligada com n o cabeca
p
. . .
Lista vazia:
p


E possvel percorrer os elementos nas duas direcoes, a partir de
qualquer lugar da lista.


E possvel remover o elemento apontado.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 31
Operac oes sobre listas duplamente ligadas
typedef
s t r uc t RegLi s t aDupl a {
T i n f o ;
s t r uc t RegLi s t aDupl a esq , d i r ;
} RegLi s t aDupl a , Li s t aDupl a ;
voi d I ns e r e Dupl aEs q (
Li s t aDupl a p , T x ) {
Li s t aDupl a q =
mal l oc ( s i z e of ( RegLi s t aDupl a ) ) ;
q>i n f o = x ;
q>es q = p>es q ;
q>d i r = p ;
p>esq>d i r = q ;
p>es q = q ;
}
voi d RemoveDupla (
Li s t aDupl a p , T x ) {
p>esq>d i r = p>d i r ;
p>di r >es q = p>es q ;
x = p>i n f o ;
f r e e ( p ) ;
}
A funcao RemoveDupla supoe que ha pelo menos um elemento na lista.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 32
Exemplo: operacoes com polinomios
Seja um polinomio de grau n:
P(x) = a
n
x
n
+a
n1
x
n1
+. . . +a
1
x
1
+a
0
x
0
onde a
n
,= 0, exceto possivelmente no caso n = 0.
Representacao ligada omite os termos nao nulos. Por exemplo, os
polinomios:
P
1
(x) = 5x
20
3x
5
+ 7 e P
2
(x) = 0:
podem ser representados por:
-1 p1 5 20 -3 5 7 0
-1 p2
Por conven cao, o expoente do no cabeca e -1.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 33
Exemplo de funcao: impressao
typedef s t r uc t AuxPol {
i nt expo ;
f l o a t c oe f ;
s t r uc t AuxPol pr ox ;
} Termo , Pol i nomi o ;
voi d I mpr i mePol i nomi o ( Pol i nomi o p) {
i f ( p>pr ox==p) {
p r i n t f ( Pol i n omi o nul o \n ) ;
r et ur n ;
}
p = p>pr ox ;
whi l e ( p>expo!=1) {
p r i n t f ( (%2d , %5. 1 f ) ,
p>expo , p>c oe f ) ;
p = p>pr ox ;
}
p r i n t f ( \n ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 34
Soma de polin omios: paradigma de intercalacao
-1 p
pp0
. . .
pp
-1 q
qq0
. . .
qq
-1 r
rr0
. . .
rr
As variaveis pp e qq representam os termos correntes dos polinomios
dentro da malha de repeti cao e a variavel rr aponta para o ultimo termo ja
calculado da soma; pp0, qq0 e rr0 sao os valores iniciais das variaveis pp,
qq e rr.
A implementacao das operacoes e um exerccio. Note-se que o produto de
dois polinomios pode ser calculado como uma sequencia de somas de
produtos de um polinomio por um termo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 35
Matrizes esparsas
Exemplo:

50 0 0 0
10 0 20 0
0 0 0 0
30 0 60 5

Dada uma matriz n n, quando o n umero de elementos nao nulos e uma


percentagem pequena de n
2
(nao e o caso do exemplo!), pode ser
conveniente representar a matriz por meio de uma estrutura de listas
ortogonais.
Suporemos, neste exemplo, que as linhas e as colunas sao numeradas a
partir de 1.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 36
Matrizes esparsas: listas ortogonais
50 0 0 0
10 0 20 0
0 0 0 0
30 0 60 5
4 -1
3 -1
2 -1
1 -1
-1 -1 -1 1 -1 2 -1 3 -1 4
1 1
50
2 1
10
2 3
20
4 1
-30
4 3
-60
4 4
5
O acesso `a matriz e feito a partir do no cabeca das listas das cabe cas das
linhas e das colunas (super-cabe ca!).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 37
Operac oes sobre matrizes esparsas
Alguns exemplos:
typedef
s t r uc t RegEspar sa {
i nt l i nha , col una ;
doubl e v a l o r ;
s t r uc t RegEspar sa d i r e i t a , abai xo ;
} RegEsparsa , Mat r i z ;
voi d I n i c i a l i z a Ma t r i z ( Mat r i z a , i nt m, i nt n ) ;
voi d Li be r a Ma t r i z ( Mat r i z a ) ;
doubl e El ement oMat r i z ( Mat r i z a , i nt i , i nt j ) ;
voi d At r i b u i Ma t r i z ( Mat r i z a , i nt i , i nt j , doubl e x ) ;
voi d SomaMatri zes ( Mat r i z a , Mat r i z b , Mat r i z c ) ;
voi d Mu l t i p l i c a Ma t r i z e s ( Mat r i z a , Mat r i z b , Mat r i z c ) ;

E importante notar os casos em que a passagem do argumento do tipo


Matriz e feita por referencia. (Nas duas ultimas operacoes, a variavel c
recebe o resultado.)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 38
Estruturas lineares
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 39
Estruturas lineares em geral: operac oes tpicas

selecionar e modicar o k-esimo elemento;

inserir um novo elemento entre as posicoes k e k + 1;

remover o k-esimo elemento;

concatenar duas sequencias;

desdobrar uma sequencia;

copiar uma sequencia;

determinar o tamanho de uma sequencia;

buscar um elemento que satisfaz uma propriedade;

ordenar uma sequencia;

aplicar um procedimento a todos os elementos de uma sequencia;

. . .
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 40
Estruturas lineares particulares

Pilha (stack): inser cao e remocao na mesma extremidade da estrutura

Fila (queue): insercao numa extremidade (m) e remo cao na outra


extremidade (incio)

Fila dupla (double ended queue): insercao e remo cao em ambas


extremidades da estrutura
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 41
Pilha: implementacao sequencial
. . . . . .
0
topo
empilha (insere)
desempilha (remove)
Pilha vazia:
. . .
0
topo
(-1)
Inicialmente: topo=-1.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 42
Pilha: implementacao sequencial (cont.)
. . . . . .
0
topo
empilha (insere)
desempilha (remove)
typedef
s t r uc t {
i nt topo ;
T el ement os [TAM MAX] ;
} Pi l ha ;
voi d Empi l ha ( Pi l ha p , T x ) {
i f ( ( p ) . topo==(TAM MAX1))
Tr at aEr r o ( Pi l ha c he i a ) ;
(p ) . topo++;
( ( p ) . el ement os ) [ ( p ) . topo ] = x ;
}
Exerccio: a fun cao Desempilha.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 43
Pilha: implementacao ligada
topo
. . .
Pilha vazia:
topo
(Uma lista ligada simples.)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 44
Pilha: implementacao ligada (cont.)
topo
. . .
typedef s t r uc t El emPi l ha {
T i n f o ;
s t r uc t El emPi l ha pr ox ;
} El emPi l ha , Pi l ha ;
voi d Empi l ha ( Pi l ha p , T x ) {
Pi l ha q =
mal l oc ( s i z e of ( El emPi l ha ) ) ;
i f ( q==NULL)
Tr at aEr r o ( Fa l t a mem ori a ) ;
q>i n f o = x ;
qProx = p ;
p = q ;
}
Exerccio: a fun cao Desempilha.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 45
Fila: implementacao sequencial
. . . . . . . . .
frente m
remove insere
Convencao: frente precede o primeiro elemento da la; consequentemente,
o tamanho da la e dado por mfrente.
Fila vazia:
. . . . . .
frente
m
Condicao de la vazia: frente == m.
Inicialmente: frente = m = 1.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 46
Fila: implementacao ligada circular
la
frente
. . .
m
Fila vazia:
la
frente
m
A la pode ser representada por uma unica variavel (la) ou um par de
variaveis (frente e m).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 47
Fila: implementacao sequencial circular
n-1 0
1
2
3
.
.
. frente
.
.
.
m
.
.
.
Convencao: frente precede o primeiro elemento da la; consequentemente,
o tamanho da la e dado por (mfrente + n)%n.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 48
Fila: implementacao sequencial circular (cont.)
n-1 0
1
2
3
.
.
. frente
.
.
.
m
.
.
.
Condicoes:

Inicial: frente == m == 0 (ou qualquer outro valor)

Fila vazia: frente == m

Fila cheia: frente == m (a mesma condi cao!)

Solucao 1: sacricar uma posicao do vetor; a condicao de la cheia


ca: frente == (m + 1)%n.

Solucao 2: uma variavel adicional inteira com o tamanho da la ou


booleana indicando se a la esta vazia.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 49
Fila: implementacao sequencial circular (cont.)
n-1 0
1
2
3
.
.
. frente
.
.
.
m
.
.
.
#def i ne TAM MAX FILA 1000
typedef s t r uc t {
i nt f r e nt e , f i m ;
T el ement os [ TAM MAX FILA ] ;
} F i l a ;
voi d I n s e r e F i l a ( F i l a f , T x ) {
i f ( ( f ) . f r e n t e ==((( f ) . f i m+1)%TAM MAX FILA) )
Tr at aEr r o ( F i l a c he i a ) ;
( f ) . f i m = ( ( f ) . f i m+1)%TAM MAX FILA;
( f ) . el ement os [ ( f ) . f i m ] = x ;
}
Exerccio: a fun cao RemoveFila.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 50
Aplica coes de pilhas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 51
Aplicac oes de pilhas

Processamento de linguagens parenteticas:

linguagens de programa cao

XML

Implementacao da recursao

Percurso de estruturas hierarquicas (arvores)

Avaliacao expressoes em notacao pos-xa (notacao polonesa reversa)

Transforma cao entre notacoes


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 52
Exemplo de aplicacao simples: balanceamento de parenteses
Correto Incorreto
(
() )
[()] [)
[]()[()[]] ()()[
((([[[]]]))) )(
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 53
Balanceamento de parenteses (cont.)
Pilha Resto da sequencia
Vazia ([([][()])])
( [([][()])])
([ ([][()])])
([( [][()])])
([([ ][()])])
([( [()])])
([([ ()])])
([([( )])])
([([ ])])
([( )])
([ ])
( )
Vazia
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 54
Notac oes para express oes aritmeticas

Inxa:

um operador unario precede o operando

um operador binario separa os dois operandos

parenteses indicam prioridades

Pos-xa: os operadores seguem os operandos

Pre-xa: os operadores precedem os operandos


Exemplos:
inxa pos-xa pre-xa
a a a
a +b ab+ +ab
a +b c abc + +a bc
(a +b) c ab +c +abc
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 55
Exemplo: avaliacao de expressoes sob forma pos-xa
Notacao inxa: (3 + 5) 2 (10 3)/2
Notacao pos-xa: 3 5 + 2 10 3 2/
Estados consecutivos da pilha:
Pilha Entrada
Vazia 3 5 + 2 10 3 2/
3 5 + 2 10 3 2/
3 5 +2 10 3 2/
8 2 10 3 2/
8 2 10 3 2/
16 10 3 2/
16 10 3 2/
16 10 3 2/
16 7 2/
16 7 2 /
16 3
13 Vazia
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 56
Exemplo: transformacao de notacao inxa para pos-xa
a b +c d
e
/f g h
Entrada inxa: a b+c d

e /
f
g h
Sada pos-xa:
a b c d e

f
/+g h

As varaveis sao copiadas diretamente para a sada.

Os operadores precisam ser lembrados numa pilha.

Um operador e copiado da pilha para a sada somente quando aparece


na entrada um operador de prioridade menor ou igual.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 57
Transformacao de notacao inxa para p os-xa (cont.)
Sada Pilha Entrada
a b +c d e/f g h
a b +c d e/f g h
a b +c d e/f g h
ab +c d e/f g h
ab +c d e/f g h
ab + c d e/f g h
ab c + d e/f g h
ab c + d e/f g h
ab cd + e/f g h
ab cd + e/f g h
ab cde + /f g h
ab cde + /f g h
(continua)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 58
Transformacao de notacao inxa para p os-xa (cont.)
Sada Pilha Entrada
ab cde + /f g h
ab cde +/ f g h
ab cde f +/ g h
ab cde f/ + g h
ab cde f/+ g h
ab cde f/+ g h
ab cde f/ +g h
ab cde f/ +g h
ab cde f/ +gh
ab cde f/ +gh
ab cde f/ +gh
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 59
Exemplos de recursao
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 60
Exemplo 1: fun cao fatorial
i nt f a t o r i a l ( i nt n) {
i f ( n==0)
r et ur n 1;
el s e
r et ur n n f a t o r i a l ( n1);
}
i nt f a t o r i a l ( i nt n) {
i nt i , f =1;
f or ( i =1; i <=n ; i ++)
f = f i ;
r et ur n f ;
}
Eciencia: ambos O(n) (n multiplicacoes).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 61
Exemplo 2: n umeros de Fibonacci
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
i nt f i b o ( i nt n) {
i f ( n<=1)
r et ur n n ;
el s e
r et ur n f i b o ( n1)+f i b o ( n2);
}
i nt f i b o ( i nt n) {
i nt f 1 =0, f 2 =1, f 3 , i ;
f or ( i =1; i <=n ; i ++) {
f 3 = f 1+f 2 ;
f 1 = f 2 ;
f 2 = f 3 ;
}
r et ur n f 1 ;
}
Eciencia:
O(1.6
n
) O(n)
n = 100: 10
20
somas 100 somas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 62
Exemplo 3: Torres de Hanoi
A
. .
. .
. .
N
B C
(origem) (destino) (auxiliar)
Objetivo: transferir os N discos da torre A para a torre B, usando a torre C
como auxiliar.
Regras:

um disco de cada vez

disco de diametro maior nao pode car em cima de um disco de


diametro menor
Solucao recursiva: fun cao Hanoi(org,dest,aux,n).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 63
Torres de Hanoi: transferencia recursiva de N-1 discos
X
. .
. .
. .
N
Y Z
Hanoi(X,Z,Y,N-1)
X Y Z
. .
. .
. .
N-1
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 64
Torres de Hanoi: movimento do maior disco
X Y Z
. .
. .
. .
N-1
Move X para Y
X Y Z
. .
. .
. .
N-1
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 65
Torres de Hanoi: transferencia recursiva nal de N-1 discos
X Y Z
. .
. .
. .
N-1
Hanoi(Z,Y,X,N-1)
X Y
. .
. .
. .
N
Z
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 66
Torres de Hanoi: funcao Hanoi
voi d Hanoi ( char org , char des t , char aux , i nt n) {
i f ( n>0) {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}

Chamada inicial: Hanoi(A,B,C,64).

N umero de movimentos: 2
N
1 (prova por indu cao).

Este e o n umero mnimo.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 67
Torres de Hanoi: exemplos de sada
N=1: N=3:
Mova de A par a B Mova de A par a B
Mova de A par a C
Mova de B par a C
N=2: Mova de A par a B
Mova de C par a A
Mova de A par a C Mova de C par a B
Mova de A par a B Mova de A par a B
Mova de C par a B
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 68
Torres de Hanoi: exemplos de sada (cont.)
N=4
Mova de A par a C Mova de C par a B
Mova de A par a B Mova de C par a A
Mova de C par a B Mova de B par a A
Mova de A par a C Mova de C par a B
Mova de B par a A Mova de A par a C
Mova de B par a C Mova de A par a B
Mova de A par a C Mova de C par a B
Mova de A par a B
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 69
Exemplo 4: geracao de permuta coes
Problema: Gerar todas as permuta coes dos m elementos de um vetor.
. . .
0 k-1 k m-1
. . .

Suponha uma funcao Permuta(k,m) que gera (imprime) todas as


permuta coes dos elementos de 0 a k-1, seguidas dos elementos de k a
m-1.

A chamada inicial Permuta(m,m) resolveria o problema.

A solucao consistira em trocar o elemento de ndice k-1


consecutivamente com todos os elementos que o precedem e aplicar a
funcao recursivamente.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 70
Geracao das permutac oes (cont.)
Passo recursivo: i=k-1, ..., 0
. . .
0 k-1 k m-1
. . . . . .
i
Troca(i,k-1)
. . .
0 k-1 k m-1
. . . . . .
i
. . .
0 k-1 k m-1
. . . . . .
i
Permuta(k-1,m)
Troca(i,k-1)
. . .
0 k-1 k m-1
. . . . . .
i
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 71
Geracao das permutac oes (cont.)
. . .
0 k-1 k m-1
. . .
Funcao Permuta:
voi d Permuta ( i nt k , i nt m) {
i f ( k==0)
I mpri me (m) ;
el s e {
i nt i ;
f or ( i =k1; i >=0; i ) {
Troca ( i , k 1);
Permuta ( k1,m) ;
Troca ( i , k 1);
}
}
}

A funcao Imprime imprime os m elementos do vetor.

Chamada inicial: Permuta(m,m).


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 72
Geracao das permutac oes (cont.)
Sada de Permuta(2,3)
1 2 3
2 1 3
1 3 2
3 1 2
3 2 1
2 3 1
Desao: imprimir em ordem lexicograca:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 73
Exemplos de retrocesso
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 74
Exemplo 1: movimentos do cavalo
Movimentos possveis do cavalo no jogo de xadrez:
-2
-2
-1
-1
0
0
1
1
2
2
0
1 2
3
4
5 6
7
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 75
Movimentos do cavalo (cont.)
Um percurso da posi cao (0,0) ate (4,4) (existem 27.419 solucoes).
0
0
1
1
2
2
3
3
4
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 76
Movimentos do cavalo (cont.)
Um percurso da posi cao (0,0) ate (4,4) cobrindo todas as posicoes:
0
0
1
1
2
2
3
3
4
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Obs.: Nao existe solu cao para o tabuleiro da transparencia anterior
(provar!).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 77
Movimentos do cavalo (cont.)
Tipos de solucao:
1. Achar uma solu cao
2. Achar uma solu cao que cobre todas as posi coes livres
3. Enumerar todas as solu coes
Observa cao: Esta nao e a melhor maneira de resolver este problema mas
ilustra bem o mecanismo geral de retrocesso.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 78
Movimentos do cavalo (cont.)
-2
-2
-1
-1
0
0
1
1
2
2
0
1 2
3
4
5 6
7
#def i ne TAM MAX 20
#def i ne NUMMOV 8
typedef enum { f a l s e , t r ue } Bool ean ;
i nt t ab [TAM MAX] [ TAM MAX] ;
i nt dl [NUMMOV] = { 1, 2, 2, 1, 1 , 2 , 2 , 1 };
i nt dc [NUMMOV] = { 2 , 1 , 1, 2, 2, 1, 1 , 2 };
voi d Impri meTab ( i nt tam) {
i nt i , j ;
f or ( i =0; i <tam ; i ++) {
f or ( j =0; j <tam ; j ++)
p r i n t f ( %5d , t ab [ i ] [ j ] ) ;
p r i n t f ( \n ) ;
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 79
Movimentos do cavalo: achar uma solucao
Bool ean TentaMovi mento ( i nt tam , i nt num, i nt l i n ,
i nt col , i nt l d , i nt cd ) {
i nt k , l p , cp ;
Bool ean r e s = f a l s e ;
i f ((0<= l i n ) && ( l i n <tam) && (0<=c o l ) &&
( col <tam) && ( t ab [ l i n ] [ c o l ]==0)) {
t ab [ l i n ] [ c o l ] = num;
i f ( ( l i n==l d ) && ( c o l==cd ) ) {
r e s = t r ue ; Impri meTab ( tam ) ;
} el s e { k = 0;
do { l p = l i n+dl [ k ] ; cp = c o l+dc [ k ] ;
r e s = TentaMovi mento ( tam , num+1, l p , cp , l d , cd ) ;
k++;
} whi l e ( ( ! r e s ) && ( k<NUMMOV) ) ;
}
t ab [ l i n ] [ c o l ] = 0;
}
r et ur n r e s ;
}
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 80
Movimentos do cavalo: exemplo de entrada e sada
0
0
1
1
2
2
3
3
4
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ent r ada Sa da

5 1 4 9 12 1
0 0 10 13 6 3 0
4 4 5 2 11 8 0
0 4 0 7 14 0 1
3 4 1 0 0 0 15
4 0
1 1
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 81
Movimentos do cavalo: achar uma solucao completa
Bool ean TentaMovi mento ( i nt tam , i nt num, i nt l i n ,
i nt col , i nt l d , i nt cd , i nt noc ) {
i nt k , l p , cp ;
Bool ean r e s = f a l s e ;
i f ((0<= l i n ) && ( l i n <tam) && (0<=c o l ) &&
( col <tam) && ( t ab [ l i n ] [ c o l ]==0)) {
t ab [ l i n ] [ c o l ] = num;
i f ( ( l i n==l d ) && ( c o l==cd ) && ( ( noc+num)==tamtam) ) {
r e s = t r ue ; Impri meTab ( tam ) ;
} el s e { k = 0;
do { l p = l i n+dl [ k ] ; cp = c o l+dc [ k ] ;
r e s =
TentaMovi mento ( tam , num+1, l p , cp , l d , cd , noc ) ;
k++;
} whi l e ( ( ! r e s ) && ( k<NUMMOV) ) ;
}
t ab [ l i n ] [ c o l ] = 0;
}
r et ur n r e s ;
}
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd,ocupadas)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 82
Movimentos do cavalo: achar todas as solucoes
voi d TentaMovi mento ( i nt tam , i nt num, i nt l i n ,
i nt col , i nt l d , i nt cd ) {
i nt k , l p , cp ;
i f ((0<= l i n ) && ( l i n <tam) && (0<=c o l ) &&
( col <tam) && ( t ab [ l i n ] [ c o l ]==0)) {
t ab [ l i n ] [ c o l ] = num;
i f ( ( l i n==l d ) && ( c o l==cd ) ) {
Impri meTab ( tam ) ;
} el s e { k = 0;
do { l p = l i n+dl [ k ] ; cp = c o l+dc [ k ] ;
TentaMovi mento ( tam , num+1, l p , cp , l d , cd ) ;
k++;
} whi l e ( k<NUMMOV) ;
}
t ab [ l i n ] [ c o l ] = 0;
}
}
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 83
Exemplo 2: distancia de edicao
RECURS

AO E RETROCESSO
RCURC

AO ER RTROCESOS

[ [ [ [ [ [
I S R I I R

Opera coes elementares:

A: avan co (subentendido)

I: insercao

S: substituicao

R: remocao

Cada operacao recebe um custo (avan co, em geral, zero)

Problema: achar uma sequencia de opera coes que torna as cadeias


iguais ao custo total mnimo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 84
Distancia de edicao: fun cao Distancia
i nt Di s t a nc i a ( char t e s t e , char c o r r e t a ) {
i nt dI ns , dRem, dSub ;
i f ( ( ( t e s t e)==NUL CHAR) && ( ( c o r r e t a)==NUL CHAR) )
r et ur n 0;
dI ns = dRem = dSub = INT MAX;
i f ( ( ( t e s t e )!=NUL CHAR) && ( ( c o r r e t a )!=NUL CHAR) &&
( ( t e s t e )==( c o r r e t a ) ) )
r et ur n Di s t a nc i a ( t e s t e +1, c o r r e t a +1);
i f ( ( ( t e s t e )!=NUL CHAR) && ( ( c o r r e t a )!=NUL CHAR) )
dSub = cust oSub+Di s t a nc i a ( t e s t e +1, c o r r e t a +1);
i f ( ( t e s t e )!=NUL CHAR)
dRem = custoRem+Di s t a nc i a ( t e s t e +1, c o r r e t a ) ;
i f ( ( c o r r e t a )!=NUL CHAR)
dI ns = c u s t o I n s+Di s t a nc i a ( t e s t e , c o r r e t a +1);
r et ur n min ( dI ns , min (dRem, dSub ) ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 85
Distancia de edicao: desaos

Melhorar o desempenho do algoritmo: o algoritmo e exponencial nao


sendo viavel, sob esta forma, em aplicacoes praticas

Imprimir o n umero de operacoes de cada tipo (avanco, inser cao,


remocao e substituicao) para obter a solucao

Imprimir a sequencia de operacoes para obter a solucao


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 86
Elimina cao da recursao
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 87
Esquema de funcao recursiva
voi d Exempl o (T1 x1 , T2 x2 , . . . ) {
S1 y1 ; S2 y2 ; . . . ;
Ci ; / Comandos i n i c i a i s /
i f (E ( . . . ) ) {
C0 ; / Caso bas e /
} el s e { / Chamadas r e c u r s i v a s /
C1 ; Exempl o ( e11 , e12 , . . . ) ;
C2 ; Exempl o ( e21 , e22 , . . . ) ;
C3 ; Exempl o ( e31 , e32 , . . . ) ;
. . . ;
Cm; Exempl o ( em1 , em2 , . . . ) ;
Cf ;
}
}
Os smbolos Ci, C0, C1, . . ., Cm e Cf representam sequencias,
possivelmente vazias, de comandos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 88
Esquema de eliminacao da recursao
voi d Exempl o (T1 x1 , T2 x2 , . . . ) {
S1 y1 ; S2 y2 ; . . . ;
Ci ; / Comandos i n i c i a i s /
i f (E ( . . . ) ) {
C0 ; / Caso bas e /
} e l s e {
/ Chamadas r e c u r s i v a s /
C1 ; Exempl o ( e11 , e12 , . . . ) ;
C2 ; Exempl o ( e21 , e22 , . . . ) ;
C3 ; Exempl o ( e31 , e32 , . . . ) ;
. . . ;
Cm; Exempl o ( em1 , em2 , . . . ) ;
Cf ;
}
}
typedef enum {chamada1 , chamada2 , chamada3 , . . . } Chamadas ;
typedef enum { ent r ada , s ai da , r e t o r no } Acoes ;
voi d Exempl o (T1 x1 , T2 x2 , . . . ) {
S1 y1 ; S2 y2 ; . . . ; / v a r i a v e i s l o c a i s o r i g i n a i s /
T1 t1 , T2 t2 , . . . ; / v a r i a v e i s t e mpor a r i as /
Pi l ha f ; Chamadas ch ; Acoes acao ;
I n i c i a l i z a P i l h a (&f ) ; acao = e nt r ada ;
do {
swi tch ( acao ) {
case ( e nt r ada ) : . . . break ;
case ( r e t o r no ) : . . . break ;
case ( s a i da ) : break ;
}
} whi l e ( acao!=s a i da ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 89
Esquema de eliminacao da recursao (cont.)
voi d Exempl o (T1 x1 , T2 x2 , . . . ) {
S1 y1 ; S2 y2 ; . . . ;
Ci ; / Comandos i n i c i a i s /
i f (E ( . . . ) ) {
C0 ; / Caso bas e /
} e l s e {
/ Chamadas r e c u r s i v a s /
C1 ; Exempl o ( e11 , e12 , . . . ) ;
C2 ; Exempl o ( e21 , e22 , . . . ) ;
C3 ; Exempl o ( e31 , e32 , . . . ) ;
. . . ;
Cm; Exempl o ( em1 , em2 , . . . ) ;
Cf ;
}
}
case ( e nt r ada ) :
Ci ; / Comandos i n i c i a i s /
i f (E ( . . . ) ) {
C0 ; acao = r e t o r no ; / Caso bas e /
} el s e { / Pr i me i r a chamada r e c u r s i v a /
C1 ; Empi l ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada1 ) ;
t 1 = e11 ; t 2 = e12 ; . . . ;
x1 = t 1 ; x2 = t 2 ; . . . ; / Re c a l c ul a ar gumentos /
}
break ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 90
Esquema de eliminacao da recursao (cont.)
voi d Exempl o (T1 x1 , T2 x2 , . . . ) {
S1 y1 ; S2 y2 ; . . . ;
Ci ; / Comandos i n i c i a i s /
i f (E ( . . . ) ) {
C0 ; / Caso bas e /
} e l s e {
/ Chamadas r e c u r s i v a s /
C1 ; Exempl o ( e11 , e12 , . . . ) ;
C2 ; Exempl o ( e21 , e22 , . . . ) ;
C3 ; Exempl o ( e31 , e32 , . . . ) ;
. . . ;
Cm; Exempl o ( em1 , em2 , . . . ) ;
Cf ;
}
}
case ( r e t o r no ) :
i f ( Pi l ha Va z i a ( f ) ) acao = s a i da ;
el s e {
Desempi l ha ( f ,&x1 ,&x2 , . . . , & y1 ,&y2 , . . . , & ch ) ;
swi tch ( ch ) {
case ( chamada1 ) :
C2 ; Empi l ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada2 ) ;
t 1 = e21 ; t 2 = e22 ; . . . ;
x1 = t 1 ; x2 = t 2 ; . . . ;
acao = e nt r ada ; break ;
case ( chamada2 ) :
C3 ; Empi l ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada3 ) ;
t 1 = e31 ; t 2 = e32 ; . . . ;
x1 = t 1 ; x2 = t 2 ; . . . ;
acao = e nt r ada ; break ;
. . . ;
case ( chamadam ) :
Cf ; break ;
} / s wi t c h ( ch ) /
}
break ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 91
Exemplo 1: fun cao fatorial
i nt f a t o r i a l ( i nt n) {
i f ( n==0)
r et ur n 1;
el s e
r et ur n n f a t o r i a l ( n1);
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 92
Funcao fatorial (cont.)
i n t f a t o r i a l ( i n t n) {
i f ( n==0)
r et ur n 1;
e l s e
r et ur n n f a t o r i a l ( n1);
}
typedef enum {chamada1} Chamadas ;
typedef enum { ent r ada , s ai da , r e t o r no } Acoes ;
i nt f a t o r i a l ( i nt n) {
i nt r es , t 1 ;
Pi l ha f ; Chamadas ch ; Acoes acao ;
I n i c i a l i z a P i l h a (&f ) ; acao = e nt r ada ;
do {
swi tch ( acao ) {
case ( e nt r ada ) : . . . break ;
case ( r e t o r no ) : . . . break ;
case ( s a i da ) : break ;
}
} whi l e ( acao!=s a i da ) ;
r et ur n r e s ;
} / f a t o r i a l /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 93
Funcao fatorial (cont.)
i n t f a t o r i a l ( i n t n) {
i f ( n==0)
r et ur n 1;
e l s e
r et ur n n f a t o r i a l ( n1);
}
case ( e nt r ada ) :
i f ( n==0) {
r e s = 1; acao = r e t or no ;
} el s e {
Empi l ha ( f , n , chamada1 ) ;
t 1 = n ; n = t1 1;
}
break ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 94
Funcao fatorial (cont.)
i n t f a t o r i a l ( i n t n) {
i f ( n==0)
r et ur n 1;
e l s e
r et ur n n f a t o r i a l ( n1);
}
case ( r e t o r no ) :
i f ( Pi l ha Va z i a ( f ) ) acao = s a i da ;
el s e {
Desempi l ha ( f ,&n,&ch ) ;
swi tch ( ch ) {
case ( chamada1 ) :
r e s = n r e s ;
break ;
}
break ;
Obs.: Note como neste caso a variavel res e usada para guardar o
resultado da funcao.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 95
Exemplo 2: fun cao Hanoi
voi d Hanoi ( char org , char des t , char aux , i nt n) {
i f ( ! ( n>0))
;
el s e {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 96
Funcao Hanoi (cont.)
voi d Hanoi ( char org , char des t , char aux , i n t n) {
i f ( ! ( n>0))
;
e l s e {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}
typedef enum {chamada1 , chamada2 };
typedef enum { ent r ada , s ai da , r e t o r no } Acoes ;
voi d Hanoi ( char org , char des t , char aux , i nt n) {
char t 1 ; char t 2 ; char t 3 ; i nt t 4 ;
Pi l ha f ; Chamadas ch ; Acoes acao ;
I n i c i a l i z a P i l h a (&f ) ; acao = e nt r ada ;
do {
swi tch ( acao ) {
case ( e nt r ada ) : . . . ; break ;
case ( r e t o r no ) : . . . ; break ;
case ( s a i da ) : break ;
}
} whi l e ( acao!=s a i da ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 97
Funcao Hanoi (cont.)
voi d Hanoi ( char org , char des t , char aux , i n t n) {
i f ( ! ( n>0))
;
e l s e {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}
case ( e nt r ada ) :
i f ( ! ( n>0)) {
acao = r e t o r no ;
} el s e {
Empi l ha ( f , org , des t , aux , n , chamada1 ) ;
t 1 = or g ; t 2 = aux ; t 3 = de s t ; t 4 = n1;
or g = t 1 ; de s t = t 2 ; aux = t 3 ; n = t 4 ;
}
break ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 98
Funcao Hanoi (cont.)
voi d Hanoi ( char org , char des t , char aux , i n t n) {
i f ( ! ( n>0))
;
e l s e {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}
case ( r e t o r no ) :
i f ( Pi l ha Va z i a ( f ) )
acao = s a i da ;
el s e {
Desempi l ha ( f ,&org ,&des t ,&aux ,&n,&ch ) ;
swi tch ( ch ) {
case ( chamada1 ) :
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Empi l ha ( f , org , des t , aux , n , chamada2 ) ;
t 1 = aux ; t 2 = de s t ; t 3 = or g ; t 4 = n1;
or g = t 1 ; de s t = t 2 ; aux = t 3 ; n = t 4 ;
acao = e nt r ada ;
break ;
case ( chamada2 ) :
break ;
}
break ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 99
Exemplo de eliminacao da recursao caudal
Aplicavel quando a ultima acao dentro do corpo da funcao e uma
chamada recursiva: reaproveita o mesmo registro de ativa cao da fun cao,
mudando os valores dos argumentos.
voi d Hanoi ( char org , char des t , char aux , i nt n) {
i f ( n>0) {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
Hanoi ( aux , des t , org , n1);
}
}
voi d Hanoi ( char org , char des t , char aux , i nt n) {
char t ;
whi l e ( n>0) {
Hanoi ( org , aux , des t , n1);
p r i n t f ( Mova de %c par a %c\n , org , de s t ) ;
t = or g ; or g = aux ; aux = t ;
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 100
Recursao m utua: Analise sintatica
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 101
Exemplo simples de recursao m utua
i nt g ( i nt n ) ;
i nt f ( i nt n) {
i f ( n==0)
r et ur n 0;
el s e
r et ur n g ( n1);
}
i nt g ( i nt n) {
i f ( n==0)
r et ur n 1;
el s e
r et ur n f ( n1);
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 102
Analise de express oes
Expressoes com operadores binarios +, , , / e parenteses ( e ):
e = t
1
t
2
t
n
, n 1
t = f
1
f
2
f
n
, n 1
f = x ou f = ( e )
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 103
Programa de tradu cao de inxa para pos-xa:
char e nt r ada [TAM MAX] ;
char pe ;
voi d Expr es s ao ( ) ;
voi d Termo ( ) ;
voi d Fat or ( ) ;
voi d I nPos ( ) {
pe = &e nt r ada [ 0 ] ;
Expr es s ao ( ) ;
i f ( ( pe )!= \0 )
Er r o ( ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 104
Fator
f = x ou f = ( e )
voi d Fat or ( ) {
char c o r r e n t e = pe ;
swi tch ( c o r r e n t e ) {
case a : case b : . . . : case z :
Sai ( c o r r e n t e ) ; pe++; break ;
case ( :
pe++;
Expr es s ao ( ) ;
i f ( ( pe)== ) )
pe++;
el s e
Er r o ( ) ;
break ;
def aul t :
Er r o ( ) ;
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 105
Termo
t = f
1
f
2
f
n
, n 1
voi d Termo ( ) {
char op ;
Fat or ( ) ;
do {
op = pe ;
i f ( ( op== ) | | ( op== / ) ) {
pe++;
Fat or ( ) ;
Sai ( op ) ;
} el s e
break ; / do /
} whi l e ( t r ue ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 106
Expressao
e = t
1
t
2
t
n
, n 1
voi d Expr es s ao ( ) {
char op ;
Termo ( ) ;
do {
op = pe ;
i f ( ( op==+ ) | | ( op== ) ) {
pe++;
Termo ( ) ;
Sai ( op ) ;
} el s e
break ; / do /
} whi l e ( t r ue ) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 107
Operador de exponenciacao
Fator redenido:
f = p
1
p
2
p
n
, n 1
Primario:
p = x ou p = ( e )
Prioridade? Solucao:
f = p ou f = p f
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 108
Fator redenido
f = p ou f = p f
voi d Fat or ( ) {
Pr i mar i o ( ) ;
i f ( ( pe)== ) {
pe++;
Fat or ( ) ;
Sai ( ) ;
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 109
Primario
p = x ou p = ( e )
voi d Pr i mar i o ( ) {
c o r r e n t e = pe ;
swi tch ( c o r r e n t e ) {
case a : case b : . . . : case z :
Sai ( c o r r e n t e ) ; pe++; break ;
case ( :
pe++;
Expr es s ao ( ) ;
i f ( ( pe)== ) )
pe++;
el s e
Er r o ( ) ;
break ;
def aul t :
Er r o ( ) ;
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 110
Analogia para express oes e termos
e = t ou e = e t
t = f ou t = t f
Problemas:

como distinguir as alternativas

repeti cao innita no segundo caso (recursao esquerda)


voi d Expr es s ao ( ) {
. . . ;
i f ( ???)
Termo ( ) ;
el s e
Expr es s ao ( ) ;
. . .
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao m utua: Analise sintatica 111

Arvores binarias
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 112
Exemplo de arvore binaria 1: pedigree
Sugarteds Bonnie
Carina de Wood Ladge
Matarazzos Beauty
Lady
Weberly
Johnson
Fancy Boots
Scotland dos Seis Irmaos
Arisca dos
Seis Irmaos
Ator dos
Seis Irmaos
Jesse James
R. J. B. Helvetia
Carina de
Wood Ladge
R. J. B.
Sean
R. J. B. Hill
Lakeview
Lois
R. J. B.
Sean

Alguns nomes sao repetidos: eles devem ser tratados como instancias
separadas.

Pela propria natureza da arvore, cada elemento tem dois


predecessores: arvore binaria.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 113
Exemplo de arvore binaria 2: arvore de decisao
x1 x2
x2 x3
x1, x2, x3 x1 x3
x1, x3, x2 x3, x1, x2
x2 x3
x1 x3
x2, x1, x3 x2, x3, x1
x3, x2, x1
V F
V F
V F
V F
V F

A arvore representa as decisoes tomadas por um algoritmo de


ordenacao usando operacoes de compara cao; V: verdadeiro, F: falso.

Devido `a natureza das comparacoes, a arvore e binaria.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 114
Exemplo de arvore geral 1: descendentes
Indo-
Europeu
Balto-
Eslavo
Baltico
Letao
Lituano
Eslavo
Checo
Russo
Polones
Italico Latim
Catalao
Italiano
Frances
Castelhano
Portugues
Indo-
Iraniano
Persa
Antigo
Persa
Hindustano
Urdu
Hindi
Germanico
Germanico
Setentrional
Sueco
Noruegues
Dinamarques
Germanico
Ocidental
Holandes
Alemao
Ingles
Grego
Classico
Grego Moderno

A arvore e incompleta e nao necessariamente exata.

Cada elemento pode ter um n umero variavel de sucessores: arvore


geral.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 115
Exemplo de arvore geral 2: descendentes
Famlia
Subfamlia
Tribo
Genero
Especie
Subespecie
Hominidae
Homininae
Hominini
Homo
Homo
sapiens
Homo sapiens
sapiens
Homo
habilis
Homo
neander-
thalensis
. . .
Pan
Chimpanze Bonobo
Gorillini
Gorilla
Gorila
Ponginae
Pongo
Orangotango


Arvore da famlia Hominidae determinada por comparacao de DNA de
varias especies (incompleta).

Cada elemento pode ter um n umero variavel de sucessores: arvore


geral.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 116
Exemplo de arvore geral 3: organograma
UNICAMP
IC
DSC DSI DTC
IMECC
DE DM DMA
FEEC
DCA DEB DT
FCM
DAP DAN DTO
. . .
. . . . . .
Obs.: A UNICAMP tem 21 unidades academicas. Algumas unidades tem
mais de 10 departamentos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 117
Denicao de arvore binaria
Uma arvore binaria e um conjunto de nos que:

ou e vazio (arvore binaria vazia)

ou contem um no especial denominado raiz da arvore e o resto do


conjunto esta particionado em duas arvores binarias disjuntas
(possivelmente vazias), denominadas subarvore esquerda e subarvore
direita.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 118
Representacao graca, convenc oes e conceitos
nvel 1
nvel 2
nvel 3
nvel 4
A
B
D E
G
C
F
H
Raiz da arvore: A
Filho esquerdo de A: B Filho direito de A: C
Pai de F: C Irmao de E: D
Descendentes de B: B, D, E e G Antepassados de H: H, F, C e A
Folhas: D, G e H Nos internos: todos exceto as folhas
Nveis: indicados na gura Altura (profundidade) nvel maximo: 4
Subarvores binarias vazias: 9 Subarvores binarias nao vazias: 7
Obs.: Alguns autores comecam a numeracao dos nveis a partir de zero.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 119
Fatos sobre arvores binarias

Uma arvore binaria com n nos tem:

altura maxima n

altura mnima ,log


2
(n + 1)|

subarvores vazias: n + 1

subarvores nao vazias: n 1 (se n > 0)

Uma arvore binaria de altura h tem:

no mnimo h nos

no maximo 2
h
1 nos
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 120
Representacao ligada comum
p
A
B C
D E F
G H
O acesso a todos os nos da arvore pode ser realizado atraves de um
apontador para a raiz.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 121
Representacao ligada com tres apontadores
p
A
B
D E
G
C
F
H
O terceiro apontador possibilita descer e subir pela estrutura,
analogamente `as listas duplamente ligadas.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 122
Representacao com o campo pai apenas
A
B C
D E F
G H
Problemas:


E necessario haver acesso (apontadores) pelo menos a todas as folhas.

Nao e possvel distinguir entre os lhos esquerdos e direitos.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 123
Representacao seq uencial: arvores binarias completas
A
B
C
D E
F
G H
I
J
K L
M
N O
0
1 2
3 4 5 6
7 8 9 10 11 12 13 14
No n:

lho esquerdo: 2n + 1 (n 0)
lho direito: 2n + 2 (n 0)
pai: (n 1)/2| (n > 0)
A
0
B
1
I
2
C
3
F
4
J
5
M
6
D
7
E
8
G
9
H
10
K
11
L
12
N
13
O
14
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 124
Representacao seq uencial: arvores binarias quase completas
A
B
C
D E
F
G H
I
J
K
M
0
1 2
3 4 5 6
7 8 9 10 11
A
0
B
1
I
2
C
3
F
4
J
5
M
6
D
7
E
8
G
9
H
10
K
11
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 125
Percursos em profundidade

Pre-ordem:
Visitar a raiz
Percorrer a subarvore esquerda em pre-ordem
Percorrer a subarvore direita em pre-ordem

Pos-ordem:
Percorrer a subarvore esquerda em pos-ordem
Percorrer a subarvore direita em pos-ordem
Visitar a raiz

Inordem (ou ordem simetrica):


Percorrer a subarvore esquerda em inordem
Visitar a raiz
Percorrer a subarvore direita em inordem
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 126
Exemplos de percurso em profundidade
A
B
D E
G
C
F
H
Pre-ordem: A,B,D,E,G,C,F,H
Pos-ordem: D,G,E,B,H,F,C,A
Inordem: D,B,G,E,A,F,H,C
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 127
Percurso em largura
Percurso por nveis, da esquerda para a direita:
nvel 1
nvel 2
nvel 3
nvel 4
A
B
D E
G
C
F
H
Percurso: A,B,C,D,E,F,G,H
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 128
Implementacao recursiva de percursos
typedef s t r uc t NoArvBi n {
T i n f o ;
s t r uc t NoArvBi n esq , d i r ;
} NoArvBin , ArvBi n ;
voi d PreOrdem( ArvBi n p) {
i f ( p!=NULL) {
Vi s i t a ( p ) ;
PreOrdem( p>es q ) ;
PreOrdem( p>d i r ) ;
}
} / PreOrdem /
voi d InOrdem( ArvBi n p) {
i f ( p!=NULL) {
InOrdem( p>es q ) ;
Vi s i t a ( p ) ;
InOrdem( p>d i r ) ;
}
} / InOrdem /
voi d PosOrdem( ArvBi n p) {
i f ( p!=NULL) {
PosOrdem( p>es q ) ;
PosOrdem( p>d i r ) ;
Vi s i t a ( p ) ;
}
} / PosOrdem /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 129
Eliminacao da recursao caudal
voi d PreOrdem( ArvBi n p) {
i f ( p!=NULL) {
Vi s i t a ( p ) ;
PreOrdem( p>es q ) ;
PreOrdem( p>d i r ) ;
}
} / PreOrdem /
voi d PreOrdem( ArvBi n p) {
whi l e ( p!=NULL) {
Vi s i t a ( p ) ;
PreOrdem( p>es q ) ;
p = p>d i r ;
}
} / PreOrdem /

Transforma cao analoga pode ser feita para a inordem.

E a pos-ordem?
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 130
Percurso em pre-ordem, usando uma pilha explcita
A gura indica a situacao inicial e nal do percurso de uma arvore
arbitraria (pode ser vazia). Inicialmente, o apontador para a arvore deve
estar no topo da pilha. Terminado o percurso, a pilha tera um elemento a
menos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 131
Percurso em pre-ordem, usando uma pilha explcita (cont.)
X
E D
Visita X Percorre E Percorre D
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 132
Percurso em pre-ordem, usando uma pilha (cont.)
voi d PreOrdem( ArvBi n p) {
Pi l ha pl ;
I n i c i a l i z a P i l h a (&pl ) ;
Empi l ha(&pl , p ) ;
do {
Desempi l ha(&pl ,&p ) ;
i f ( p!=NULL) {
Vi s i t a ( p ) ;
Empi l ha(&pl , p>d i r ) ;
Empi l ha(&pl , p>es q ) ;
}
} whi l e ( ! Pi l ha Va z i a ( pl ) ) ;
} / PreOrdem /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 133
Percurso em largura, usando uma la
Os nos da arvore a serem visitados sao guardados numa la.
X
E D
nvel k
nvel k+1
Visita X
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 134
Percurso em largura, usando uma la (cont.)
voi d Lar gur a ( ArvBi n p) {
F i l a f l ;
I n i c i a l i z a F i l a (& f l ) ;
I n s e r e F i l a (&f l , p ) ;
do {
RemoveFi l a(&f l ,&p ) ;
i f ( p!=NULL) {
Vi s i t a ( p ) ;
I n s e r e F i l a (&f l , p>es q ) ;
I n s e r e F i l a (&f l , p>d i r ) ;
}
} whi l e ( ! Fi l a Va z i a ( f l ) ) ;
} / Lar gur a /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 135
Comparacao dos percursos em pre-ordem e em largura
voi d PreOrdem( ArvBi n p) {
Pi l ha pl ;
I n i c i a l i z a P i l h a (&pl ) ;
Empi l ha(&pl , p ) ;
do {
Desempi l ha(&pl ,&p ) ;
i f ( p!=NULL) {
Vi s i t a ( p ) ;
Empi l ha(&pl , p>d i r ) ;
Empi l ha(&pl , p>es q ) ;
}
} whi l e ( ! Pi l ha Va z i a ( pl ) ) ;
} / PreOrdem /
voi d Lar gur a ( ArvBi n p) {
F i l a f l ;
I n i c i a l i z a F i l a (& f l ) ;
I n s e r e F i l a (&f l , p ) ;
do {
RemoveFi l a(&f l ,&p ) ;
i f ( p!=NULL) {
Vi s i t a ( p ) ;
I n s e r e F i l a (&f l , p>es q ) ;
I n s e r e F i l a (&f l , p>d i r ) ;
}
} whi l e ( ! Fi l a Va z i a ( f l ) ) ;
} / Lar gur a /
Quase identicos, exceto a troca de esquerda pela direita!
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 136
Preordem com pilha otimizada
voi d PreOrdem( ArvBi n p) {
Pi l ha pl ;
Bool ean f i m = f a l s e ;
I n i c i a l i z a P i l h a (&pl ) ;
do {
i f ( p!=NULL) {
Vi s i t a ( p ) ;
i f ( p>d i r !=NULL)
Empi l ha ( pl , p>d i r ) ;
p = p>es q ;
} el s e i f ( Pi l ha Va z i a ( pl ) )
f i m = t r ue
el s e
Desempi l ha ( pl ,&p ) ;
} whi l e ( ! f i m ) ;
} / PreOrdem /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 137
Pre-ordem com pilha embutida: Deutsch, Schorr e Waite
... ...
... ... ... ...
... ...
... ...
t p
NULL

A variavel p aponta para a subarvore a ser percorrida.

A variavel t aponta para o topo de uma pilha formada pelos nos que
levam ao no p (apontadores invertidos).

Cada no devera conter uma marca indicando qual dos dois


apontadores esta invertido.

A funcao seguinte implementa os tres percursos em profundidade.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 138
Pre-ordem com pilha embutida (cont.)
voi d DSW( ArvBi n p) {
ArvBi n t = NULL; ArvBi n q ; Bool ean sobe ;
do {
whi l e ( p!=NULL) { / `a es quer da /
Pr e Vi s i t a ( p ) ; p>marca = MarcaEsq ; q = p>es q ;
p>es q = t ; t = p ; p = q ;
}
sobe = t r ue ;
whi l e ( sobe && ( t !=NULL) ) {
swi tch ( t>marca ) {
case MarcaEsq : / `a d i r e i t a /
I n Vi s i t a ( t ) ; sobe = f a l s e ; t>marca = MarcaDi r ;
q = p ; p = t>d i r ; t>d i r = t>es q ; t>es q = q ;
break ;
case MarcaDi r : / sobe /
Po s Vi s i t a ( t ) ; q = t>d i r ; t>d i r = p ; p = t ; t = q ;
break ;
}
}
} whi l e ( t !=NULL) ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 139
Desaos:

melhorar a pre-ordem com pilha otimizada

inordem com pilha otimizada

pos-ordem com pilha otimizada


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 140
Reconstrucao de arvores binarias
Pre-ordem AB:
A
B
A
B
Inordem AB:
B
A
A
B
Pos-ordem AB:
B
A
B
A
Pre-ordem AB e pos-ordem BA:
A
B
A
B
Conclusao: uma unica ordem e a combina cao de pre- e pos-ordens nao
determinam a arvore de maneira unica.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 141
Reconstrucao de arvores binarias (cont.)
Verica-se facilmente que a pre-ordem (ou a pos-ordem) combinada com a
inordem determinam, de maneira unica, a forma da arvore. No caso da
pre-ordem e inordem, pode-se seguir o seguinte algoritmo:

a partir da pre-ordem, determine a raiz da arvore

dada a raiz, ela separa a inordem em inordens das suas subarvores


esquerda e direita

a partir da pre-ordem, sao determinadas as pre-ordens das subarvores


que tem os mesmos comprimentos das respectivas inordens

recursivamente sao reconstrudas as subarvores


O caso da pos-ordem e analogo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 142
Representac oes externas de arvores binarias
A
B
D E
G
C
F
H

percursos canonicos: inordem e pre (ou pos)


-ordem (ja visto):
DBGEAFHC
ABDEGCFH

percurso canonico com indicadores de subarvores (pre-ordem):


A
11
B
11
D
00
E
10
G
00
C
10
F
01
H
00
O ndice 0 indica a ausencia e 1 indica a existencia de lho esquerdo
ou direito.

descricao parentetica (inordem):


(((()D())B((()G())E()))A((()F(()H()))C()))
() representa uma arvore vazia; (X) representa uma arvore de raiz
X e subarvores descritas pelas cadeias e .
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias 143

Arvores binarias de busca


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 144
Exemplo de arvore de busca: n umeros
16
8
5 15
10
27
21
25
Para qualquer no da arvore, os elementos da sua subarvore esquerda
(direita) sao menores ou iguais (maiores ou iguais) do que o elemento do
no.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 145
Exemplo de arvore de busca: nomes
jul
fev
ago
abr dez
jan
set
mai
jun mar
nov
out
Para qualquer no da arvore, os elementos da sua subarvore esquerda
(direita) precedem (seguem) em ordem alfabetica o elemento do no.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 146
Insercao em arvore de busca
A insercao de um valor X cria uma nova folha em lugar de uma subarvore
vazia. O ponto de insercao e determinado pelo percurso da arvore usando
a propriedade de arvores de busca.
Y
X < Y
Y
X
Y
X > Y
Y
X
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 147
Insercao recursiva
Bool ean I ns e r e Ar vBus c a ( ArvBi n p , T x ) {
/ Ver sao r e c u r s i v a /
i f ( ( p)==NULL) {
p = mal l oc ( s i z e of ( NoArvBi n ) ) ;
(p)>es q = (p)>d i r = NULL;
(p)>i n f o = x ;
r et ur n t r ue ;
} el s e {
T i n f o = (p)>i n f o ;
i f ( x<i n f o )
r et ur n I ns e r e Ar vBus c a (&((p)>es q ) , x ) ;
el s e i f ( x>i n f o )
r et ur n I ns e r e Ar vBus c a (&((p)>d i r ) , x ) ;
el s e
r et ur n f a l s e ;
}
}

Note-se o uso de passagem de parametro p por referencia.

Esta versao apresenta somente recursao caudal que pode ser


facilmente eliminada.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 148
Insercao iterativa
Bool ean I ns e r e Ar vBus c a ( ArvBi n p , T x ) {
/ Ver sao i t e r a t i v a /
T i n f o ;
whi l e ( ( p)!=NULL) {
i n f o = (p)>i n f o ;
i f ( x<i n f o )
p = &((p)>es q ) ;
el s e i f ( x>i n f o )
p = &((p)>d i r ) ;
el s e
r et ur n f a l s e ;
}
p = mal l oc ( s i z e of ( NoArvBi n ) ) ;
(p)>es q = (p)>d i r = NULL;
(p)>i n f o = x ;
r et ur n t r ue ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 149
Remocao em arvore de busca
Caso 1: pelo menos uma das subarvores e vazia:
p
X

p e o endereco do campo ou da variavel que contem o apontador para


o no com a informacao X.

O caso de ambas as subarvores vazias tambem esta coberto.

O caso de subarvore esquerda vazia mas direita nao vazia e analogo.

O no com a informacao X pode ser liberado.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 150
Remocao em arvore de busca (cont.)
Caso 2: as duas subarvores sao nao vazias
p
X
Y
p
X
Y
Y

Substituir a informa cao X por Y o valor maximo contido na


subarvore esquerda (ou mnimo na subarvore direita).

Remover o no que originalmente continha Y (sua subarvore direita e


vazia aplica-se o caso 1).

Implementacao: exerccio.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 151
Inserc oes e remoc oes em arvores binarias de busca

Problema: a altura da arvore pode crescer muito ja que numa arvore


com n nos:

altura maxima n

altura mnima ,log


2
(n + 1)|

Se n 1.000:

altura maxima 1.000

altura mnima 10

Se n 1.000.000:

altura maxima 1.000.000

altura mnima 20

O pior caso ocorre, por exemplo, quando a inser cao e feita em ordem
(crescente ou descrescente)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 152
Balanceamento de arvores

Algoritmo obvio nao garante balanceamento

Balanceamento perfeito (altura mnima):

eciencia de busca: O(log n)

eciencia de inser cao: O(n) inaceitavel

Balanceamento aproximado:

arvores AVL eciencia de busca, inser cao e remocao: O(log n)

arvores rubro-negras eciencia de busca, insercao e remo cao:


O(log n)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 153

Arvores de altura balanceada (AVL)

Autores: G. M. Adelson-Velski e E. M. Landis (1962)

Uma arvore binaria de busca e do tipo AVL se ela e vazia, ou entao,


se para todos os seus nos a diferenca de alturas entre as subarvores
esquerda e direita e no maximo 1, em valor absoluto.

A diferenca entre as alturas direita e esquerda e chamada fator de


balanceamento.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 154
Exemplos de arvores AVL
0
0 0

+
+ 0 0
0
Note-se que a primeira arvore e de altura mnima enquanto que a segunda
nao e.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 155
Pior caso de desbalanceamento: arvores de Fibonacci
F
0
NULL
F
1
0
F
2

0
F
3

F
4


0 0
0
Forma geral altura h2:
F
h

F
h1
F
h2
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 156

Arvores de Fibonacci: propriedades



F
h1
F
h2

Para uma dada altura h, a arvore contem o n umero mnimo de nos


possvel preservando ainda a propriedade AVL.

Qualquer outra arvore AVL com o mesmo n umero de nos tem altura
menor ou igual este e o pior caso.

N umero de nos de F
h
: N(h) = N(h 1) +N(h 2) + 1, h 2

Demonstra-se por indu cao: N(h) = f


h+2
1, onde f
i
e o i-esimo
n umero de Fibonacci.

Usando a aproximacao f
i
((1 +

(5))/2)
i
/

(5) obtem-se:
h 1, 44 log
2
(n + 2) (no maximo).

Opera cao de busca usara O(log n) opera coes.

A ser visto: insercao e remo cao tambem usarao O(log n) opera coes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 157
Insercao em arvores AVL
A explicacao a seguir supoe que a inser cao e realizada por uma fun cao
recursiva cujo cabecalho e:
Bool ean Bus c aI ns e r e ( ArvAVL p , T x , Bool ean a l t ) ;
onde

p: endereco da variavel que contem o apontador para a arvore

x: valor a ser inserido de algum tipo T conveniente

alt: endereco da variavel na qual e devolvida a informa cao que indica


se a arvore aumentou ou nao de altura

se nao houver aumento de altura numa chamada recursiva, o resto da


arvore nao sofre mudan ca

conforme sera visto, o aumento da altura sera no maximo de um e


pode acontecer somente numa arvore vazia ou entao cuja raiz tem
fator de balanceamento igual a zero; neste caso, o fator resultante
sera diferente de zero, exceto quando a arvore era vazia.
O valor devolvido pela funcao indica se a insercao foi efetivamente
realizada ou se o elemento x ja pertencia `a arvore.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 158
Insercao em arvores AVL (cont.)
Explicacao geral: caso de chamada recursiva sem aumento de altura
p
h
x alt: ?
p
h
x ? alt: false

Neste caso, nao havera mais modica coes na arvore.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 159
Insercao em arvores AVL (cont.)
Explicacao geral: caso de chamada recursiva com aumento de altura
p
h
x alt: ? p
h+1
x ? alt: true

Neste caso, havera modica cao no no corrente com possvel propaga cao
para as chamadas anteriores.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 160
Insercao em arvores AVL (cont.)
Caso 1: Insercao em arvore vazia:
NULL
h = 0
X
0
h = 1
Neste caso a altura h aumenta. Este fato sera propagado no retorno da
funcao atraves de valor verdadeiro da variavel alt.
Nos casos seguintes, sera suposto sempre que a insercao foi realizada na
subarvore esquerda; o caso da inser cao do lado direito e analogo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 161
Insercao em arvores AVL (cont.)
Caso 2: Insercao do lado mais baixo:
+
h
+
x
h
alt: true
0
x
h
alt: false
O conte udo do retangulo representa o resultado da chamada recursiva. O
fator de balanceamento sera modicado somente se a arvore esquerda
aumentou de tamanho.
Neste caso a altura permanece inalterada. Este fato sera propagado no
retorno da fun cao atraves de valor falso da variavel alt. Como
consequencia, o processo de insercao para (exceto os retornos).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 162
Insercao em arvores AVL (cont.)
Caso 3: Insercao quando as duas alturas sao iguais
0
h
0
x
h+1
alt: true

x
h+1
alt: true
Neste caso, se houve aumento de altura na chamada recursiva, a altura
total tambem aumentara. Este fato sera propagado no retorno da fun cao
atraves de valor verdadeiro da variavel alt.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 163
Insercao em arvores AVL (cont.)
Caso 4: Insercao do lado mais alto

x
h-1 h+1
alt: true
Neste caso, se houve aumento de altura na chamada recursiva, a arvore
deixara de ser do tipo AVL. Havera entao dois subcasos, dependendo do
lado da subarvore esquerda em que houve insercao. A identica cao do
subcaso sera feita pelo valor do fator de balanceamento nal da subarvore
que aumentou de altura durante a chamada recursiva.
Nos dois casos havera rearranjos convenientes mas locais da arvore.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 164
Insercao em arvores AVL (cont.)
Caso 4a: insercao do lado esquerdo da subarvore (rotacao LL)

x
h-1 h+1
alt: true

A
B
x
h-2
h-1
h-2 T1 T2
T3
0
0
B
A
x h-2
h-1
h-2
T1
T2 T3
0
B
x
h
alt: false
Neste caso e realizada uma transforma cao denominada rotacao simples LL
(esquerda, esquerda). A altura nal permanece inalterada e a variavel alt
recebe valor falso.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 165
Insercao em arvores AVL (cont.)
Caso 4b: insercao do lado direito da subarvore (rota cao LR)

x
h-1 h+1
alt: true

+
+0
A
B
C
x x
T1
T2 T3
T4
h-2
h-2
h-2/h-3
A B
C
0
/0 0/+
h-2/h-3
T1
T2 T3
T4 x x
h-2 h-2
0
C
x
h
alt: false
Neste caso, a insercao pode ter sido realizada na subarvore esquerda ou
direita do lado que cresceu, ou entao no proprio no C quando h = 2. Os
fatores de balanceamento nais dependem disto, mas o da raiz sera 0. A
transformacao e denominada rota cao dupla LR (esquerda, direita). A
altura nal permanece inalterada e a variavel alt recebe valor falso.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 166
Funcao de insercao em arvores AVL
Bool ean Bus c aI ns e r e ( ArvAVL p , T x , Bool ean a l t ) {
/ Devol ve t r ue ou f a l s e conf or me houve ou nao i n s e r c a o ;
s e houve i ns e r c a o , a l t i n d i c a s e houve aumento da a l t u r a .
/
i f (p==NULL) {
p = mal l oc ( s i z e of ( NoArvAVL ) ) ;
(p)>es q = (p)>d i r = NULL; (p)>i n f o = x ;
(p)>bal = z e r o ; a l t = t r ue ;
r et ur n t r ue ;
} el s e {
T i n f o = (p)>i n f o ;
i f ( x==i n f o )
r et ur n f a l s e ;
el s e i f ( x<i n f o ) { / des ce `a es quer da /
Bool ean r e s = Bus c aI ns e r e (&((p)>es q ) , x , a l t ) ;
i f ( ! r e s )
r et ur n f a l s e ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 167
Funcao de insercao em arvores AVL (cont.)
i f ( a l t ) { / aumento de a l t u r a /
ArvAVL p1 , p2 ;
swi tch ( ( p)>bal ) {
case mai s : (p)>bal = z e r o ; a l t = f a l s e ; break ;
case z e r o : (p)>bal = menos ; break ;
case menos :
p1 = (p)>es q ;
i f ( p1>bal==menos ) {
/ Rota cao s i mpl e s LL /
} el s e {
/ Rota cao dupl a LR /
}
p1>bal = z e r o ; a l t = f a l s e ;
break ;
}
}
r et ur n t r ue ;
} el s e {
/ des ce `a d i r e i t a anal ogo /
}
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 168
Exemplos de insercao em arvores AVL
Insercao de 33:
50
25 65
20 35 55
60 10 30 45
70
40 33

+
+
0 0
0

+
0
0
50
25 65
20 35 55
60 10 30 45
70
40 33

+
+
0 +
0 0

0
0
0
Neste caso, houve uma insercao simples e a mudanca de fatores de
balanceamento afetou os nos marcados.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 169
Exemplos de insercao em arvores AVL (cont.)
Insercao de 63:
50
25 65
20 35 55
60 10 30 45
70
40 63

+
+
0 0
0

+
0
0
50
25 65
20 35 60
63 10 30 45
70
40
55

+
0
0 0
0
0

+
0
0
Neste caso, a insercao causou uma rota cao simples do tipo RR, afetando
os nos marcados.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 170
Exemplos de insercao em arvores AVL (cont.)
Insercao de 41:
50
25 65
20 35 55
60 10 30 45
70
40
41

+
+
0 0
0

+
0
0
50
25 65
20 35 55
60 10 30 41
70
40 45

+
+
0 0
0

+
0 0
0
0
Neste caso, a insercao causou uma rota cao dupla do tipo LR, afetando os
nos marcados.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 171
Remocao em arvores AVL
1. Transforma cao em remocao de uma folha - tres casos:

o no tem grau zero: ja e uma folha

o no tem grau um: pela propriedade AVL, a sua unica subarvore e


necessariamente constituda por uma folha, cujo valor e copiado para o
no pai; o no a ser eliminado e a folha da subarvore

o no tem grau dois: o seu valor e substitdo pelo maior valor contido na
sua subarvore esquerda (ou o menor valor contido na sua subarvore
direita); o no que continha o menor (ou maior) valor copiado tem
necessariamente grau zero ou um, recaindo num dos casos anteriores.
2. Remocao propriamente dita.
3. O algoritmo de remocao sera apresentado novamente como uma
funcao recursiva que indica se houve diminuicao da altura da arvore
apos a remo cao. Serao estudados apenas os casos de remocao do
lado esquerdo; os outros sao analogos.
4. A implementacao do algoritmo e um exerccio.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 172
Remocao em arvores AVL (cont.)
Caso 1: Remo cao de uma folha
X
0
h = 1
NULL
h = 0
Neste caso a altura h diminui. Este fato sera propagado no retorno da
funcao atraves de valor verdadeiro da variavel alt.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 173
Remocao em arvores AVL (cont.)
Caso 2: Remo cao quando as duas alturas sao iguais
0
x
h
0
h
alt: true
+
h
alt: false
O conte udo do retangulo representa o resultado da chamada recursiva. O
fator de balanceamento sera modicado somente se a arvore esquerda
diminuiu de tamanho.
Neste caso, mesmo que haja diminui cao de altura na chamada recursiva, a
altura total permanece a mesma. Este fato sera propagado no retorno da
funcao atraves de valor falso da variavel alt.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 174
Remocao em arvores AVL (cont.)
Caso 3: Remo cao do lado mais alto

x
h

alt: true
h-1
0
alt: true
h-1
Neste caso, se a chamada recursiva indica diminuicao da altura da
subarvore, a altura nal da arvore tambem diminui e o processo continua.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 175
Remocao em arvores AVL (cont.)
Caso 4: Remo cao do lado mais baixo
+
x
h
+
alt: true
h h-2
Caso a subarvore esquerda tenha sua altura diminuda, a arvore deixa de
ser do tipo AVL. Ha tres subcasos, dependendo do fator de balanceamento
do lho direito da raiz.
Note-se que, neste caso, tem-se h 3.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 176
Remocao em arvores AVL (cont.)
Caso 4a: Fator de balanceamento 0 (rotacao RR)
+
alt: true
h h-2
+
0
A
B
h-2
h-3
h-2
T1
T2 T3

+
B
A
h-2
h-3
h-2
T1
T2
T3

B
h
alt: false
Neste caso e realizada uma transformacao denominada rotacao simples RR
(direita, direita). A altura nal permanece inalterada e a variavel alt
recebe valor falso. O processo de ajuste da arvore para.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 177
Remocao em arvores AVL (cont.)
Caso 4b: Fator de balanceamento +1 (rotacao RR)
+
alt: true
h h-2
+
+
A
B
h-2
h-3
h-3
T1
T2
T3
0
0
B
A
h-2
h-3 h-3
T1 T2
T3
h-1
0
B
h-1
alt: true
Neste caso tambem e realizada a transformacao denominada
rotacao simples RR (direita, direita). A altura nal diminui e a variavel alt
recebe o valor verdadeiro. O processo de ajuste da arvore continua.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 178
Remocao em arvores AVL (cont.)
Caso 4c: Fator de balanceamento -1 (rotacao RL)
+
alt: true
h h-2
+

+0
A
B
C
T1
T2 T3
T4
h-3
h-3
h-3/h-4
C
A B
0
/0 0/+
h-3/h-4
T1
T2 T3
T4
h-3 h-3
0
C
h-1
alt: true
Neste caso tambem e realizada uma transformacao denominada
rotacao dupla RL (direita, esquerda). A altura nal diminui e a variavel
alt recebe o valor verdadeiro. O processo de ajuste da arvore continua.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 179
Exemplos de remocao em arvores AVL
Remocao de 40:
50
25 65
20 35 55
60 10 30 45
70
40

+
+
0 0
0

+
0
0
50
25 65
20 35 55
60 10 30 45
70
0
0
+
0 0

0
0 0
0
Neste caso, houve uma remo cao simples e a mudan ca de fatores de
balanceamento afetou os nos marcados.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 180
Exemplos de remocao em arvores AVL (cont.)
Remocao de 60:
50
25 65
20 35 55
60 10 30 45
70
40

+
+
0 0
0

+
0
0
35
25 50
20 30 45 65
10 40 55 70
0


0 0 0
+
0 0
0
Neste caso, a remocao causou, apos a volta da chamada com a raiz
original, uma rota cao dupla do tipo LR, afetando os nos marcados.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores binarias de busca 181

Arvores do tipo B
(B trees)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 182
Discos magneticos
Esbo co esquematico do corte vertical de uma unidade com quatro discos
(oito superfcies):
0
1
2
3
4
5
6
7
cabe cas leitoras/gravadoras
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 183
Discos magneticos (cont.)
Esbo co esquematico de uma superfcie de um disco:
.
.
.
uma trilha um cilindro
(trilhas iguais)
setores
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 184
Discos magneticos (cont.)
Dados para um disco ctcio de 40 gigabytes:

10 cabecas leitoras/gravadoras

20.000 trilhas (2.000 por superfcie)

400 setores por trilha

512 bytes por setor (unidade mnima de endere camento)

tempo medio de busca da trilha endere cada (seek): S


(10 milissegundos)

tempo medio de latencia espera pelo setor enderecado: L


(10 milissegundos)

tempo de transferencia de dados: T (60 megabytes/segundo)

Estes tempos sao varias ordens de grandeza maiores do que tempo de


acesso `a memoria RAM (tipicamente 100.000 vezes).

N umero de acessos: altura da arvore log


2
n nao e mais aceitavel

Solucao: log
k
n, com k >> 2
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 185

Arvores B

Autores: Rudolf Bayer e Ed McCreight (1971)

T e uma arvore B de ordem b2 se:


1. todas as folhas de T tem o mesmo nvel;
2. cada no interno tem um n umero variavel r de registros de informacao e
r+1 de lhos, onde

b/2| r b se no ,= raiz
1 r b se no = raiz
3. cada folha tem um n umero variavel r de registros obedecendo `a mesma
restricao do item anterior;
4. os campos de informa cao contidos nos registros obedecem `a
propriedade de arvores de busca.

Alguns autores denem de maneira diferente o conceito de ordem.

Pode-se provar que a altura maxima h de uma arvore B de ordem b


que contem n registros e dada por:
log
b/2
(n + 1)/2.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 186
Exemplo de arvore B de ordem 3
Neste caso, cada no tem no mnimo um e no maximo tres registros de
informacao.
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 187
Exemplo de arvore B de ordem 5
Neste caso, cada no tem no mnimo dois e no maximo cinco registros de
informacao.
1 2 3 5 10 12 13 20 21 25 30 32 45 46 55 56 57 61 62 63 71 72 75 76 80
7 15 40 60 70
50
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 188
N umeros mnimos e maximos de registros

Arvore B de ordem 255:


mnimo maximo
nvel nos registros nos registros
1 1 1 1 1 255
2 2 2 127 256
1
256
1
255
3 2 128
1
2 128
1
127 256
2
256
2
255
4 2 128
2
2 128
2
127 256
3
256
3
255
5 2 128
3
2 128
3
127 256
4
256
4
255
Total 4.227.331 536.870.911 4.311.810.305 1.099.511.627.775
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 189
Exemplos de insercao
Insercao de 81:
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
3 5 20 35 48 51 80 81 85 150 205
17 50 83 203
125
Neste caso, foi feita insercao numa folha com espaco disponvel. Houve h
leituras e uma grava cao (h e a altura da arvore). O processo nao se
propaga.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 190
Exemplos de insercao (cont.)
Insercao de 33:
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
3 5 20 33 48 51 80 85 150 205
17 35 83 203
50 125
A capacidade de uma folha seria excedida e foi feita uma quebra que
propagou-se para cima. Haveria no maximo h leituras e 2h+1 grava coes
(se a raiz tambem fosse quebrada).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 191
Representacao de arvores B
#def i ne ORDEM 255
typedef s t r uc t NoArvB ArvB ;
typedef s t r uc t NoArvB {
i nt numregs ;
ArvB f i l h o s [ORDEM+1] ;
T i n f o [ORDEM] ;
} NoArvBi n ;
Esta representa cao sera usada para simular arvores B na memoria RAM.
Normalmente, arvores B sao implementadas em mem orias externas como
discos. O enderecamento em discos e usado em lugar de apontadores
comuns.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 192
Insercao em arvores B
A explicacao a seguir supoe que a inser cao e realizada por uma fun cao
recursiva auxiliar cujo cabe calho e:
Bool ean I ns er eRecAr vB ( ArvB p , ArvB s , T x , Bool ean pr op ) ;
onde

p: endereco da variavel que contem o apontador para a arvore

prop: endereco da variavel na qual e devolvida a informa cao que


indica se houve propagacao de insercao no retorno

x: endereco de uma variavel

numa chamada: contem o valor a ser inserido de algum tipo T


conveniente

no retorno, se houver propaga cao: contem o valor a ser propagado que


separa os valores das arvores apontadas por p e por s

s: endereco da variavel que contem o apontador para a arvore


propagada (se houver)

se nao houver propagacao numa chamada recursiva, o resto da arvore


nao sofre mudan ca
O valor devolvido pela funcao indica se a insercao foi efetivamente
realizada ou se o elemento x ja pertencia `a arvore.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 193
Insercao em arvores B (cont.)
Explicacao geral: caso de chamada recursiva sem propagacao no retorno
p x s prop: ? ?
p x s prop: false ? ?

Neste caso, nao havera mais modica coes na arvore.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 194
Insercao em arvores B (cont.)
Explicacao geral: caso de chamada recursiva com propagacao no retorno
p x s prop: ? ?
p x s
< >
prop: true

Neste caso, a modicacao devera ser propagada para cima. O valor da
variavel x foi inserido numa das duas arvores (ou e o ). Se p apontava
para a raiz da arvore, sera necessario criar uma nova raiz, com um unico
valor , e subarvores apontadas por p e s.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 195
Insercao em arvores B (cont.)
Caso 1: arvore vazia
p x s prop: ? ?
p x s prop: true
Neste caso, sao adotados valores das variaveis x, s e prop de maneira a
recair no caso geral de propaga cao.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 196
Insercao em arvores B (cont.)
Caso 2: insercao com espa co disponvel (r <b)
p
0 i1 i r1 b1
... ... x
i1 x
i
T
i
x s ? prop: ?
(insercao recursiva em T
i
)
p
0 i1 i r1 b1
... ... x
i1 x
i x s prop: true
p
0 i1 i r b1
... ... x
i1 x
i x s ? prop: false ?
Neste caso, o valor propagado apos a chamada recursiva e absorvido no no
corrente e a propagacao para.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 197
Insercao em arvores B (cont.)
Caso 3: insercao sem espa co disponvel (r =b)
p
0 i1 i b1
... ... x
i1 x
i
T
i
x
b1 x s ? prop: ?
(insercao recursiva em T
i
)
p
0 i1 i b1
... ... x
i1 x
i
x
b1 x s prop: true
p
0 i1 i b1
... ... x
i1 x
i
x
b1 x s ? prop: ? ?
b
Neste caso, o valor propagado apos a chamada recursiva nao pode ser
absorvido pois o no teria que ser aumentado alem da capacidade maxima;
continua com quebra do no (o espaco extra e apenas conceitual).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 198
Insercao em arvores B (cont.)
Caso 3: insercao sem espa co disponvel quebra do no
p
0 i1 i b1
... ... x
i1 x
i
x
b1 x s ? prop: ? ?
b
(equivalente)
p
0 k b1
... ... y
k
y
b x s ? prop: ? ?
T
k
T
k+1
T
b+1
b
p
0 k b1
y
k1
T
k
x s
prop: true
y
k
0 bk b1
T
k+1
T
b+1
y
k+1
O no corrente e quebrado em dois; o primeiro (no original apontado por p)
retem k = ,b/2|+1 primeiros registros; o k-esimo elemento e um novo no
com bk registros restantes sao propagados de volta.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 199
Funcao de insercao auxiliar (esboco)
Bool ean I ns er eRecAr vB ( ArvB p , ArvB s , T x , Bool ean pr op ) {
i nt i ; Bool ean i n s e r i u ;
i f ( p==NULL) {
pr op = t r ue ; s = NULL; r et ur n t r ue ;
}
i = I ndi ceAr vB ( p , x ) ; // l o c a l i z a o ponto de i n s e r c a o
i f ( ( i <((p)>numregs ) ) && ( x==((p)>i n f o ) [ i ] ) ) {
pr op = f a l s e ; r et ur n f a l s e ;
}
i n s e r i u = I ns er eRecAr vB (&((p)>f i l h o s [ i ] ) , s , x , pr op ) ;
i f ( pr op ) {
I ns e r e I nf o Ar v B ( p , s , x , i ) } ; // i n s e r e s e x no n o
( ( p)>numregs )++;
i f ( ( ( p)>numregs<=ORDEM) )
pr op = f a l s e ;
el s e {
QuebraNoArvB( p , s , x ) ; pr op = t r ue ; // quebr a
}
}
r et ur n i n s e r i u ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 200
Funcao de insercao inicial
Bool ean I ns e r e Ar vB ( ArvB p , T x ) {
/ Devol ve f a l s e s e o v a l o r de x j a oc or r e na a r v or e p /
Bool ean pr op ;
ArvB q , s ;
Bool ean i n s e r i u = I ns er eRecAr vB ( p,&s , x ,&pr op ) ;
i f ( pr op ) {
q = ( ArvB) mal l oc ( s i z e of ( NoArvB ) ) ;
q>numregs = 1;
( q>f i l h o s ) [ 0 ] = p ; ( q>f i l h o s ) [ 1 ] = s ;
( q>i n f o ) [ 0 ] = x ;
p = q ;
}
r et ur n i n s e r i u ;
}
O eventual aumento da altura da arvore se dara sempre nesta funcao.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 201
Exemplos de remocao
Remocao de 51:
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
3 5 20 35 48 80 85 150 205
17 50 83 203
125
Neste caso, foi feita remocao numa folha com n umero de registros acima
do mnimo. Houve h leituras e uma grava cao (h e a altura da arvore). O
processo nao se propaga.
Em todos os casos, a remo cao devera iniciar-se numa folha. Se necessario,
um elemento de um no interno devera ser substitudo convenientemente.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 202
Exemplos de remocao (cont.)
Remocao de 85:
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
3 5 20 35 48 51 83 150 205
17 50 80 203
125
Neste caso, foi feita remocao numa folha com n umero mnimo de
registros, e foi feito um emprestimo de um no irmao imediato com sobra
de registros. O emprestimo passa pelo no pai a m de manter a
propriedade de arvore de busca. Haveria no maximo h + 2 leituras e tres
gravacoes. O processo nao se propaga.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 203
Exemplos de remocao (cont.)
Remocao de 150:
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
3 5 20 35 48 51 80 85 203 205
17 50 125
83
Neste caso, foi feita remo cao numa folha com n umero mnimo de registros
e cujos irmaos tambem estao no mnimo. Foi feita entao uma juncao de
dois nos e includo o valor do no pai que os separa. A remo cao deste valor
do no pai seguira o mesmo esquema de remo coes, e podera se propagar
ate a raiz. Haveria no maximo 3h 2 leituras e 2h 1 gravacoes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 204
Observac oes

Verica-se facilmente que tanto no caso de quebras (insercao) como


no caso de juncoes (remocao), os nos resultantes preservam as
propriedades de arvores B.

O n umero de leituras e grava coes e sempre proporcional `a altura da


arvore.

O no raiz da arvore e normalmente guardado na memoria, diminuindo


o n umero de acessos ao disco.

De acordo com a deni cao das arvores B, a utliza cao mnima do


espaco dos nos e de cerca de 50%; pode-se provar que a utiliza cao
media e de cerca de 69%.

Usando tecnicas probabilsticas, pode-se mostrar que as operacoes


mais complicadas sao muito infrequentes.

A remocao pode ser implementada de maneira analoga `a insercao e


sera deixada para exerccio.

Uma arvore B inicial pode ser construda por insercoes sucessivas o


que seria muito ineciente; na pratica, utiliza-se um algoritmo direto.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 205
Variantes de arvores B


Arvores B

: o n umero de registros ocupados de um no e no mnimo


2
3
da sua capacidade.


Arvores B
+
:

nos internos com chaves apenas para orientar o percurso

pares (chave, valor) apenas nas folhas

regra de descida:

subarvore esquerda: menor

subarvore direita: maior ou igual

apontadores em lugar de valores tornando mais eciente a


movimentacao dos registros durante insercoes e remocoes

ligacoes facilitando percurso em ordem de chaves


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 206
Variantes de arvores B (cont.)
Exemplo de arvore B
+
de ordem 3:
4 6 8 11 12 14 15 18 20 23 25 26 29 35
11 15 26
23
Setas tracejadas indicam apontadores para os valores da informa cao. A
lista ligada das folhas permite percurso simples e eciente em ordem de
chaves.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores do tipo B 207
Filas de prioridade
(Priority queues)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 208
Denicao e propriedades

Uma la de prioridade e uma arvore binaria com as propriedades:

a arvore e completa ou quase completa;

em cada no da arvore, o valor da chave e maior ou igual aos valores


das chaves dos lhos (e consequentemente, de todos os descendentes).

Uma la de prioridade nao e uma arvore de busca!

A determinacao do elemento maximo de uma la de prioridade pode


ser feita em tempo constante (esta na raiz).

As operacoes de insercao e de remocao podem ser realizadas em


tempo proporcional `a altura (O(log n)).

Filas de prioridade podem ser implementadas ecientemente de


maneira sequencial.

Em algumas aplica coes e conveniente utilizar las de prioridade em


que um elemento e menor ou igual a todos os seus descendentes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 209
Exemplo
0
95
1
88
2
75
3
30
4
45
5
40
6
38
7
15
8
10
9
23
Implementacao sequencial (heap):
95
0
88
1
75
2
30
3
45
4
40
5
38
6
15
7
10
8
23
9
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 210
Operacao de subida
Supondo que, exceto pelo ultimo elemento, a arvore e uma la de
prioridade, a opera cao torna a arvore inteira uma la valida.
0
95
1
88
2
75
3
30
4
45
5
40
6
38
7
15
8
10
9
23
10
90
0
95
1
90
2
75
3
30
4
88
5
40
6
38
7
15
8
10
9
23
10
45
Setas duplas indicam as operacoes de troca a serem realizadas.
Obviamente, o n umero de operacoes de troca executadas e, no maximo,
igual `a altura da arvore original (log
2
n).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 211
Operacao de descida
Supondo que, exceto por um unico valor que nao e maior ou igual do que
seus descendentes, a arvore e uma la de prioridade, a opera cao torna a
arvore inteira uma la valida.
0
95
1
13
2
75
3
30
4
88
5
40
6
38
7
15
8
10
9
23
0
95
1
88
2
75
3
30
4
23
5
40
6
38
7
15
8
10
9
13
Setas duplas indicam as operacoes de troca a serem realizadas.
Obviamente, o n umero de operacoes de troca executadas e menor do que
a altura da arvore original (log
2
n).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 212
Implementacao das operac oes
#def i ne TAM MAX 50
typedef s t r uc t {
T v e t or [TAM MAX] ;
i nt tam ;
} Heap ;
voi d Sobe ( Heap h , i nt m) {
i nt j = (m1)/2;
T x = (h ) . v e t or [m] ;
whi l e ( (m>0) && ( ( h ) . v e t or [ j ]<x ) ) {
(h ) . v e t or [m] = (h ) . v e t or [ j ] ;
m = j ;
j = ( j 1)/2;
}
(h ) . v e t or [m] = x ;
} / Sobe /
Note-se que as operacoes de troca foram otimizadas com a utiliza cao da
variavel temporaria x.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 213
Implementacao das operac oes (cont.)
voi d Desce ( Heap h , i nt m) {
i nt k = 2m+1;
T x = (h ) . v e t or [m] ;
whi l e ( k<(h ) . tam) {
i f ( ( k<((h ) . tam)1) && ( ( h ) . v e t or [ k] <(h ) . v e t or [ k +1] ))
k++;
i f ( x<(h ) . v e t or [ k ] ) {
(h ) . v e t or [m] = (h ) . v e t or [ k ] ;
m = k ;
k = 2k+1;
} el s e
break ;
}
(h ) . v e t or [m] = x ;
} / Desce /
Tambem neste caso, as opera coes de troca foram otimizadas.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 214
Construcao inicial
Dado um vetor com elementos em ordem arbitraria, deve-se transforma-lo
numa la de prioridade:
voi d Cons t r oi Heap1 ( Heap h) {
i nt i ;
f or ( i =1; i <(h ) . tam ; i ++)
Sobe ( h , i ) ;
} / Cons t r oi Heap1 /
voi d Cons t r oi Heap2 ( Heap h) {
i nt i ;
f or ( i =((h ) . tam2)/2; i >=0; i )
Desce ( h , i ) ;
} / Cons t r oi Heap2 /
Verica-se facilmente que a eciencia da funcao ConstroiHeap1 e
O(nlog n). Pode-se demonstrar, tambem, que a eciencia de
ConstroiHeap2 e O(n) (linear).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 215
Insercao e remocao
voi d I ns er eHeap ( Heap h , T x ) {
v e t or [ ( h ) . tam] = x ;
( ( h ) . tam)++;
Sobe ( h , ( ( h ) . tam) 1);
} / I ns er eHeap /
voi d RemoveHeap ( Heap h , T x ) {
x = (h ) . v e t or [ 0 ] ;
( ( h ) . tam);
(h ) . v e t or [ 0 ] =
(h ) . v e t or [ ( h ) . tam ] ;
Desce ( h , 0 ) ;
} / RemoveHeap /
Note-se que a funcao RemoveHeap remove e devolve na variavel x o
elemento maximo da la. Obviamente, as duas funcoes realizam no
maximo O(nlog n) opera coes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 216
Algoritmo de ordenacao Heapsort
O algoritmo constroi um heap inicial. Em seguida, remove um a um o
elemento maximo e o coloca na posi cao nal do vetor.
voi d HeapSort ( Heap h) {
i nt i , n = (h ) . tam ;
/ c o n s t r o i heap /
f or ( i =(n2)/2; i >=0; i )
Desce ( h , i ) ;
/ or dena /
f or ( i =n1; i >0; i ) {
T t = (h ) . v e t or [ 0 ] ;
(h ) . v e t or [ 0 ] = (h ) . v e t or [ i ] ;
(h ) . v e t or [ i ] = t ;
(h ) . tam;
Desce ( h , 0 ) ;
}
(h ) . tam = n ;
} / HeapSort /
N umero de operacoes: O(nlog n) (um dos algoritmos otimos).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Filas de prioridade 217

Arvores gerais
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 218
Exemplo de arvore geral
A
B
F G
C
H
D E
I
L
J K

arvores gerais nunca sao vazias

as subarvores sao ordenadas: primeira, segunda, etc

o n umero de subarvores pode ser qualquer, inclusive zero

conceitos naturais: grau, lhos, pai, descendente, altura, etc


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 219
Representacao de arvores gerais
#def i ne GRAU MAX 10
typedef s t r uc t
NoAr vGer al Ar vGer al ;
typedef s t r uc t NoAr vGer al {
T i n f o ;
i nt gr au ;
Ar vGer al f i l h o s [ GRAU MAX] ;
} NoAr vGer al ;
. . .
p = mal l oc ( s i z e of ( NoAr vGer al ) ) ;
. . .
typedef s t r uc t
NoAr vGer al Ar vGer al ;
typedef s t r uc t NoAr vGer al {
T i n f o ;
i nt gr au ;
Ar vGer al f i l h o s [ 1 ] ;
} NoAr vGer al ;
. . .
p = mal l oc ( s i z e of ( NoAr vGer al )+
( grau 1) s i z e of ( Ar vGer al ) ) ;
. . .
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 220
Florestas
Uma oresta e uma sequencia, possivelmente vazia, de arvores gerais.
Exemplo:
A
D
J
E
K L
F G
M
B C
H I
N O
Q
P
Note-se que as subarvores de um no de uma arvore geral constituem uma
oresta.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 221
Floresta representada como arvore binaria
A
D
J
E
K L
F G
M
B C
H I
N O
Q
P

o campo esquerdo aponta para a raiz da primeira subarvore original

o campo direito aponta para o no irmao seguinte

as razes das arvores da oresta sao consideradas irmas.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 222
Floresta representada como arvore binaria (cont.)

A arvore binaria B(F) que representa uma oresta


F = (T
1
, T
2
, . . . , T
m
) e denida por:

arvore binaria vazia se F e uma oresta vazia (m = 0);

arvore binaria cuja raiz contem a mesma informa cao da raiz de T


1
; cuja
subarvore esquerda e dada por B((T
11
, T
12
, . . . , T
1m1
)) onde
(T
11
, T
12
, . . . , T
1m1
) e a oresta das subarvores de T
1
; e cuja subarvore
direita e dada por B((T
2
, . . . , T
m
)).

Conclui-se facilmente que toda oresta tem uma unica representacao


binaria.

A implementacao de arvores binarias e mais simples.

Exerccio: denir a transformacao contraria F(T) que obtem a


oresta a partir da arvore binaria T que a representa.

Exerccio: vericar se toda arvore binaria representa uma oresta.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 223
Percursos em profundidade de orestas
Os percursos de uma oresta F = (T
1
, T
2
, . . . , T
m
) sao denidos por:

Pre-ordem de orestas:
Visitar a raiz de T
1
Percorrer a oresta F
1
em pre-ordem de orestas
Percorrer a oresta (T
2
, . . . , T
m
) em pre-ordem de
orestas

Pos-ordem de orestas:
Percorrer a oresta F
1
em pos-ordem de orestas
Percorrer a oresta (T
2
, . . . , T
m
) em pos-ordem de
orestas
Visitar a raiz de T
1

Inordem de orestas:
Percorrer a oresta F
1
em inordem de orestas
Visitar a raiz de T
1
Percorrer a oresta (T
2
, . . . , T
m
) em inordem de orestas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 224
Percursos em profundidade de orestas (cont.)
A
D
J
E
K L
F G
M
B C
H I
N O
Q
P
Pre-ordem: A,D,J,E,K,L,F,G,M,B,C,H,I,N,O,Q,P
Pos-ordem: J,L,K,M,G,F,E,D,Q,P,O,N,I,H,C,B,A
Inordem: J,D,K,L,E,F,M,G,A,B,H,N,Q,O,P,I,C
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 225
Percursos em profundidade de orestas (cont.)
Propriedades:

percurso de uma oresta F produz o mesmo resultado que o percurso


(binario) correspondente da arvore B(F).

pre-ordem de orestas e semelhante `a pre-ordem de arvores binarias

inordem de orestas e semelhante `a pos-ordem de arvores binarias

pos-ordem de orestas nao tem uma interpreta cao natural


Desao:
Elabore um algoritmo para percurso em largura de arvores gerais sob
representacao binaria.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores gerais 226

Arvores digitais
(Tries)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 227
Conjuntos de cadeias de caracteres
Exemplo:
a at from his no
an be had i not
and but have in of
are by he is on
as for her it or
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 228

Arvore digital
a at from his no
an be had i not
and but have in of
are by he is on
as for her it or
a b f h i n o
n r s t e u y o r a e i n s t o f n r
d e t r o d v r s t
m e

Arestas sao rotuladas com as letras das palavras.

Nos cheios indicam o m de uma cadeia.

Sao fatorados os prexos comuns das cadeias.

N umeros para o exemplo:

39 nos

20 folhas

19 nos internos (nao folhas)

25 nos cheios (25 palavras)


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 229
Implementacao de arvores digitais
a b c y z
. . .

Algoritmos de busca, insercao e remo cao obvios (exerccio).

Uso de memoria:

39 26 = 1014 campos apontadores

38 campos sao nao nulos

Eliminando apontadores das folhas:

19 26 = 494 campos apontadores

38 campos sao nao nulos

Existem alternativas mais economicas para representar os nos.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 230

Arvore digital com subcadeias


a at from his no
an be had i not
and but have in of
are by he is on
as for her it or
d
re s s e ut y or rom
d ve r
is n s t
t
f n r
a b f h i n o
n r s t e u y o r a e i n s t o f n r
d d v r t

Uso de memoria:

12 26 = 312 campos apontadores

31 campos sao nao nulos


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 231
Aut omato nito minimal acclico
Exemplo: as 15 formas dos verbos ingleses: do, redo e undo
do redo undo
does redoes undoes
did redid undid
doing redoing undoing
done redone undone
r e d o i n g
u n
i
n
e
d
d
s
e

Sao fatorados tanto os prexos quanto os suxos comuns das cadeias.

Algoritmo de busca igual ao de arvores digitais.

Algoritmos de insercao e de remo cao muito mais complicados.

Uso de memoria:

11 26 = 286 campos apontadores (nos internos)

16 campos sao nao nulos

Se fosse arvore digital:

26 26 = 676 campos apontadores (nos internos)

37 campos seriam nao nulos

As estruturas para um exemplo analogo em portugues seriam maiores


(mais de 50 formas verbais) mas resultariam em muito mais economia.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao

Arvores digitais 232
Listas generalizadas
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 233
Conceito e exemplos

Um atomo e um inteiro ou uma cadeia de caracteres.

Uma lista generalizada e uma sequencia:


(
1
,
2
, . . . ,
n
)
onde
i
denota um atomo ou uma lista generalizada (denicao
recursiva).

Exemplos de listas:
A: ((4,7),(4,7,(8)))
B: ((1,4),(7,8))
C: (3,B,B)
D: (5,8,D)
E: ()

As listas A, B, C, D e E tem, respectivamente, 2, 2, 3, 3 e 0


elementos.

A denicao de atomo poderia ser estendida para outros tipos de


valores.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 234
Expansao de listas
A: ((4,7),(4,7,(8)))
B: ((1,4),(7,8))
C: (3,B,B)
D: (5,8,D)
E: ()
As listas C e D podem ser expandidas com as denicoes correspondentes:
C: (3,((1,4),(7,8)),((1,4),(7,8)))
D: (5,8,(5,8,(5,8,(...))))
A lista D tem tres elementos, mas inclui um n umero innito de inteiros,
por ser recursiva.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 235
Implementacao compartilhada
A: ((4,7),(4,7,(8)))
B: ((1,4),(7,8))
C: (3,B,B)
D: (5,8,D)
E: ()
A:
4 7
4 7 8
B:
7 8
1 4
C: 3
D: 5 8
E:
NULL
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 236
Implementacao com c opia
A: ((4,7),(4,7,(8)))
B: ((1,4),(7,8))
C: (3,B,B)
D: (5,8,D)
E: ()
B: 7 8
1 4
C:
3
7 8
1 4
7 8
1 4
D:
5 8
5 8
5 8
. . .

Nao e possvel completar a expansao da lista D.

As representa coes das listas A, B e E nao mudam.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 237
Representacao de listas generalizadas
typedef s t r uc t RegLi s t aGen Li s t aGen ;
typedef s t r uc t RegLi s t aGen {
Li s t aGen pr ox ;
Bool ean eAtomo ;
uni on {
i nt atomo ; / eAtomo v e r d a d e i r o /
Li s t aGen l i s t a ; / eAtomo f a l s o /
} i n f o ;
} RegLi s t aGen ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 238
Exemplo de manipulacao
Funcao de contagem de atomos:
i nt ContaAtomos ( Li s t aGen p) {
i nt s = 0;
whi l e ( p!=NULL) {
i f ( p>eAtomo )
s++;
el s e
s += ContaAtomos ( p>i n f o . l i s t a ) ;
p = p>pr ox ;
}
r et ur n s ;
} / ContaAtomos /
Problemas com compartilhamento:

contagem repetida (caso da lista C); pode ser intencional

repeti cao innita (caso da lista D)


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 239
Representacao alternativa
typedef s t r uc t RegLi s t aGen Li s t aGen ;
typedef s t r uc t RegLi s t aGen {
Bool ean v i s i t a d o ; / i n i c i a l me n t e f a l s o /
Li s t aGen pr ox ;
Bool ean eAtomo ;
uni on {
i nt atomo ; / eAtomo v e r d a d e i r o /
Li s t aGen l i s t a ; / eAtomo f a l s o /
} i n f o ;
} RegLi s t aGen ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 240
Exemplo de manipulacao
Funcao geral de contagem de atomos:
i nt ContaAtomos ( Li s t aGen p) {
i nt s = 0;
whi l e ( ( p!=NULL) && ! ( p>v i s i t a d o ) ) {
p>v i s i t a d o = t r ue ;
i f ( p>eAtomo )
s++;
el s e
s += ContaAtomos ( p>i n f o . l i s t a ) ;
p = p>pr ox ;
}
r et ur n s ;
} / ContaAtomos /
Problema: restauracao dos valores do campo visitado para o proximo
percurso.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 241
Exemplo de aplicacao
Manipula cao de polinomios em m ultiplas variaveis:
P(x, y, z) = x
10
y
3
z
2
+ 2x
8
y
3
z
2
+ 3x
8
y
2
z
2
+x
4
y
4
z 6x
3
y
4
z + 2yz
Representacao possvel para cada termo:
coef x y z

Problema: muito inexvel, somente para polinomios em tres variaveis.

Alternativa: um polinomio em k1 variaveis pode ser considerado


um polinomio em uma variavel, com coecientes que sao polinomios
em k1 variaveis, etc:
P(x, y, z) = ((x
10
+ 2x
8
)y
3
+ 3x
8
y
2
)z
2
+ ((x
4
6x
3
)y
4
+ 2x
0
y)z
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 242
Representacao de polin omios
((x
10
+ 2x
8
)y
3
+ 3x
8
y
2
)z
2
+ ((x
4
6x
3
)y
4
+ 2x
0
y)z
Alternativa 1: representa cao uniforme em todos os nveis:
z 2 1
y 4 1
x 0 2
x 4 3 1 6
y 3 2
x 8 3
x 10 8 1 2
Note-se que o termo 2x
0
y e representado de maneira completa. Esta
representacao torna os algoritmos mais simples.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 243
Representacao de polin omios (cont.)
((x
10
+ 2x
8
)y
3
+ 3x
8
y
2
)z
2
+ ((x
4
6x
3
)y
4
+ 2x
0
y)z
Alternativa 2: representa cao que elimina polinomios degenerados
z 2 1
y 4 1
x 0 2
2
x 4 3 1 6
y 3 2
x 8 3
x 10 8 1 2
Note-se que o termo 2x
0
y e representado como 2y. Esta representacao
economiza memoria (retangulo tracejado).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 244
Declaracao de tipo
typedef s t r uc t Termo ApTermo ;
typedef ApTermo Pol i nomi o ;
typedef s t r uc t Termo {
Pol i nomi o pr ox ;
Bool ean eCabeca ;
uni on {
char v a r i a v e l ; / s e e cabe ca /
s t r uc t { / s e e termo /
i nt expoent e ;
Bool ean c o e f I n t e i r o ;
uni on {
i nt c o e f I n t ;
Pol i nomi o c o e f Po l i n ;
} c oe f ;
} termo ;
} no ;
} Termo ;
Exerccio: escrever as funcoes de soma e de multiplica cao para polinomios
em m ultiplas variaveis.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 245
LISP: uma linguagem para processamento de listas

Programas sao expressos como listas.

Dados sao atomos e listas.

Aplicacoes:

inteligencia articial

scripts para Emacs

scripts para AutoCAD

...
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 246
LISP (cont.)
Exemplo 1: fun cao fatorial
( defun f a t o r i a l ( n)
( cond ( l e q n 1)
1
( mul t n ( f a t o r i a l ( mi nus n 1) ) )
)
)

A expressao: (fatorial 5) produz: 120.

Deve-se notar o uso de notacao pre-xa.

As implementacoes comuns de LISP permitem o uso de smbolos de


opera coes como <=, + e em lugar de atomos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 247
LISP (cont.)
Exemplo 2: concatena cao e inversao de listas
( defun concat ( p q)
( cond ( nul l p)
q
( cons ( c ar p) ( concat ( cdr p) q ) )
)
)
( defun i n v e r t e ( p)
( cond ( nul l p)
n i l
( concat ( i n v e r t e ( cdr p ) ) ( c ar p ) )
)
)

A expressao: (inverte (A B C D)) produz D C B A.

A expressao (car L) devolve o primeiro elemento da lista L.

A expressao (cdr L) devolve a lista L sem o primeiro elemento.

A operacao (cons x L) devolve a lista L com o elemento x inserido


na frente da lista.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Listas generalizadas 248
Espalhamento
(Hashing ou scattering)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 249
Tabelas de espalhamento
Exemplo de tabela com b=7 linhas e s=3 colunas:
1 2 3
0
1
2
f(jo~ao) 3 jo~ao
4
5
6
Supoe-se, neste caso, que:

a funcao de espalhamento f produz resultados entre 0 e 6

f(jo~ao) = 3

existem no maximo tres valores (s) a serem inseridos que produzem o


mesmo valor da funcao f.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 250
Tabelas de espalhamento (cont.)
Exemplo de tabela com b=26 linhas e s=2 colunas:
1 2
0 ant^onio atila
1
2 carlos celio
3 douglas
4 ernesto est^ev~ao
5

24
25 zoroastro
Foi usada uma funcao (muito ingenua!) de espalhamento: ndice da
primeira letra (a: 0, b: 1, ...).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 251
Virtudes e poblemas

Virtudes

simplicidade

busca muito rapida (se a funcao de espalhamento for eciente)

Problemas

escolha da fun cao de espalhamento

tratamento de colisoes

tratamento de estouro da tabela


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 252
Construcao de func oes de espalhamento

Propriedades desejaveis:

eciencia de calculo

bom espalhamento

Tecnicas:

espalhamento mnimo perfeito

espalhamento pseudo-aleatorio: combina cao de varias tecnicas


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 253
Construcao de func oes de espalhamento (cont.)
Divisao

O nome, tratado como um n umero na base 26, e dividido por um


n umero p relativamente primo f(x) = x mod p; p sera adotado como
o n umero de linhas da tabela.

Para p = 51 teramos:
f(carlos) = ( ((((2 26 + 0) 26 + 17) 26 + 11)
26 + 14) 26 + 18 ) mod 51
= 24.069.362 mod 51 = 14

Na realidade, o calculo pode ser simplicado, com a operacao mod


aplicada a cada passo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 254
Construcao de func oes de espalhamento (cont.)
Selecao de algarismos e meio-do-quadrado

O nome e tratado como uma sequencia de algarismos ou de bytes ou


de bits, e uma subsequencia e selecionada para representar o ndice.

Por exemplo, suponhamos que todos os nomes sao representados


como a sequencia de dgitos x = d
0
d
1
d
11
em alguma base
conveniente; uma escolha seria f(x) = d
3
d
5
d
9
.

Exemplo: a representacao de carlos poderia ser 020017111418.


Supusemos que cada letra e indicada por dois dgitos que indicam a
posi cao no alfabeto, ou seja 00 para a, 01 para b, etc. Teramos
entao f(carlos) = 074.

Frequentemente, antes de fazer a selecao, e calculado o quadrado do


identicador (tratado como n umero); e o metodo
meio-do-quadrado (mid-square).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 255
Construcao de func oes de espalhamento (cont.)
Dobramento (folding)

O nome e tratado como uma sequencia de algarismos ou de bytes ou


de bits, e algumas subsequencias sao combinadas por operacoes
convenientes para produzir um ndice.

Por exemplo, suponhamos que todos os nomes sao representados


como uma sequencia de bits x = b
0
b
1
b
2
b
3
b
4
; uma escolha seria:
f(x) = b
0
b
1
b
2
b
3
b
4
b
5
b
6
b
7
b
8
b
9
b
10
b
11

onde denota a operacao de ou exclusivo bit a bit.

Exemplo: a representacao de carlos usada anteriormente poderia


ser (com cinco bits para cada n umero):
00010 00000 10001 01011 01110 10010
produzindo a sequencia de bits: 000100000010001010110111010010 e
o resultado:
f(000100000010001010110111010010) =
000100000010001010110111010010 = 101001 = 41
10
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 256
Tratamento de colisoes: endere camento aberto

Busca sistematica de outras entradas disponveis na tabela:

reespalhamento linear

reespalhamento quadratico

reespalhamento duplo

Em todos os casos, os algoritmos de busca, inser cao e remocao


deverao ser coerentes.

Exemplos usam: ant^onio, carlos, douglas, celio, armando,


zoroastro, atila, alfredo (nesta ordem).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 257
Reespalhamento linear
ant^onio, carlos, douglas, celio, armando, zoroastro, atila, alfredo
Usando (f(x) +i) modb, (i = 0, 1, ), procura a primeira posicao livre.
0 ant^onio
1 armando
2 carlos
3 douglas
4 celio
5 atila
6 alfredo
7

25 zoroastro
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 258
Reespalhamento quadratico
ant^onio, carlos, douglas, celio, armando, zoroastro, atila, alfredo
Usando (f(x) +i
2
) modb, (i = 0, 1, ), procura a primeira posicao livre.
0 ant^onio
1 armando
2 carlos
3 douglas
4 atila
5
6 celio
7
8
9 alfredo

25 zoroastro
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 259
Reespalhamento duplo
ant^onio, carlos, douglas, celio, armando, zoroastro, atila, alfredo

Usando (f(x) +i g(x)) modb, (i = 0, 1, ) procura a primeira


posi cao livre.

g(x) e a funcao de reespalhamento;


por exemplo, g(x) = (c mod3) + 1
onde c e a segunda letra.
0 ant^onio
1
2 carlos
3 douglas
4 celio
5
6 armando
7
8 atila
9 alfredo

25 zoroastro
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 260
Remocao

Lapides (tombstones):

entradas que indicam posi coes ocupadas para ns de busca, mas livres
para ns de insercao.

podem ser usadas com qualquer esquema de espalhamento

Exemplo: remo cao da entrada armando (tabela com reespalhamento


linear):
0 ant^onio
1 armando
2 carlos
3 douglas
4 celio
5 atila
6 alfredo
7

25 zoroastro
0 ant^onio
1 ++++++++
2 carlos
3 douglas
4 celio
5 atila
6 alfredo
7

25 zoroastro
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 261
Eciencia com enderecamento aberto

N umero medio de comparacoes para encontrar um elemento:


C(n) = (2 )/(2 2)
onde:

= n/b (fator de carga, 0 1)

n e o n umero de entradas

b e o tamanho da tabela

Exemplo de tabela com 1000 entradas:


n C(n)
100 1,06
200 1,13
300 1,21
400 1,33
500 1,50
600 1,75
700 2,17
800 3,00
900 5,50
950 10,5
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 262
Tratamento de colisoes: listas ligadas
Tecnica de encadeamento (chaining): utiliza listas ligadas para manter
entradas com o mesmo valor da funcao de espalhamento.
Exemplo:
ant^onio, carlos, douglas, celio, armando, zoroastro, atila, alfredo
0
1
2
3
4
5
25
. . .
antonio
carlos
douglas
celio carlos
armando antonio
zoroastro
atila armando antonio alfredo atila armando antonio
As listas poderiam ser ordenadas.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 263
Eciencia com encadeamento

N umero medio de comparacoes para encontrar um elemento:


C(n) = 1 +/2
onde:

= n/b (fator de carga, > 0)

n e o n umero de entradas

b e o tamanho da tabela

Exemplo de tabela com 1000 entradas:


n C(n)
100 1,05
200 1,10
400 1,20
500 1,25
1000 1,50
2000 2,00
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Espalhamento 264
Compressao de textos
(Codica cao de Human)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 265
Compressao de textos

Objetivos:

economia de espa co

velocidade de transmissao

Representacao normal: um byte (8 bits) por caractere (alfabetos


comuns)

Compressao por contagem (run-length encoding)

Codica cao de Human

Algoritmos de codica cao aritmetica (Lempel-Ziv zip, gzip, winzip,


et.)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 266
Codicacao de Human

Explora frequencias de ocorrencia de caracteres

Exemplo de alfabeto: / = a, b, c, d, e, f
a b c d e f
frequencia de cada letra 45 13 12 16 9 5
codica cao usando 3 bits 000 001 010 011 100 101
codica cao de tamanho variavel 0 101 100 111 1101 1100

Para um arquivo de 100.000 caracteres:

codica cao xa: 300.000 bits

codica cao variavel: 224.000 bits (economia de 25%)


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 267

Arvores binarias de codica cao


Codica cao xa a: 000 b: 001 c: 010 d: 011 e: 100 f: 101
100
86
58
a:45 b:13
28
c:12 d:16
14
14
e:9 f:5
0 1
0 1 0
0 1 0 1 0 1

Os rotulos das arestas da raiz ate uma folha compoem o codigo da


letra correspondente.

Para obter o codigo de uma letra, e necessario percorrer a arvore


partindo da folha correspondente ate a raiz.

Exemplo: abc = 000|001|010 = 000001010.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 268

Arvores binarias de codica cao (cont.)


Codica cao variavel a: 0 b: 101 c: 100 d: 111 e: 1101 f: 1100
100
a:45 55
25
c:12 b:13
30
14
f:5 e:9
d:16
0 1
0 1
0 1 0 1
0 1

O codigo de uma letra nao pode constituir um prexo de uma outra


letra.

Exemplo: abc = 0|101|100 = 0101100.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 269
Construcao da arvore de Human

Algoritmo (guloso):
1. Construa uma oresta de folhas, cada uma correspondendo a um
caractere, com a respectiva frequencia como seu peso.
2. Enquanto a oresta tiver mais de uma arvore, repita:

procure na oresta duas arvores t1 e t2 de menor peso

construa uma nova arvore binaria t, com subarvores t1 e t2, e com peso
que e a soma dos pesos das duas subarvores

remova t1 e t2 da oresta, e insira t.

A solucao nao e unica (pode haver varias escolhas de peso mnimo),


mas todos os resultados sao equivalentes quanto `a eciencia de
compressao.

Se o alfabeto for razoavelmente grande, pode-se utilizar uma la de


prioridade para selecionar, em cada passo, duas arvores de menor
peso.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 270
Construcao da arvore de Human (cont.)
Exemplo:
a:45 b:13 c:12 d:16 e:9 f:5
a:45 b:13 c:12 d:16 14
f:5 e:9
a:45 d:16 14
f:5 e:9
25
c:12 b:13
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 271
Construcao da arvore de Human (cont.)
a:45 d:16 14
f:5 e:9
25
c:12 b:13
a:45 25
c:12 b:13
30
14
f:5 e:9
d:16
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 272
Construcao da arvore de Human (cont.)
a:45 25
c:12 b:13
30
14
f:5 e:9
d:16
a:45 55
25
c:12 b:13
30
14
f:5 e:9
d:16
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 273
Construcao da arvore de Human (cont.)
a:45 55
25
c:12 b:13
30
14
f:5 e:9
d:16
100
a:45 55
25
c:12 b:13
30
14
f:5 e:9
d:16
0 1
0 1
0 1 0 1
0 1
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 274
Observac oes

Adotadas certas hipoteses, demonstra-se a otimalidade de compressao

Algoritmo de compressao: para cada letra, deve acessar a folha


correspondente da arvore e reconstruir o caminho `a raiz pode ser
preprocessado

Algoritmo de descompressao: percorre a arvore a partir da raiz


seguindo o caminho indicado por bits da codicacao

Variantes:

arvore xa, por exemplo, uma para cada lngua

arvore por texto (acompanha o arquivo)

arvores dinamicas (Faller, Gallager e Knuth).


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Compressao de textos 275
Gerenciamento de memoria
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 276
Gerenciamento de mem oria
Varios aspectos:

aloca cao com e sem disciplina de pilha

caractersticas da linguagem de programa cao

registros de tamanho xo ou variavel

gerenciamento explcito (malloc e free)

gerenciamento implcito (coleta de lixo e contagem de referencias)

gerenciamento misto
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 277
Gerenciamento explcito
Congura cao generica da memoria:
disp
m
Livre:
? m
Em uso:
Congura cao inicial:
M
disp

A variavel disp (memoria disponvel) e global.

A lista das areas livres e ordenada pelo valor dos apontadores.

M denota o tamanho da area livre inicial; m de uma area livre ou em


uso.

A funcao de alocacao devolve o apontador para o primeiro byte livre


da area.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 278
Gerenciamento explcito (cont.)
Uma versao muito simples de malloc(n) (f e o tamanho da parte xa de
cada area apontador mais o campo de tamanho):
1. procure na lista disp o primeiro elemento (ou o elemento de tamanho
mnimo) p com tamanhon+f
2. remova p da lista disp
3. quebre a area apontada por p em duas partes: uma p
1
de tamanho
n +f e outra p
2
com o que sobrar (se houver sobra suciente)
4. insira p
2
na lista disp (se existir)
5. devolva p
1
+f
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 279
Gerenciamento explcito (cont.)
Uma versao muito simples de free(p):
1. procure na lista disp o ponto de inser cao para p (ordem crescente dos
apontadores)
2. verique se o predecessor e/ou sucessor de p neste ponto sao
adjacentes `a area apontada por p
3. se for possvel, junte a area liberada `a predecessora e/ou `a sucessora,
modicando os campos de tamanho
4. atualize a lista
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 280
Gerenciamento explcito (cont.)
Problemas:

O que fazer quando malloc nao acha uma area de tamano suciente
requer outra area ao sistema operacional

Fragmentacao apos varias aloca coes e liberacoes, com tamanhos


variaveis, havera tendencia a produzir muitas area livres pequenas

Busca numa lista ligada pode ser ineciente

Algumas solucoes:

blocos com marcas de fronteira (boundary tags)

sistema de blocos conjugados (buddy system)


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 281
Marcas de fronteira
t t m
Livre:
f f m
Em uso:

As areas livres constituem uma lista duplamente ligada.

m denota o tamanho da area.

t e f denotam os valores booleanos que indicam se a area e livre.

A funcao de alocacao devolve o apontador para o primeiro byte livre


da area.

Nao e necessario fazer uma busca na lista para encontrar as areas


vizinhas.

Exerccio: esbocar a implementa cao das funcoes malloc e free.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 282
Sistema de blocos conjugados
0-15
0-1
0-3
0-1 2-3
4-7
4-5 6-7
8-15
8-11
8-9 10-11
12-15
12-13 14-15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
k=4
k=3
k=2
k=1
k=0

Uma arvore binaria imaginaria em que cada no representa um bloco


de alocacao.

Cada folha da arvore representa um bloco mnimo de aloca cao.

Cada nvel k da arvore (a partir das folhas) representa a aloca cao de


uma area constituda de 2
k
blocos mnimos.


Areas conjugadas (irmas) facilmente reconhecidos pelos ndices sob
forma binaria.

O exemplo exibe a arvore para uma memoria de 2


4
=16 blocos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 283
Sistema de blocos conjugados (cont.)

Formato das areas:


t k
Livre:
f k
Em uso:

t e f denotam os valores booleanos que indicam se a area e livre.

k indica que o tamanho da area e 2


k
.

Para cada valor de k, existe uma lista duplamente ligada disp[k] de


blocos livres de tamanho 2
k
.

A funcao de alocacao devolve o apontador para o primeiro byte livre


da area.

Dado o n umero do bloco inicial de uma area (em binario) de tamanho


2
k
, o n umero da area conjugada e determinado complementando o
k-esimo bit (a partir da direita); exemplo de bloco 12 para k=2:
12
10
=1100
2
= 1000
2
=8
10
Portanto, a area conjugada de quatro blocos tem incio no bloco 8.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 284
Sistema de blocos conjugados (cont.)
Esbo co da funcao malloc(n) (f e o tamanho da parte xa de cada area
marca de uso, tamanho):
1. procure um k tal que 2
k
n +f, e a lista de blocos para k nao esta
vazia; remova desta lista uma area p
2. se 2
k1
n +f, quebre a area p em duas (conjugadas), acerte os
tamanhos e insira uma delas na lista de areas para tamanho k 1
3. repita o passo anterior para k 2, k 3, ..., enquanto possvel
4. devolva o apontador p +f
Note-se que o desperdcio de memoria de uma area pode chegar a quase
50%.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 285
Sistema de blocos conjugados (cont.)
Esbo co da funcao free(p):
1. seja k o expoente correspondente ao tamanho de p
2. calcule o endere co da area q conjugada de p
3. se a area q esta livre:

remova q da lista disp[k]

junte as areas p e q para formar uma nova area livre p

fa ca k = k+1

volte ao passo inicial


4. se a area q nao esta livre (ou nao existe p ja e a memoria inteira),
insira p na lista disp[k]
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 286
Sistema de blocos conjugados (cont.)
Uma outra alternativa e utilizar os n umeros de Fibonacci:
0-12
0-7
0-4
0-2
0-1 3-4
5-7
5-6
8-12
8-10
8-9 11-12
0 1 2 3 4 5 6 7 8 9 10 11 12
F2 =1
F3 =2
F4 =3
F5 =5
F6 =8
F7 =13

Esta solucao diminui o desperdcio de memoria, mas torna mais


complicados os algoritmos.

Exerccio: esbocar as fun coes malloc e free para esta alternativa.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 287
Gerenciamento implcito
Coleta de lixo (garbage collection)

Caractersticas:

opera cao de aloca cao implcita em algumas operacoes

nao existe operacao de liberacao explcita ou e opcional

libera cao de memoria realizada, em geral, quando nao ha mais espaco


para alocar

exemplos: Java, LISP, Prolog, Perl, Python, Modula-3, ...

contra-exemplos: C, Pascal, C++, ...

Fases:

marcacao

coleta ou compacta cao

caso haja compacta cao: calculo de destino; atualiza cao dos


apontadores; copia dos blocos
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 288
Marcacao e coleta

Hipoteses

Localiza cao conhecida das variaveis apontadoras na pilha de execu cao.

Localiza cao conhecida de apontadores em cada bloco.

Blocos de tamanho xo ou com campos de comprimento.

Marcas de utiliza cao em cada bloco, inicialmente falsas.

Algoritmo:

Percurso analogo `a pre-ordem e marcacao a partir das variaveis na


pilha.

Percurso linear da memoria para coleta de blocos livres e restaura cao


das marcas.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 289
Marcacao e coleta (cont.)
Exemplo de situa cao inicial:

supoe blocos iguais

setas mais fortes: apontadores nas variaveis na pilha de execucao

blocos acessveis a serem marcados marcados em cor cinza


f f f f f f f f f f f f
Apos a marca cao:
f t t t f t f t t f t t
Apos a coleta:
f f f f f f f f f f f f
disp
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 290
Marcacao e coleta (cont.)

Hipoteses simplicadoras:

tamanho xo de registros

localiza cao conhecida dos apontadores (um vetor)

Declaracoes:
typedef s t r uc t Bl oco ApBl oco ;
typedef s t r uc t Bl oco {
Bool ean marca ;
ApBl oco d e s t i n o ; / s e houver compacta cao /
. . .
i nt numAps ;
ApBl oco apont s [ NUM MAX APONTS] ;
} Bl oco ;
ApBl oco di s p ; / i n i c i a l me n t e t odos os bl oc os /
Bl oco memori a [ TAM MEM DIN] ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 291
Marcacao e coleta (cont.)
Funcao de marca cao:
voi d Marcar ( ApBl oco p) {
i nt i ;
i f ( p!=NULL) {
i f ( ! p>marca ) {
p>marca = t r ue ;
f or ( i =0; i <p>numAps ; i ++)
Marcar ( p>apont s [ i ] ) ;
}
}
} / Marcar /
A funcao Marcar deve ser chamada para cada variavel apontadora na pilha
de execucao.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 292
Marcacao e coleta (cont.)
Funcao de coleta:
voi d Col e t a r ( ) {
i nt i ;
di s p = NULL;
f or ( i =0; i <TAM MEM DIN; i ++)
i f ( memori a [ i ] . marca ) / em uso /
memori a [ i ] . marca = f a l s e ;
el s e { / i n s e r e na l i s t a d i s p o n v e l /
memori a [ i ] . apont s [ 0 ] = di s p ;
di s p = &(memori a [ i ] ) ;
}
} / Col e t a r /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 293
Marcacao e compactacao

Hipoteses

Localiza cao conhecida das variaveis apontadoras na pilha de execu cao.

Localiza cao conhecida de apontadores em cada bloco.

Blocos de tamanho xo ou com campos de comprimento.

Marcas de utiliza cao em cada bloco, inicialmente falsas.

Algoritmo:

Percurso analogo `a pre-ordem e marcacao a partir das variaveis na


pilha.

Calculo dos novos enderecos dos blocos.

Atualizacao dos campos apontadores.

Compactacao (copia).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 294
Marcacao e compactacao (cont.)
Exemplo de situa cao inicial:

supoe blocos iguais

setas mais fortes: apontadores nas variaveis na pilha de execucao

blocos acessveis a serem marcados marcados em cor cinza


f f f f f f f f f f f f
Apos a marca cao:
f t t t f t f t t f t t
Apos o calculo dos novos endere cos (tracejados):
f t t t f t f t t f t t
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 295
Marcacao e compactacao (cont.)
Apos o calculo dos novos endere cos (tracejados):
f t t t f t f t t f t t
Apos a atualizacao dos apontadores, inclusive os da pilha:
f t t t f t f t t f t t
Apos a compacta cao:
f f f f f f f f f f f f
disp
A variavel disp aponta para o incio da area contgua liberada pela
opera cao de compactacao (nao e necessario usar uma lista ligada).
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 296
Marcacao e compactacao (cont.)

Sao adotadas as mesmas hipoteses do caso de marcacao e coleta.

A funcao marcar e a mesma.

Funcao de calculo dos novos endere cos:


voi d Ca l c ul a r De s t i no ( ) {
i nt i , j = 0;
f or ( i =0; i <TAM MEM DIN; i ++)
i f ( memori a [ i ] . marca ) {
memori a [ i ] . d e s t i n o = &(memori a [ j ] ) ;
j ++;
}
di s p = &(memori a [ j ] ) ; / pr i me i r o bl oc o l i v r e /
} / Ca l c ul a r De s t i no /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 297
Marcacao e compactacao (cont.)
Funcao de atualizacao dos apontadores:
voi d At ua l i z a ( ) {
i nt i , j = 0;
f or ( i =0; i <TAM MEM DIN; i ++)
i f ( memori a [ i ] . marca )
f or ( j =0; j <memori a [ i ] . numAps ; j ++) {
memori a [ i ] . apont s [ j ] =
( memori a [ i ] . apont s [ j ])>d e s t i n o ;
}
} / At ua l i z a /
Devem ser atualizadas tambem todas as variaveis apontadoras na pilha de
execucao.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 298
Marcacao e compactacao (cont.)
Funcao de compacta cao:
voi d Move ( ) {
i nt i ;
f or ( i =0; i <TAM MEM DIN; i ++)
i f ( memori a [ i ] . marca ) {
memori a [ i ] . marca = f a l s e ;
( memori a [ i ] . d e s t i n o ) = memori a [ i ] ;
}
} / Move /
Adapta cao para blocos de tamanho variavel: introduzir o campo tamanho
em cada bloco e adaptar as fun coes.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 299
Contagem de referencias

As tecnicas de coleta de lixo (marcacao e coleta ou compactacao)


encontram e liberam toda a memoria disponvel de uma vez.

O processo pode ser bastante demorado, com tempo de execu cao


proporcional ao tamanho total da memoria dinamica.

A execucao da coleta de lixo interrompe o processo em curso; esta


interrupcao pode demorar mais do que seria aceitavel am algumas
aplicacoes.

Dependendo da complexidade das estruturas de dados criadas pelo


programa, a fase de marca cao pode exigir memoria adicional
apreciavel para manter a pilha de execucao.

A tecnica de contagem de referencias tem a caracterstica de, em


geral, distribuir o tempo de gerenciamento de memoria ao longo da
execucao normal do programa.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 300
Contagem de referencias (cont.)

Cada bloco alocado possui um campo inteiro refs contendo o n umero de


variaveis (normais ou dinamicas) que apontam para o bloco.

Durante a alocacao de um bloco, o seu campo refs recebe o valor inicial 1.

Toda variavel ou campo apontador, antes de ser atribudo, recebe o valor


NULL.

Todo comando de atribuicao que envolve apontadores e implementado pela


funcao AtrbuiApont(ApBloco *p, ApBloco q):
typedef s t r uc t Bl oco ApBl oco ;
typedef s t r uc t Bl oco {
i nt r e f s ;
. . .
i nt numAps ;
ApBl oco
apont s [ NUM MAX APONTS] ;
} Bl oco ;
voi d At r i bui Apont ( ApBl oco p ,
ApBl oco q) {
i f ( q!=NULL) ( q>r e f s )++;
i f ( ( p)!=NULL) {
( ( p)>r e f s );
i f ( ( ( p)>r e f s )==0)
De s al oc aRe f s (p ) ;
}
p = q ;
}
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 301
Contagem de referencias (cont.)

A funcao DesalocaRefs(p):

desaloca o bloco apontado por p

decrementa os contadores dos blocos referidos em p

caso algum destes contadores torne-se nulo, a fun cao e chamada


recursivamente

Problemas:

dependendo das estruturas de dados, o tempo de execu cao de comando


de atribuicao entre apontadores e imprevisvel devido `a recurisividade
da funcao DesalocaRefs

o metodo, como exposto, nao funciona para estruturas com


circularidades; exemplo:
p
2 1 1 1 1
apos a atribuicao p = NULL:
p
1 1 1 1 1
Os nos da lista nao seriam liberados. Alguns sistemas utilizam um
esquema misto: contagem de referencias e coleta de lixo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Gerenciamento de mem oria 302
Abstra cao de Dados e Objetos
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 303
Tipos abstratos de dados

Um tipo abstrato de dados (TAD) e constitudo por um conjunto de


valores e um conjunto de opera coes sobre estes valores.

Os valores possuem uma representa cao e podem ser muito simples


(inteiros, bytes, ...) ou bastante complexos (pilhas, arvores, ...).

Exemplo de especica cao de um TAD Figura atraves de declara coes


em C:
typedef voi d Fi gur a ;
Fi gur a Ret angul o ( f l o a t a l t , f l o a t l a r g ) ;
Fi gur a Ci r c u l o ( f l o a t r a i o ) ;
Fi gur a Quadrado ( f l o a t l ado ) ;
f l o a t Area ( Fi gur a f i g ) ;
voi d Tr ans l adar ( Fi gur a f i g , f l o a t dx , f l o a t dy ) ;
voi d Desenhar ( Fi gur a f i g ) ;

A espoecicacao de um tipo como void e uma tecnica comum


em C para esconder a implementacao.

Normalmente, estas declaracoes, chamadas `as vezes de interface ou


API (Application Programming Interface) estariam num arquivo
denominado figuras.h.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 304
Tipos abstratos de dados (cont.)

Usando a especica cao, e possvel escrever programas que utilizam o


TAD, mesmo sem completar a sua implementacao.

Exemplo de utiliza cao do TAD Figura:


#i ncl ude f i g u r a s . h
i nt mai n ( ) {
Fi gur a c = Ci r c u l o ( 1 0 . 0 ) ;
Fi gur a r = Ret angul o ( 10. 0 , 2 0 . 0 ) ;
Fi gur a q = Quadrado ( 5 0 . 0 ) ;
Tr ans l adar ( r , 5 . 0 , 8 . 0 ) ;
Desenhar ( q ) ;
p r i n t f ( %f \n , Area ( c ) ) ;
p r i n t f ( %f \n , Area ( r ) ) ;
p r i n t f ( %f \n , Area ( q ) ) ;
r et ur n 0;
} / mai n /

As funcoes Circulo, Retangulo e Quadrado devem construir e devolver


as representa coes dos valores correspondentes (construtores).

A funcao main poderia estar num arquivo denominado main.c.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 305
Tipos abstratos de dados (cont.)

A implementacao de um TAD depende de varios fatores, mas deve


seguir sempre a sua especica cao.

Exemplo de declaracoes naturais para implementar o TAD Figura:


typedef enum { RETANGULO, CIRCULO, QUADRADO } For maFi gur a ;
typedef s t r uc t {
For maFi gur a f orma ;
f l o a t posx , posy ;
uni on {
s t r uc t {
f l o a t a l t , l a r g ;
} l a dos ;
f l o a t r a i o ;
} dados ;
} RegFi gur a , Fi gur a ;
Figura
forma posx posy
? ?
Retangulo
forma posx posy
0
alt larg
lados
Circulo
forma posx posy
1
raio
?
Quadrado
forma posx posy
2
alt larg
lados

Deve-se notar a diferenca entre os tipos Figura e Figura.

Normalmente, estas declaracoes (e as seguintes) estariam num


arquivo figuras.c.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 306
Tipos abstratos de dados (cont.)
Declaracoes dos construtores:
Fi gur a Ret angul o ( f l o a t a l t ,
f l o a t l a r g ) {
Fi gur a f =
mal l oc ( s i z e of ( RegFi gur a ) ) ;
f >f orma = RETANGULO;
f >posx = 0 . 0 ;
f >posy = 0 . 0 ;
f >dados . l a dos . a l t = a l t ;
f >dados . l a dos . l a r g = l a r g ;
r et ur n f ;
} / Ret angul o /
Fi gur a Ci r c u l o ( f l o a t r a i o ) {
Fi gur a f =
mal l oc ( s i z e of ( RegFi gur a ) ) ;
f >f orma = CIRCULO;
f >posx = 0 . 0 ;
f >posy = 0 . 0 ;
f >dados . r a i o = r a i o ;
r et ur n f ;
} / Ci r c u l o /
Fi gur a Quadrado ( f l o a t l ado ) {
Fi gur a f =
Ret angul o ( l ado , l ado ) ;
f >f orma = QUADRADO;
r et ur n f ;
} / Quadrado /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 307
Tipos abstratos de dados (cont.)
Declaracoes das funcoes:
f l o a t Area ( Fi gur a f i g ) {
Fi gur a f = f i g ;
swi tch ( f >f orma ) {
case RETANGULO:
case QUADRADO:
r et ur n ( f >dados . l a dos . a l t )
( f >dados . l a dos . l a r g ) ;
case CIRCULO:
r et ur n PI ( f >dados . r a i o )
( f >dados . r a i o ) ;
def aul t :
e x i t ( 1 ) ; / I mp o s s v e l /
}
} / Area /
voi d Tr ans l adar ( Fi gur a f i g ,
f l o a t dx ,
f l o a t dy ) {
Fi gur a f = f i g ;
f >posx += dx ;
f >posy += dy ;
} / Tr ans l adar /
voi d Desenhar ( Fi gur a f ) {
/ Nao f o i i mpl ementada /
} / Desenhar /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 308
Tipos abstratos de dados (cont.)

Nesta implementa cao do TAD Figura, a estrutura de dados que


implementa o tipo e as funcoes sao implementadas separadamente.


E possvel mudar a implementacao de maneira que as funcoes passem
fazer parte da propria estrutura de dados uma caracterstica de
objetos; neste caso sao denominados metodos.

Nesta nova implementa cao do exemplo, por simplicidade, a tecnica


sera aplicada somente `a funcao Area, mas poderia ser estendida `as
outras funcoes.

Trata-se de uma nova implementacao da mesma interface;


consequentemente os arquivos figuras.h (repetido abaixo) e
main.c permanecem iguais.
typedef voi d Fi gur a ;
Fi gur a Ret angul o ( f l o a t a l t , f l o a t l a r g ) ;
Fi gur a Ci r c u l o ( f l o a t r a i o ) ;
Fi gur a Quadrado ( f l o a t l ado ) ;
f l o a t Area ( Fi gur a f i g ) ;
voi d Tr ans l adar ( Fi gur a f i g , f l o a t dx , f l o a t dy ) ;
voi d Desenhar ( Fi gur a f i g ) ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 309
Tipos abstratos de dados (cont.)
Declaracao de Figura com um metodo:
typedef f l o a t f uncAr ea ( Fi gur a ) ; / t i p o f un cao /
typedef enum { RETANGULO, CIRCULO, QUADRADO } For maFi gur a ;
typedef s t r uc t {
For maFi gur a f orma ;
f l o a t posx , posy ;
f uncAr ea Area ; / apont ador par a f uncao /
uni on {
s t r uc t { f l o a t a l t , l a r g ; } l a dos ;
f l o a t r a i o ;
} dados ;
} RegFi gur a , Fi gur a ;
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 310
Tipos abstratos de dados (cont.)
Funcoes do tipo funcArea:
f l o a t Ar eaRet angul o ( Fi gur a f i g ) {
Fi gur a f = f i g ;
r et ur n ( f >dados . l a dos . a l t ) ( f >dados . l a dos . l a r g ) ;
} / Ar eaRet angul o /
f l o a t Ar e a Ci r c ul o ( Fi gur a f i g ) {
Fi gur a f = f i g ;
r et ur n PI ( f >dados . r a i o ) ( f >dados . r a i o ) ;
} / Ar e a Ci r c ul o /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 311
Tipos abstratos de dados (cont.)
Declaracoes dos construtores:
Fi gur a Ret angul o ( f l o a t a l t ,
f l o a t l a r g ) {
Fi gur a f =
mal l oc ( s i z e of ( RegFi gur a ) ) ;
f >f orma = RETANGULO;
f >posx = 0 . 0 ;
f >posy = 0 . 0 ;
f >Area = Ar eaRet angul o ;
f >dados . l a dos . a l t = a l t ;
f >dados . l a dos . l a r g = l a r g ;
r et ur n f ;
} / Ret angul o /
Fi gur a Ci r c u l o ( f l o a t r a i o ) {
Fi gur a f =
mal l oc ( s i z e of ( RegFi gur a ) ) ;
f >f orma = CIRCULO;
f >posx = 0 . 0 ;
f >posy = 0 . 0 ;
f >Area = Ar e a Ci r c ul o ;
f >dados . r a i o = r a i o ;
r et ur n f ;
} / Ci r c u l o /
Fi gur a Quadrado ( f l o a t l ado ) {
Fi gur a f =
Ret angul o ( l ado , l ado ) ;
f >f orma = QUADRADO;
r et ur n f ;
} / Quadrado /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 312
Tipos abstratos de dados (cont.)
Declaracoes das funcoes:
f l o a t Area ( Fi gur a f i g ) {
r et ur n ( ( Fi gur a ) f i g )>Area ( f i g ) ;
}
voi d Tr ans l adar ( Fi gur a f i g , f l o a t dx , f l o a t dy ) {
Fi gur a f = f i g ;
f >posx += dx ;
f >posy += dy ;
} / Tr ans l adar /
voi d Desenhar ( Fi gur a f i g ) {
/ Nao f o i i mpl ementada /
} / Desenhar /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 313
Objetos

O exemplo anterior demonstra que e possvel simular, dentro de


algumas limitacoes, a implementa cao de objetos numa linguagem que
nao incorpora este conceito.

Ha varios aspectos que cam a cargo do proprio programador,


especialmente a consistencia de tipos, fonte comum de erros.

O exemplo anterior sera transformado de maneira a ilustrar a


implementacao de objetos numa linguagem que possui este conceito.

Sera usada uma linguagem ctcia, uma extensao simples de C.

Nao serao tratados varios aspectos como por exemplo polimorsmo,


visibilidade etc.

Exemplo de hierarquia das classes:


Figura
Crculo Retangulo
Quadrado
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 314
Objetos (cont.)
c l a s s Fi gur a
f l oat posx , posy ;
/ nao e x i s t e c o n s t r u t o r /
f l oat Area ( ) ;
voi d Desenhar ( ) ;
f l oat Tr ans l adar ( f l oat dx , dy )
t h i s . posx += dx ;
t h i s . posy += dy ;

/ Fi gur a /
posx posy
0
1
2
3
(Classe pai)
Area (Figura)
Desenhar (Figura)
Transladar (Figura)
Todos os objetos de uma classe apontam para a mesma tabela de
metodos. Pode haver mais informacoes. Neste exemplo, todas as fun coes
foram transformadas em metodos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 315
Objetos (cont.)
c l a s s Ret angul o e xt e nds Fi gur a
f l oat a l t , l a r g ;
Ret angul o ( f l oat a , f l oat l )
t h i s . a l t = a ;
t h i s . l a r g = l ;
t h i s . posx = 0 . 0 ;
t h i s . posy = 0 . 0 ;

f l oat Area ( )
r etur n a l t l a r g ;

voi d Desenhar ( ) . . . ;
Ret angul o Gi r ar 90 ( )
r etur n new Ret angul o ( t h i s . l ar g , t h i s . a l t ) ;

/ Ret angul o /
posx posy
alt larg
4
0
1
2
3
Classe Figura
Area (Retangulo)
Desenhar (Retangulo)
Transladar (Figura)
Girar90 (Retangulo)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 316
Objetos (cont.)
c l a s s Quadrado e xt e nds Ret angul o
Quadrado ( f l oat l )
s upe r ( l , l ) ;

/ Ret angul o /
posx posy
alt larg
4
0
1
2
3
Classe Retangulo
Area (Retangulo)
Desenhar (Retangulo)
Transladar (Figura)
Girar90 (Retangulo)
Somente o construtor e diferente da classe Retangulo.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 317
Objetos (cont.)
c l a s s Ci r c u l o e xt e nds Fi gur a
f l oat r a i o ;
Ci r c u l o ( f l oat r )
t h i s . posx = 0 . 0 ;
t h i s . posy = 0 . 0 ;
t h i s . r a i o = r ;

f l oat Area ( )
r etur n PI s qr ( r a i o ) ;

voi d Desenhar ( ) . . . ;
voi d Dupl i c a r ( )
t h i s . r a i o = 2. 0 t h i s . r a i o ;

/ Ret angul o /
posx posy
raio
4
0
1
2
3
Classe Figura
Area (Circulo)
Desenhar (Circulo)
Transladar (Figura)
Duplicar (Circulo)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 318
Objetos (cont.)
Representacao de todas as classes:
0
1
2
3
(Classe pai)
Area (Figura)
Desenhar (Figura)
Transladar (Figura)
4
0
1
2
3
Area (Retangulo)
Desenhar (Retangulo)
Transladar (Figura)
Girar90 (Retangulo)
4
0
1
2
3
Area (Retangulo)
Desenhar (Retangulo)
Transladar (Figura)
Girar90 (Retangulo)
4
0
1
2
3
Area (Circulo)
Desenhar (Circulo)
Transladar (Figura)
Duplicar (Circulo)
Figura
Retangulo
Quadrado
Circulo
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 319
Objetos (cont.)
Exemplo de uso dos objetos:
i nt mai n ( ) {
Fi gur a f = new Ci r c u l o ( 1 0 . 0 ) ;
Ret angul o r =
new Ret angul o ( 1 0 . 0 , 2 0 . 0 ) ;
Quadrado q = new Quadrado ( 5 0 . 0 ) ;
Ci r c u l o c = new Ci r c u l o ( 3 0 . 0 ) ;
p r i n t f ( %f \n , f . Area ( ) ) ;
p r i n t f ( %f \n , r . Area ( ) ) ;
c . Desenhar ( ) ;
f = q ;
f . Tr ans l adar ( 5 . 0 , 8 . 0 ) ;
f . Desenhar ( ) ;
p r i n t f ( %f \n , f . Area ( ) ) ;
/ comandos i n v a l i d o s /
f . Dupl i c a r ( ) ;
f . Gi r ar 90 ( ) ;
c . Gi r ar 90 ( ) ;
c = r ;
q = f ;
} / mai n /
Os comandos invalidos seriam detectados pelo compilador.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Abstracao de Dados e Objetos 320
Algoritmos de ordena cao
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 321
Generalidades

Ordenacao interna e externa

Ordenacao otima por compara coes: O(nlog n)

Algoritmos por comparacao:

transposi cao (bubblesort, quicksort)

insercao (insercao simples, shellsort)

selecao (selecao simples, heapsort)

intercalacao (iterativo, recursivo)

Outros algoritmos: distribui cao (radix sort)

Ordena cao estavel: mantem a ordem relativa dos registros de com


chaves iguais.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 322
Ordenacao otima por compara coes

Arvore de decisao para ordenar tres elementos x


1
, x
2
e x
3
:
x1 x2
x2 x3
x1, x2, x3 x1 x3
x1, x3, x2 x3, x1, x2
x2 x3
x1 x3
x2, x1, x3 x2, x3, x1
x3, x2, x1
V F
V F
V F
V F
V F

A arvore tem 3! = 6 folhas (permutacoes de 3 elementos).

A altura da arvore e 3.

Portanto, o n umero mnimo de comparacoes, no pior caso, e 3.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 323
Ordenacao otima por compara coes (cont.)
Caso geral de n elementos:

A arvore de decisao devera ter n! folhas (n umero de permuta coes de


n elementos).

Uma arvore de altura h tem no maximo 2


h
folhas.

Deve-se ter, portanto:


2
h
n!
= h ,log
2
(n!)|
Pela aproximacao de Stirling:
,log
2
(n!)| = nlog
2
n n/(ln 2) +
log
2
n
2
+ O(1)
Para valores grandes de n, o primeiro termo e dominante:
,log
2
(n!)| nlog
2
n

O n umero mnimo de compara coes, no pior caso, e O(nlog


2
n).

Portanto, nao existe nenhum algoritmo de ordena cao mais eciente


que utiliza apenas compara coes de elementos.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 324
Algoritmos: declarac oes comuns
typedef s t r uc t Vet or {
i nt n ;
i nt dados [ 1 ] ;
} Vetor , ApVetor ;
voi d t r oc a ( i nt x , i nt y ) {
i nt t = x ;
x = y ;
y = t ;
} / t r oc a /

Os algoritmos de ordenacao serao apresentados como fun coes em


linguagem C que ordenam um vetor de dados que faz parte de uma
estrutura denominada Vetor.

Nesta declara cao, n denota o tamanho verdadeiro do vetor dados que


dependera do parametro passado `a funcao malloc quando o vetor for
alocado.

Varios algoritmos fazem trocas de valores entre elementos do vetor


indicadas por chamadas da funcao troca.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 325
Algoritmo bubble sort
d
0 n-1
= i j =
voi d bubbl e Sor t ( ApVetor v ) {
/Exempl o de t r a n s p o s i c a o /
i nt n = v>n , i , j ;
i nt d = ( v>dados ) ;
f or ( i =n1; i >0; i )
f or ( j =0; j <i ; j ++)
i f ( d [ j ]>d [ j +1] )
t r oc a (&d [ j ] , &d [ j +1] ) ;
} / bubbl e Sor t /

Os elementos entre i+ 1 e n1 ja estao ordenados.

Os elementos d[j] (abaixo de i) sao empurrados se necessaro; o


maior deles acaba em seu lugar nal.

Verica-se facilmente que o n umero de compara coes executado por


este algoritmo e sempre (n
2
n)/2 (da ordem de O(n
2
)).


E um algoritmo estavel.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 326
Insercao simples
d
0 n-1
i =
t
voi d i n s e r c a o ( ApVetor v ) {
i nt n = v>n , i , j , t ;
i nt d = ( v>dados ) ;
f or ( i =0; i <n1; i ++) {
t = d [ i +1] ; j = i ;
whi l e ( ( j >=0)&&(t<d [ j ] ) ) {
d [ j +1] = d [ j ] ; j ;
}
d [ j +1] = t ;
}
} / i n s e r c a o /

Os elementos entre 0 e i ja estao ordenados.

Os elementos menores do que d[i+1] sao empurrados `a direita e


d[i+1] inserido no seu lugar.

No pior caso, O(n


2
) comparacoes; no melhor caso, O(n).

Um bom algoritmo se os dados ja estao parcialmente ordenados.


E um algoritmo estavel.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 327
Selecao simples
d
0 n-1
i =
p
voi d s e l e c a o ( ApVetor v ) {
i nt n = v>n , i , j , p ;
i nt d = ( v>dados ) ;
f or ( i =0; i <n1; i ++) {
p = i ;
f or ( j=i +1; j <n ; j ++)
i f ( d [ j ]<d [ p ] )
p = j ;
t r oc a (&d [ i ] , &d [ p ] ) ;
}
} / s e l e c a o /

Os elementos entre 0 e i1 ja estao ordenados.

O elemento mnimo entre as posi coes i e n1 (d[p]) troca de lugar


com o elemento d[i].

O n umero de comparacoes e sempre da ordem de O(n


2
).


E um algoritmo estavel.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 328
Algoritmo Quicksort

Quicksort foi idealizado por C. A. R. Hoare em 1962.


E um algoritmo recursivo que ordena segmentos do vetor dado.

A ordenacao do vetor inteiro e realizada atraves da chamada de uma


funcao auxiliar com argumentos que cobrem o vetor:
voi d qui c kSor t ( ApVetor v ) {
qui ckSor t Aux ( v , 0 , ( v>n) 1);
} / qui c kSor t /

A funcao auxiliar quickSortAux implementa de fato o algoritmo.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 329
Algoritmo Quicksort (cont.)
voi d qui ckSor t Aux ( ApVetor v , i nt esq , i nt d i r ) {
/ supoe esq<=d i r /
i nt d = ( v>dados ) ;
i nt i = esq , j = d i r ;
i nt pi v o t = d [ ( i nt ) ( ( es q+d i r ) / 2 ) ] ;
/ p a r t i c i o n a /
do {
whi l e ( d [ i ]<pi v o t ) i ++;
whi l e ( d [ j ]>pi v o t ) j ;
i f ( i <=j ) {
t r oc a (&d [ i ] , &d [ j ] ) ;
i ++; j ;
}
} whi l e ( i <=j ) ;
/ or dena /
i f ( esq<j ) qui ckSor t Aux ( v , esq , j ) ;
i f ( di r >i ) qui ckSor t Aux ( v , i , d i r ) ;
} / qui ckSor t Aux /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 330
Algoritmo Quicksort (cont.)
do {
whi l e ( d [ i ]<p i v o t ) i ++;
whi l e ( d [ j ]>p i v o t ) j ;
i f ( i <=j ) {
t r oc a (&d [ i ] , &d [ j ] ) ;
i ++; j ;
}
} whi l e ( i <=j ) ;
i f ( esq<j ) qui ckSor t Aux ( v , esq , j ) ;
i f ( di r >i ) qui ckSor t Aux ( v , i , d i r ) ;

Incio do particionamento:
d
0 n-1 esq
dir
i = = j
p (pivot)

Situacao generica apos uma troca:


d
0 n-1 esq
dir i j
p p
p p
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 331
Algoritmo Quicksort (cont.)
do {
whi l e ( d [ i ]<p i v o t ) i ++;
whi l e ( d [ j ]>p i v o t ) j ;
i f ( i <=j ) {
t r oc a (&d [ i ] , &d [ j ] ) ;
i ++; j ;
}
} whi l e ( i <=j ) ;
i f ( esq<j ) qui ckSor t Aux ( v , esq , j ) ;
i f ( di r >i ) qui ckSor t Aux ( v , i , d i r ) ;

Situacao apos uma troca:


d
0 n-1 esq
dir i j
p p
p p

Situacao quando termina o particionamento:


d
0 n-1 esq
dir i j
p p
Pode haver apenas um ou nenhum elemento entre j e i. Se houver,
ele e necessariamente igual ao pivo e esta na sua posicao nal.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 332
Algoritmo Quicksort (cont.)
do {
whi l e ( d [ i ]<p i v o t ) i ++;
whi l e ( d [ j ]>p i v o t ) j ;
i f ( i <=j ) {
t r oc a (&d [ i ] , &d [ j ] ) ;
i ++; j ;
}
} whi l e ( i <=j ) ;
i f ( esq<j ) qui ckSor t Aux ( v , esq , j ) ;
i f ( di r >i ) qui ckSor t Aux ( v , i , d i r ) ;

Situacao quando termina o particionamento:


d
0 n-1 esq
dir i j
p p

Situacao apos as chamadas recursivas o segmento esta ordenado:


d
0 n-1 esq
dir
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 333
Algoritmo Quicksort (cont.)

Escolha do pivo:

em princpio, o algoritmo funciona com qualquer valor do pivo

o ideal seria um pivo que particiona o segmento em duas partes de


comprimentos iguais

algumas implementacoes utilizam a media de alguns poucos elementos

na implementacao aqui exibida foi usado o valor do elemento do meio

Eciencia:

no pior caso o algoritmo realiza da ordem de O(n


2
) opera coes

em media e no melhor caso sao O(nlog n) opera coes

na pratica sao quase sempre O(nlog n) opera coes

e o algoritmo de ordena cao interna mais utilizado e faz parte das


bibliotecas de varias linguagens (por exemplo, qsort em C)

Estabilidade:

sob a forma apresentada, o algoritmo nao e estavel

exerccios:

exibir um exemplo que demonstra a falta de estabilidade

modicar o algoritmo para que seja estavel


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 334
Algoritmo Quicksort (cont.)
Exemplo de execu cao do Quicksort:
(< e > delimitam o segmento corrente; marca o piv o)
Vetor original:
07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12
------------------------------------------------------------------------------------------------------
Pivot: 09
< * >
07 03 73 58 30 72 44 78 23 09 40 65 92 42 87 49 27 29 40 12
i j
07 03 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12
i j
07 03 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12
j i
Pivot: 03
< * >
03 07 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12
j i
Pivot: 07
<* >
03 07 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12
j i
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 335
Algoritmo Quicksort (cont.)
Pivot: 65
< * >
03 07 09 58 30 12 44 78 23 73 40 65 92 42 87 49 27 29 40 72
i j
03 07 09 58 30 12 44 40 23 73 40 65 92 42 87 49 27 29 78 72
i j
03 07 09 58 30 12 44 40 23 29 40 65 92 42 87 49 27 73 78 72
i j
03 07 09 58 30 12 44 40 23 29 40 27 92 42 87 49 65 73 78 72
i j
03 07 09 58 30 12 44 40 23 29 40 27 49 42 87 92 65 73 78 72
i j
03 07 09 58 30 12 44 40 23 29 40 27 49 42 87 92 65 73 78 72
j i
Pivot: 23
< * >
03 07 09 23 30 12 44 40 58 29 40 27 49 42 87 92 65 73 78 72
i j
03 07 09 23 12 30 44 40 58 29 40 27 49 42 87 92 65 73 78 72
j i
Pivot: 23
<* >
03 07 09 12 23 30 44 40 58 29 40 27 49 42 87 92 65 73 78 72
j i
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 336
Algoritmo Quicksort (cont.)
Pivot: 29
< * >
03 07 09 12 23 27 44 40 58 29 40 30 49 42 87 92 65 73 78 72
i j
03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72
i j
03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72
j i
Pivot: 27
<* >
03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72
j i
Pivot: 40
< * >
03 07 09 12 23 27 29 30 58 44 40 40 49 42 87 92 65 73 78 72
i j
03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72
i=j
03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72
j i
Pivot: 30
<* >
03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72
j i
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 337
Algoritmo Quicksort (cont.)
Pivot: 40
< * >
03 07 09 12 23 27 29 30 40 40 58 44 49 42 87 92 65 73 78 72
i=j
03 07 09 12 23 27 29 30 40 40 58 44 49 42 87 92 65 73 78 72
j i
Pivot: 44
< * >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72
i j
03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72
j i
Pivot: 49
<* >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72
j i
Pivot: 65
< * >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 92 87 73 78 72
i=j
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 92 87 73 78 72
j i
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 338
Algoritmo Quicksort (cont.)
Pivot: 73
< * >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 87 73 78 92
i j
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 87 78 92
j i
Pivot: 72
<* >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 87 78 92
j i
Pivot: 78
< * >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92
j i
Pivot: 87
<* >
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92
j i
------------------------------------------------------------------------------------------------------
Resultado:
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 339
Intercalacao iterativa (Mergesort)

O algoritmo de intercalacao iterativa foi provavelmente um dos


primeiros algoritmos de ordena cao interna propostos: John von
Neumann (1945).

O algoritmo consiste em varias passagens pelo vetor, intercalando


segmentos consecutivos de tamanhos 1, 2, 4, 8, ..., ate completar o
vetor.

Utiliza um vetor auxiliar; os dois vetores sao usados alternadamente


para guardar os resultados da intercala cao.

Se necessario, ha um passo adicional para copiar os resultados do


vetor auxiliar para o original.

O n umero de comparacoes deste algoritmo e da ordem de O(nlog n)


(otimo).

O algoritmo e estavel.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 340
Intercalacao iterativa (cont.)
vd
...
0 n-1
wd
...
vd
...
wd
...
vd
...

Quando n nao e uma potencia de 2, os ultimos segmentos de cada estagio
podem car mais curtos do que os outros.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 341
Intercalacao iterativa (cont.)
voi d i n t e r c a l a I t e r a t i v o ( ApVetor v ) {
/ Ordena de 2 em 2 , de 4 em 4 , . . . , por i n t e r c a l a c a o /
i nt n = v>n ;
i nt td = 1; / 1 , 2 , 4 , . . . /
i nt esq , di r , l d ;
i nt tamanho = s i z e of ( Vet or )+s i z e of ( i nt ) ( n1);
Bool ean par = f a l s e ;
ApVetor w = ( ApVetor ) mal l oc ( tamanho ) ;
w>n = v>n ;
(continua)
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 342
Intercalacao iterativa (cont.)
whi l e ( td<n) {
es q = 0; par = ! par ;
do {
d i r = es q+td ; l d = d i r+td ;
i f ( di r >=n) { / l ado d i r e i t o v a z i o /
d i r = n ; l d = n1;
} el s e i f ( l d>n)
l d = n ;
i f ( par ) i n t e r c a l a I t e r a t i v o Au x ( v , w, esq , di r , l d ) ;
e l s e i n t e r c a l a I t e r a t i v o Au x (w, v , esq , di r , l d ) ;
es q = d i r+td ;
} whi l e ( esq<n ) ;
td = 2 td ;
}
i f ( par ) memcpy( v , w, tamanho ) ;
f r e e (w) ;
} / i n t e r c a l a I t e r a t i v o /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 343
Intercalacao iterativa (cont.)
voi d i n t e r c a l a I t e r a t i v o Au x ( ApVetor v , ApVetor w,
i nt esq , i nt di r , i nt l d ) {
/ I n t e r c a l a v . dados [ es q : di r 1] e
v . dados [ d i r : l d 1] em w. dados [ es q : l d 1] /
i nt dv = ( v>dados ) , dw = (w>dados ) ;
i nt i = esq , j = di r , k= es q ;
whi l e ( ( i <d i r )&&( j <l d ) ) {
i f ( dv [ i ]<=dv [ j ] ) {
dw[ k ] = dv [ i ] ; i ++;
} e l s e {
dw[ k ] = dv [ j ] ; j ++;
}
k++;
}
whi l e ( i <d i r ) { dw[ k ] = dv [ i ] ; i ++; k++; }
whi l e ( j <l d ) { dw[ k ] = dv [ j ] ; j ++; k++; }
} / i n t e r c a l a I t e r a t i v o Au x /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 344
Intercalacao iterativa (cont.)
Exemplo de execu cao:
Vetor original:
07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12
----------------------------------------------------------------------------------------------------
td=1:
| 07 49 | 58 73 | 30 72 | 44 78 | 09 23 | 40 65 | 42 92 | 03 87 | 27 29 | 12 40 |
td=2:
| 07 49 58 73 | 30 44 72 78 | 09 23 40 65 | 03 42 87 92 | 12 27 29 40 |
td=4:
| 07 30 44 49 58 72 73 78 | 03 09 23 40 42 65 87 92 | 12 27 29 40 |
td=8:
| 03 07 09 23 30 40 42 44 49 58 65 72 73 78 87 92 | 12 27 29 40 |
td=16:
| 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 |
----------------------------------------------------------------------------------------------------
Resultado:
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 345
Intercalacao recursiva

Passos do algoritmo:

quebrar o vetor v dado em dois vetores v


1
e v
2
, de tamanhos
aproximadamente iguais

se o tamanho de v
1
e maior que 1, ordena-lo recursivamente

se o tamanho de v
2
e maior que 1, ordena-lo recursivamente

intercalar os vetores v
1
e v
2
, deixando o resultado no vetor v original


E facil vericar que o n umero de compara coes e da ordem de
O(nlog n) (otimo).

Se implementado corretamente, o algoritmo e estavel.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 346
Intercalacao recursiva (cont.)
vd
0 n-1
v1d v2d
q
u
e
b
r
a
v1d v2d
r
e
c
r
e
c
vd
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 347
Intercalacao recursiva (cont.)
voi d i n t e r c a l a Re c u r s i v o ( ApVetor v ) {
i nt n = v>n ;
i f ( n>1) {
i nt dv = v>dados ; ApVetor v1 , v2 ;
i nt i , nv1 = ( i nt ) ( n /2) , nv2 = nnv1 ;
v1 = ( ApVetor ) mal l oc ( s i z e of ( Vet or )+s i z e of ( i nt ) ( nv1 1));
v2 = ( ApVetor ) mal l oc ( s i z e of ( Vet or )+s i z e of ( i nt ) ( nv2 1));
v1>n = nv1 ; v2>n = nv2 ;
f or ( i =0; i <nv1 ; i ++) ( v1>dados ) [ i ] = dv [ i ] ;
f or ( i =0; i <nv2 ; i ++) ( v2>dados ) [ i ] = dv [ i +nv1 ] ;
i n t e r c a l a Re c u r s i v o ( v1 ) ; i n t e r c a l a Re c u r s i v o ( v2 ) ;
i n t e r c a l a Re c u r s i v o Au x ( v1 , v2 , v ) ;
f r e e ( v1 ) ; f r e e ( v2 ) ;
}
} / i n t e r c a l a Re c u r s i v o /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 348
Intercalacao recursiva (cont.)
voi d i n t e r c a l a Re c u r s i v o Au x ( ApVetor u , ApVetor v , ApVetor w) {
/ I n t e r c a l a os v e t o r e s u e v , dei xando o r e s u l t a d o em w. /
i nt i = 0 , j = 0 , k ;
i nt nu = u>n , nv = v>n , n = nu+nv ;
i nt du = ( u>dados ) , dv = ( v>dados ) ,
dw = (w>dados ) ;
f or ( k=0; k<n ; k++) {
i f ( ( i <nu)&&( j <nv ) ) {
i f ( du [ i ]<=dv [ j ] ) { dw[ k ] = du [ i ] ; i ++; }
el s e { dw[ k ] = dv [ j ] ; j ++; }
} el s e {
i f ( i <nu ) { dw[ k ] = du [ i ] ; i ++; }
el s e { dw[ k ] = dv [ j ] ; j ++; }
}
}
} / i n t e r c a l a Re c u r s i v o Au x /
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 349
Comparacao dos algoritmos de ordenacao interna
Tempos em milisegundos:
n Bubble Insercao Selecao Heapsort Quicksort Interc. Interc. Interc.
iter. recur.1 recur.2
-------------------------------------------------------------------------------------------------
16 (2^4) 0.005 0.003 0.003 0.004 0.003 0.005 0.005 0.004
32 (2^5) 0.009 0.004 0.007 0.004 0.005 0.005 0.010 0.006
64 (2^6) 0.031 0.009 0.016 0.009 0.009 0.014 0.021 0.010
128 (2^7) 0.106 0.030 0.050 0.017 0.016 0.016 0.053 0.018
256 (2^8) 0.404 0.106 0.179 0.039 0.035 0.033 0.107 0.046
512 (2^9) 1.685 0.450 0.674 0.085 0.074 0.072 0.218 0.083
1024 (2^10) 5.969 1.336 2.079 0.151 0.124 0.130 0.371 0.144
2048 (2^11) 21.301 5.282 8.136 0.322 0.268 0.279 0.805 0.302
4096 (2^12) 84.809 21.273 32.121 0.703 0.573 0.604 1.646 0.654
8192 (2^13) 338.462 84.498 127.803 1.510 1.233 1.290 3.570 1.404
16384 (2^14) 1351.672 340.743 514.325 3.279 2.605 2.721 7.442 2.968
32768 (2^15) 5390.648 1366.402 2054.017 7.133 5.520 5.769 15.563 6.189
65536 (2^16) 21565.843 5450.148 8213.796 15.489 11.546 12.192 32.772 13.167
131072 (2^17) 89281.419 21772.341 32872.943 33.404 24.359 26.042 68.350 27.769

A ultima coluna corresponde a uma implementacao otimizada do


algoritmo de intercala cao recursivo que evita aloca cao e libera cao de
espaco em cada chamada.

Desao: programar esta versao.


c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 350
Ordenacao externa: intercalacao balanceada m ultipla
Passos do algoritmo, dado um arquivo f:

i = 1

Enquanto ha dados em f:

Leia o maximo n umero de registros de f que cabem na memoria num


vetor v.

Ordene v usando um dos algoritmos de ordenacao internos (por


exemplo, quicksort).

Escreva o conte udo de v em arquivo f


i
.

i = i + 1

Faca a intercalacao m ultipla dos arquivos f


1
, f
2
, f
3
, ... .
Obs.: Se o n umero nf de arquivos f
i
e razoavelmente grande (mais que 5 a
10), pode ser usada uma la de prioridades de tamanho nf.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 351
Ordenacao digital ou por distribuicao (radix sort)

O algoritmo baseia-se em procedimentos que eram utilizados para


ordenar cartoes perfurados com maquinas classicadoras.

A chave de cada registro de informacao e tratada como uma cadeia


de caracteres (ou um n umero numa base conveniente b) de
comprimento m.

Os registros sao distribudos em b sequencias, conforme o ultimo


caractere da chave (mantendo a ordem relativa original).

As b sequencias sao (conceitualmente) concatenadas em ordem


crescente do caractere usado na distribui cao.

Os dois passos anteriores sao repetidos para o pen ultimo, o


antepen ultimo, etc, caractere da chave.

Apos m distribui coes, o vetor estara ordenado.

O n umero de opera coes e no mnimo da ordem de O(nm),


dependendo da implementacao.

O algoritmo e estavel.
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 352
Ordenacao digital (cont.)
Exemplo (m=2):
Vetor original:
07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12
Distribui c~ao pelo ultimo dgito:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9:
30 40 40 | | 72 92 42 12 | 73 23 03 | 44 | 65 | | 07 87 27 | 58 78 | 49 09 29
Distribui c~ao pelo penultimo d gito:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9:
03 07 09 | 12 | 23 27 29 | 30 | 40 40 42 44 49 | 58 | 65 | 72 73 78 | 87 | 92
Resultado:
03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Algoritmos de ordenacao 353
FIM
c 2011 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao FIM 354

You might also like