7/31/2019 estrutura de dados e tcnicas de programao
1/89
Estruturas de Dados
e
Tecnicas de Programacao
Tomasz Kowaltowski
Instituto de ComputacaoUniversidade Estadual de Campinas
www.ic.unicamp.br/tomaszc2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao 1
Copyright c 2010 Tomasz Kowaltowski
Instituto de Computacao
Universidade Estadual de Campinas
Algumas transparencias foram adaptadas da apostila Estruturas de Dadose Tecnicas de Programacao de autoria de Claudio L. Lucchesi e TomaszKowaltowski.
Estas transparencias somente podem ser copiadas para uso pessoal dosdocentes e alunos das disciplinas oferecidas pelo Instituto de Computa caoda UNICAMP.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao 2
Introducao
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 3
Pre-requisito e objetivos
Pre-requisito: curso basico de programacao em C
Objetivos:
Programacao em (relativamente) baixo nvel Tecnicas de programacao e estruturacao de dados Preparacao para:
Analise de algoritmos Programacao de sistemas Programacao em geral Bancos de dados Engenharia de software . . .
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 4
7/31/2019 estrutura de dados e tcnicas de programao
2/89
Programa Introducao a analise de algoritmos Estruturacao elementar de dados: matrizes, registros, apontadores Estruturas lineares: pilhas, filas, filas duplas Recursao e retro cesso Arvores binarias: representacao, percursos Arvores gerais: representacao, percursos
Aplicacao de arvores:arvores de busca (AVL), filas de prioridade,arvores B, arvores digitais
Listas generalizadas Espalhamento Processamento de cadeias de caracteres Gerenciamento de memoria Algoritmos de ordenacao Algoritmos em grafos
Tipos abstratos de dados e orientacao a objetosc2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Introducao 5
Bibliografia
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliografia 6
A. Drozdek.Estrutura de Dados e Algoritmos em C++.Thomson, 2002.
J. L. Szwarcfiter 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 Computacao UNICAMP, 2003.
P. Feofiloff.Algoritmos em Linguagem C.Elsevier Editora Ltda., 2009.
G. H. Gonnet.
Handbook of Algorithms and Data Structures.Addison-Wesley, 1984.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliografia 7
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.
D. F. Stubbs and N. W. Webre.
Data Structures with Abstract Data Types and Pascal.Brooks/Cole, 1985.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliografia 8
7/31/2019 estrutura de dados e tcnicas de programao
3/89
A. M. Tenenbaum and M. J. Augenstein.Data Structures using Pascal.Prentice-Hall, 1986.
N. Wirth.
Algorithms + Data Structures = Programs.Prentice-Hall, 1976.
N. Ziviani.Projeto de Algoritmos (2a. ed.)Thomson, 2004.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Bibliografia 9
Nocoes de Analise de Algoritmos
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Nocoes de Analise de Algoritmos 10
Escolha da estrutura
Importancia da escolha de estrutura de dados busca de um elementonuma sequencia:
. . .x = a [ k ] ;. . .
. . .p = a ; i = 0 ;w h i l e ( i prox ;i ++;
}x = p> i n f o ;. . .
(a) (b)
(a) Numero de operacoes constante (vetor).(b) Numero de operacoes proporcional a k (lista ligada).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Nocoes de Analise de Algoritmos 11
Exemplo de analise de trechos de programas
. . .x = a+b ;. . .
. . .f o r ( i =0; i
7/31/2019 estrutura de dados e tcnicas de programao
4/89
Significado intuitivo da notacao O()
c = O(1) para qualquer constante c
2 = O(1)
5n + 2 = O(n)5n2 + 5n + 2 = O(n2)
n2 = O(n3)
nk = O(nk+1), k 0
loga n = O(logb n), a, b > 0
log2 n = O(log10 n)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Nocoes de Analise de Algoritmos 13
Exemplo de analise de um procedimento de ordenacao
v o i d Ordena( i n t v [] , i n t n ) {i n t i , k , m, t ;f o r ( i =0; i
7/31/2019 estrutura de dados e tcnicas de programao
5/89
Exemplo (cont.)
n M1 M2
16 16 400
32 32 500
64 64 600
128 128 700
256 256 800
512 512 9001024 1024 1000
2048 2048 1100
. . . . . . . . .
220 1.048.576 2000
221 2.097.152 2100
. . . . . . . . .
230 1.073.741.824 3000
Supondo que a unidade seja 1 microssegundo, 2.097.152s corresponde a 17 minutos e1.073.741.824s equivale a cerca de 12 horas.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Nocoes de Analise de Algoritmos 17
Execucao de programas
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execucao de programas 18
Exemplo de funcoes simples
v o i d g ( i n t x , i n t y ) { y = x ;
} / g /
v o i d f ( i n t z ) {i n t y ; c h a r b ;y = 2 3 5 ;g( y , z );
} / f /
i n t main () {i n t i ; c h a r c ;c h a r v [ 5 ] ;
f ( & i ) ;r e t u r n 0 ;} / main /
Pilha de execucao (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.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execucao d e pr ogramas 19
Exemplo de funcoes com alocacao dinamica
t y p e d ef c h ar Cad eia [ 5 ] ;t y p e d e f C a d e i a ApCadeia ;t y p ed e f s t r u c t {
C a d e i a n om e ;i n t i d a d e ;
} Reg , ApReg ;
ApCadeia apc ;ApReg apr ;i n t a p i ;
v o i d Aloca (ApCadeia c , ApReg r ) {a p i = m a l l o c ( s i z e o f ( i n t ) ) ; a p i = 1 0 ; c = m a l l o c ( s i z e o f ( C a d e i a ) ) ; r = m a l l o c ( s i z e o f ( R e g ) ) ;
} / A l o c a /
i n t main () {A l o c a (& ap c , & a p r ) ; f r e e ( a p c ) ;f r e e ( a p r ) ; f r e e ( a p i ) ;r e t u r n 0 ;
} / main /
memoria dinamica
pilha de execucao
apc apr api
global main
c r
Aloca
10
10
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execucao de programas 20
7/31/2019 estrutura de dados e tcnicas de programao
6/89
Exemplo de funcao recursiva
i n t main () {i n t m;
m = f a t ( 4 ) ;r e t u r n 0 ;
} / main /
i n t f a t ( i n t n ) {i f (n==0)
r e t u r n 1 ;e l s e
r e t u r n n f a t ( n 1) ;} / f a t /
m res n
4
res n
3
res n
2
res n
1
res n
011262424
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Execucao d e pr ogramas 21
Estruturas ligadas
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 22
Listas ligadas simples
p
. . .
Declaracoes (equivalentes):
t y p e d e f
s t r u c t R e g L i s t a L i s t a ;t y p e d e f
s t r u c t R e g L i s t a {T i n f o ;L i s t a p r o x ;
} R e g L i s t a ;
t y p e d e f
s t r u c t R e g L i s t a {T i n f o ;s t r u c t R e g L i s t a prox ;
} R e g L i s t a , L i s t a ;
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 23
Insercao e remocao com passagem por valor
. . . x . . .
p q
v o i d I n s e r e ( L i s t a p , T x ) {L i s t a q =
m a l l o c ( s i z e o f ( R e g L i s t a ) ) ;q>i n f o = x ;q>p r o x = p>prox ;p>p r o x = q ;
}
v o i d R em ov e ( L i s t a p , T x ) {L i s t a q = p>prox ; x = q> i n f o ;p>p r o x = q>prox ;f r e e ( q ) ;
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 24
7/31/2019 estrutura de dados e tcnicas de programao
7/89
Insercao e remocao com passagem por valor (cont.)
. . . x . . .
p q
O argumento p e o apontador para o predecessor do no a ser inseridoou 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, inclusivese ela for vazia.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 25
Insercao e remocao com passagem por referencia
. . . x . . .
p q
v o i d I n s e r e ( L i s t a p , T x ) {L i s t a q =
m a l l o c ( s i z e o f ( R e g L i s t a ) ) ;q>i n f o = x ;q>p r o x = p ;p = q ;
}
v o i d Remove( Lis ta p , T x ) {L i st a q = p ; x = q> i n f o ;p = q>prox ;f r e e ( q ) ;
}
Esta convencao elimina os problemas da passagem por valor. Note-se queas variaveis p e q tem tip os diferentes.
c2010 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 funcoes basicas.O campo de informacao do no cabeca pode ser aproveitado para guardaralguma informacao adicional (por exemplo, o comprimento da lista).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 27
Lista simples circular
p
. . .
Problema: lista vazia?
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 28
7/31/2019 estrutura de dados e tcnicas de programao
8/89
Lista circular com no cabeca
p
. . .
Lista vazia:
p
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 29
Busca em lista circular com no cabeca sentinelas
L i s t a B u s c aC i r c u l ar (L i s t a p , T x ) {
/ B us ca s em s e n t i n e l a /L i s t a q = p ;do {
q = q>prox ;} w h i l e (( q!=p) &&
( q> i n f o != x ) ) ;i f ( q==p)
r e t u r n NULL;e l s e
r e t u r n q ;}
L i s t a B u s c a C i r c u l a r (L i s t a p , T x ) {
/ B us ca 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>prox ;
} w h i l e ( q>i n f o != x ) ;i f ( q==p)
r e t u r n NULL;e l s e
r e t u r n q ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 30
Lista duplamente ligada com no 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.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 31
Operacoes sobre listas duplamente ligadas
t y p e d e f
s t r u c t R e g L i s t a D u p l a {T i n f o ;s t r u c t R e g L i s t a D u p l a esq , d i r ;
} R e g L i s t a D u p l a , L i s t a D u p l a ;
v o i d I n s e r e D u p l a E s q (L i s t a D u p l a p , T x ) {
L i s t a D u p l a q =m a l l o c ( s i z e o f ( R e g L i s t a D u p l a ) ) ;
q> i n f o = x ;q>e s q = p>esq ;q>d i r = p ;p>es q>d i r = q ;p>e s q = q ;
}
v o i d RemoveDupla(L i s t a D u p l a p , T x ) {
p>es q>d i r = p>d i r ;p>d i r >e s q = p>esq ; x = p> i n f o ;f r e e ( p ) ;
}
A funcao RemoveDupla supoe que ha pelo menos um elemento na lista.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 32
7/31/2019 estrutura de dados e tcnicas de programao
9/89
Exemplo: operacoes com polinomiosSeja um polinomio de grau n:
P(x) = anxn + an1x
n1 + . . . + a1x1 + a0x
0
onde an = 0, exceto possivelmente no caso n = 0.
Representacao ligada omite os termos nao nulos. Por exemplo, ospolinomios:
P1(x) = 5x20 3x5 + 7 e P2(x) = 0:
podem ser representados por:
-1p1 5 20 -3 5 7 0
-1p2
Por convencao, o expoente do no cabeca e -1.c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 33
Exemplo de funcao: impressao
t y pe d ef s t r u c t AuxPol {i n t expo ;f l o a t c o e f ;s t r u c t AuxPol prox ;
} Termo , P o l i n o m i o ;
v o i d I m p r i m e P o l i n o m i o ( P o l i n o m i o p ) {i f ( p>prox==p) {
p r i n t f ( P o li n o m i o n u l o \n );r e t u r n ;
}p = p>prox ;w h i l e ( p>expo!=1) {
p r i n t f ( ( %2 d , % 5 . 1 f ) ,p>expo ,p>c o e f ) ;
p = p>prox ;}p r i n t f ( \n );
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 34
Soma de polinomios: paradigma de intercalacao
-1ppp0
. . .pp
-1qqq0
-1rrr0
. . .rr
As variaveis pp e qq representam os termos correntes dos polinomiosdentro da malha de repeticao e a variavel rr aponta para o ultimo termo jacalculado 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 dedois polinomios po de ser calculado como uma sequencia de somas deprodutos de um polinomio por um termo.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 35
Matrizes esparsas
Exemplo:
50 0 0 0
10 0 20 00 0 0 0
30 0 60 5
Dada uma matriz n n, quando o numero de elementos nao nulos e umapercentagem pequena de n2 (nao e o caso do exemplo!), pode serconveniente representar a matriz por meio de uma estrutura de listasortogonais.
Suporemos, neste exemplo, que as linhas e as colunas sao numeradas a
partir de 1.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 36
7/31/2019 estrutura de dados e tcnicas de programao
10/89
Matrizes esparsas: listas ortogonais
50 0 0 010 0 20 0
0 0 0 030 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 cabecas daslinhas e das colunas (super-cabeca!).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 37
Operacoes sobre matrizes esparsas
Alguns exemplos:
t y p e d e f
s t r u c t R e g E s p a r s a {i n t l i n h a , c o l u n a ;d ou b l e v a l o r ;s t r u c t R e g E s p a r s a d i r e i t a , a b a i x o ;
} RegEsparsa , M a t r i z ;
v o i d I n i c i a l i z a M a t r i z ( M a tr i z a , i n t m, i n t n ) ;v o i d L i b e r a M a t r i z ( M a t r i z a ) ;d ou b l e E l e m e n t o M a t r i z ( M a t r i z a , i n t i , i n t j ) ;v o i d A t r i b u i M a t r i z ( M a t r iz a , i n t i , i n t j , d ou b l e x ) ;v o i d S o m aM a t ri z e s ( M a t r i z a , M a t r i z b , M a t r i z c ) ;v o i d M u l t i p l i c a M a t r i z e s ( M a t r iz a , M a t r iz b , M a t r iz c ) ;
E importante notar os casos em que a passagem do argumento do tipoMatriz e feita por referencia. (Nas duas ultimas operacoes, a variavel crecebe o resultado.)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas ligadas 38
Estruturas lineares
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 39
Estruturas lineares em geral: operacoes tpicas
selecionar e modificar 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;
. . .
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 40
7/31/2019 estrutura de dados e tcnicas de programao
11/89
Estruturas lineares particulares
Pilha (stack): insercao e remocao na mesma extremidade da estrutura
Fila (queue): insercao numa extremidade (fim) e remocao na outraextremidade (incio)
Fila dupla (double ended queue): insercao e remocao em ambasextremidades da estrutura
c2010 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.c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 42
Pilha: implementacao sequencial (cont.)
. . .. . .0
topo
empilha (insere)
desempilha (remove)
t y p e d e f
s t r u c t {i n t topo ;
T el eme nt os [TAM MAX] ;} P i l h a ;
v o i d E m p i l h a ( P i l h a p , T x ) {i f ( ( p ) . t op o==(TAM MAX1) )
T r a t aE r r o ( P i l h a c h e i a ) ;( p ). t opo++;( ( p ) . e l e m e n t o s ) [ ( p ) . t o p o ] = x ;
}
Exerccio: a funcao Desempilha.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 43
Pilha: implementacao ligada
topo
. . .
Pilha vazia:
topo
(Uma lista ligada simples.)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 44
7/31/2019 estrutura de dados e tcnicas de programao
12/89
Pilha: implementacao ligada (cont.)
topo
. . .
t y pe d ef s t r u c t E l e m P i l h a {T i n f o ;s t r u c t E l e m P i l h a prox ;
} E l e m P i l h a , P i l h a ;
v o i d E m p i l h a ( P i l h a p , T x ) {P i l ha q =
m a l l o c ( s i z e o f ( E l e m P i l h a ) ) ;i f ( q==NULL )
T r a t a E r r o ( F a l t a m emoria );q> i n f o = x ;qP r o x = p ;p = q ;
}
Exerccio: a funcao Desempilha.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 45
Fila: implementacao sequencial
. . . . . . . . .
frente fim
remove insere
Convencao: frente precede o primeiro elemento da fila; consequentemente,
o tamanho da fila e dado por fimfrente.
Fila vazia:
. . . . . .
frentefim
Condicao de fila vazia: frente== fim.Inicialmente: frente= fim = 1.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 46
Fila: implementacao ligada circular
fila
frente
. . .fim
Fila vazia:
fila
frentefim
A fila pode ser representada por uma unica variavel (fila) ou um par devariaveis (frente e fim).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 47
Fila: implementacao sequencial circular
n-1 0 12
3
... frente
...
fim
...
Convencao: frente precede o primeiro elemento da fila; consequentemente,
o tamanho da fila e dado por (fimfrente+ n)%n.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 48
7/31/2019 estrutura de dados e tcnicas de programao
13/89
Fila: implementacao sequencial circular (cont.)
n-1 0 12
3
... frente
...
fim
...
Condicoes:
Inicial: frente== fim == 0 (ou qualquer outro valor) Fila vazia: frente== fim Fila cheia: frente== fim (a mesma condicao!) Solucao 1: sacrificar uma posicao do vetor; a condicao de fila cheia
fica: frente== (fim + 1)%n. Solucao 2: uma variavel adicional inteira com o tamanho da fila ou
booleana indicando se a fila esta vazia.c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 49
Fila: implementacao sequencial circular (cont.)
n-1 0 1 23
... frente
...
fim
...
# d e f i n e TAM MAX FILA 100 0
t y p ed e f s t r u c t {i n t f r e n t e , f i m ;T el eme nt os [TAM MAX FILA ] ;
} F i l a ;
v o i 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 ) . fi m+1)%TAM MAX FILA))
T r a t aE r r o ( F i l a c h e i a ) ;( f ) . f i m = ( ( f ) . fi m+1)%TAM MAX FILA;( f ) . e l e m e n t o s [ ( f ) . f i m ] = x ;
}
Exerccio: a funcao RemoveFila.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Estruturas lineares 50
Aplicacoes de pilhas
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 51
Aplicacoes de pilhas
Processamento de linguagens parenteticas:
linguagens de programacao XML
Implementacao da recursao
Percurso de estruturas hierarquicas (arvores)
Avaliacao expressoes em notacao pos-fixa (notacao polonesa reversa)
Transformacao entre notacoes
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 52
7/31/2019 estrutura de dados e tcnicas de programao
14/89
Exemplo de aplicacao simples: balanceamento de parenteses
Correto Incorreto
(
() )[()] [)
[]()[()[]] ()()[
((([[[]]]))) )(
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 53
Balanceamento de parenteses (cont.)
Pilha Resto da sequenciaVazia ([([][()])])( [([][()])])
([ ([][()])])
([( [][()])])
([([ ][()])])
([( [()])])
([([ ()])])
([([( )])])
([([ ])])
([( )])
([ ])
( )
Vazia
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 54
Notacoes para expressoes aritmeticas
Infixa: um operador unario precede o operando um operador binario separa os dois operandos parenteses indicam prioridades
Pos-fixa: os operadores seguem os operandos
Pre-fixa: os operadores precedem os operandos
Exemplos:
infixa p os-fixa pre-fixa
a a aa + b ab+ +aba + b c abc + +a bc
(a + b) c ab + c + abc
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 55
Exemplo: avaliacao de expressoes sob forma pos-fixa
Notacao infixa: (3 + 5) 2 (10 3)/2
Notacao pos-fixa: 3 5 + 2 10 3 2/
Estados consecutivos da pilha:
Pilha EntradaVazia 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/1 6 7 2 /
16 3 13 Vazia
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 56
7/31/2019 estrutura de dados e tcnicas de programao
15/89
Exemplo: transformacao de notacao infixa para pos-fixa
a b + c d e/f g h
Entrada infixa: a b+c de / fg h
Sada pos-fixa: a b c d ef/+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 aparecena entrada um operador de prioridade menor ou igual.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 57
Transformacao de notacao infixa para pos-fixa (cont.)
Sada Pilha Entradaa b + c d e/f g h
a b + c d e/f g ha b + c d e/f g hab + c d e/f g hab + c d e/f g h
ab + c d e/f g hab c + d e/f g hab c + d e/f g hab cd + e/f g hab cd + e/f g hab cde + /f g hab cde + /f g h
(continua)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 58
Transformacao de notacao infixa para pos-fixa (cont.)
Sada Pilha Entradaab cde + /f g hab cde +/ f g h
ab cde f +/ g hab cde f / + g hab cde f /+ g hab cde f /+ g hab cde f / + g hab cde f / + g hab cde f / + gh ab cde f / + gh ab cde f / + gh
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Aplicacoes de pilhas 59
Exemplos de recursao
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 60
7/31/2019 estrutura de dados e tcnicas de programao
16/89
Exemplo 1: funcao fatorial
i n t f a t o r i a l ( i n t n ) {i f (n==0)
r e t u r n 1 ;
e l s er e t u r n n f a t o r i a l (n 1) ;
}
i n t f a t o r i a l ( i n t n ) {i n t i , f =1;f o r ( i =1; i
7/31/2019 estrutura de dados e tcnicas de programao
17/89
Torres de Hanoi: movimento do maior disco
X Y Z
. .. .. .
N-1
Move X para Y
X Y Z
. .. .. .
N-1
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 65
Torres de Hanoi: transferencia recursiva final de N-1 discos
X Y Z
. .. .. .
N-1
Hanoi(Z,Y,X,N-1)
X Y
. .. .. .
N
Z
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 66
Torres de Hanoi: funcao Hanoi
v o i d H a n o i ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {i f ( n>0) {
H a no i ( o r g , a ux , d e s t , n 1) ;p r i n t f ( Mova d e %c p a r a % c\n , o r g , d e s t ) ;H a no i ( a u x , d e s t , o r g , n 1) ;
}}
Chamada inicial: Hanoi(A,B,C,64).
Numero de movimentos: 2N 1 (prova por inducao).
Este e o numero mnimo.
c2010 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 p a r a B Mova de A p a r a BM o v a d e A p a r a CM o v a d e B p a r a C
N=2: Mova de A p a r a BM o v a d e C p a r a A
Mova de A p a r a C Mova de C p a r a BMova de A p a r a B Mova de A p a r a BM o v a d e C p a r a B
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 68
7/31/2019 estrutura de dados e tcnicas de programao
18/89
Torres de Hanoi: exemplos de sada (cont.)
N=4
Mova de A pa ra C Mova de C pa ra BMova de A pa ra B Mova de C pa ra A
Mova de C pa ra B Mova de B pa ra AMova de A pa ra C Mova de C pa ra BMova de B pa ra A Mova de A pa ra CMova de B pa ra C Mova de A pa ra BMova de A pa ra C Mova de C pa ra BM o v a d e A p a r a B
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 69
Exemplo 4: geracao de permutacoes
Problema: Gerar todas as permutacoes dos m elementos de um vetor.
. . .
0 k-1 k m-1
. . .
Suponha uma funcao Permuta(k,m) que gera (imprime) todas aspermutacoes dos elementos de 0 a k-1, seguidas dos elementos de k am-1.
A chamada inicial Permuta(m,m) resolveria o problema.
A solucao consistira em trocar o elemento de ndice k-1consecutivamente com todos os elementos que o precedem e aplicar afuncao recursivamente.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 70
Geracao das permutacoes (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
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 71
Geracao das permutacoes (cont.)
. . .
0 k-1 k m-1
. . .Funcao Permuta:
v o i d Permuta( i n t k , i n t m) {i f ( k==0)
Imprime (m);
e l s e {i n t i ;f o r ( i=k 1; i >=0; i ) {
T r o c a ( i , k 1) ;Permuta(k 1,m);T r o c a ( i , k 1) ;
}}
}
A funcao Imprime imprime os m elementos do vetor.
Chamada inicial: Permuta(m,m).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 72
7/31/2019 estrutura de dados e tcnicas de programao
19/89
Geracao das permutacoes (cont.)
Sada de Permuta(2,3)
1 2 32 1 31 3 23 1 23 2 1
2 3 1
Desafio: imprimir em ordem lexicografica:
1 2 31 3 22 1 32 3 13 1 23 2 1
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de recursao 73
Exemplos de retrocesso
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 74
Exemplo 1: movimentos do cavalo
Movimentos p ossveis do cavalo no jogo de xadrez:
-2
-2
-1
-1
0
0
1
1
2
2
0
12
3
4
5 6
7
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 75
Movimentos do cavalo (cont.)
Um percurso da posicao (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
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 76
7/31/2019 estrutura de dados e tcnicas de programao
20/89
Movimentos do cavalo (cont.)
Um percurso da posicao (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 solucao para o tabuleiro da transparencia anterior(provar!).
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 77
Movimentos do cavalo (cont.)
Tipos de solucao:
1. Achar uma solucao
2. Achar uma solucao que cobre todas as posicoes livres3. Enumerar todas as solucoes
Observacao: Esta nao e a melhor maneira de resolver este problema masilustra bem o mecanismo geral de retrocesso.
c2010 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
12
3
4
5 6
7
# d e f i n e TAM MAX 20# d e f i n e NUM MOV 8typ e d e f enum { f a l s e , t r ue } Boolean ;i n t t a b [ TAM MAX ] [ TAM MAX ] ;i n t d l [NUM MOV] = { 1, 2, 2, 1, 1 , 2 , 2 , 1 } ;
i n t dc [NUM MOV] = { 2 , 1 , 1, 2, 2, 1, 1 , 2 } ;
v o i d ImprimeT ab( i n t tam) {i n t i , j ;f o r ( i =0; i
7/31/2019 estrutura de dados e tcnicas de programao
21/89
Movimentos do cavalo: exemplo de entrada e sada0
0
1
1
2
2
3
3
4
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
E n t ra d a S a d a
5 1 4 9 12 10 0 10 13 6 3 04 4 5 2 11 8 00 4 0 7 14 0 13 4 1 0 0 0 154 0
1 1c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 81
Movimentos do cavalo: achar uma solucao completaB o o l e a n T e nt a M ov i m en t o ( i n t tam , i n t num, i n t l i n ,
i n t c o l , i n t l d , i n t cd , i n t n o c ) {i n t k , l p , cp ;B oo le an r e s = f a l s e ;i f ((0
7/31/2019 estrutura de dados e tcnicas de programao
22/89
Distancia de edicao: funcao Distancia
i n t D i s t a n c i a ( c h a r t e s t e , c h a r c o r r e t a ) {i n t dIns , dRem, dSub ;i f ( ( ( t e st e)==NUL CHAR) && (( correta)==NUL CHAR))
r e t u r n 0 ;dI ns = dRem = dSub = INT MAX;i f ( ( ( te st e )!=NUL CHAR) && (( co rr et a )!=NUL CHAR) &&
( ( t e s t e ) = = ( c o r r e t a ) ) )r e t u r n D i s t a n c i a ( t e s t e + 1, c o r r e t a + 1) ;
i f ( ( ( te st e )!=NUL CHAR) && (( co rr et a )!=NUL CHAR) )d Su b = c u s t o S u b+ D i s t a n c i a ( t e s t e + 1 , c o r r e t a +1 ) ;
i f ( ( teste )!=NUL CHAR)dRem = c u st o R em+ D i s t a n c i a ( t e s t e + 1 , c o r r e t a ) ;
i f ( ( co rr et a )!=NUL CHAR)d I n s = c u s t o I n s + D i s t a n c i a ( t e s t e , c o r r e t a + 1 );
r e t u r n m i n ( d I n s , m i n ( dRem , d Su b ) ) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 85
Distancia de edicao: desafios
Melhorar o desempenho do algoritmo: o algoritmo e exp onencial naosendo viavel, sob esta forma, em aplicacoes praticas
Imprimir o numero de operacoes de cada tipo (avanco, insercao,remocao e substituicao) para obter a solucao
Imprimir a sequencia de operacoes para obter a solucao
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Exemplos de retrocesso 86
Eliminacao da recursao
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 87
Esquema de funcao recursiva
v o i d E x em p l o ( T1 x 1 , T2 x 2 , . . . ) {S 1 y 1 ; S 2 y 2 ; . . . ;Ci ; / Comandos i n i c i a i s /i f (E ( . . . ) ) {
C0 ; / C as o b a s e /} e l s e { / C ha ma da s r e c u r s i v a s /
C1; Exemplo(e11 , e12 , . . . ) ;C2; Exemplo(e21 , e22 , . . . ) ;C3; Exemplo(e31 , e32 , . . . ) ;. . . ;
Cm; Exemplo (em1, em2 , . . . ) ;Cf ;
}}
Os smbolos Ci, C0, C1, . . ., Cm e Cf representam sequencias,possivelmente vazias, de comandos.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 88
7/31/2019 estrutura de dados e tcnicas de programao
23/89
Esquema de eliminacao da recursao
v o i d E x e m p lo( T1 x 1 , T2 x 2 , . . . ) {S 1 y 1 ; S 2 y 2 ; . . . ;Ci ; / Comandos i n i c i a i s /i f (E ( . . . ) ) {
C0 ; / C a s o b a s e /} e l s e {
/ C ha ma da s r e c u r s i v a s /C 1; E x e m p lo( e 11 , e 12 , . . . ) ;C 2; E x e m p lo( e 21 , e 22 , . . . ) ;C 3; E x e m p lo( e 31 , e 32 , . . . ) ;. . . ;
Cm; Exemplo( em1, em2 , . . . ) ;Cf ;
}}
typ e d e f enum { chamada1 , chamada2 , chamada3 , . . . } Chamadas ;typ e d e f enum { e n t ra d a , s a i d a , r e t o r n o } Acoes ;
v o i d E x em p l o ( T1 x 1 , T2 x 2 , . . . ) {S 1 y 1 ; S 2 y 2 ; . . . ; / 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 t 1 , T2 t 2 , . . . ; / v a r i a v e i s t e m p o r a r i a s /P i l h a f ; C ha ma da s c h ; A c oe s a c ao ;I n i c i a l i z a P i l h a (&f ) ; acao = en tr ad a ;
do {s w i t c h ( acao ) {
c a se ( e n t r a d a ) : . . . b re a k ;c a se ( r e t o r n o ) : . . . b re a k ;c a se ( s a i d a ) : b re a k ;
}} w h i l e ( a c a o ! = s a i d a ) ;
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 89
Esquema de eliminacao da recursao (cont.)
v o i d E x e m p lo( T1 x 1 , T2 x 2 , . . . ) {S 1 y 1 ; S 2 y 2 ; . . . ;Ci ; / Comandos i n i c i a i s /i f (E ( . . . ) ) {
C0 ; / C a s o b a s e /} e l s e {
/ C ha ma da s r e c u r s i v a s /C 1; E x e m pl o( e 11 , e12 , . . . ) ;C 2; E x e m pl o( e 21 , e22 , . . . ) ;C 3; E x e m pl o( e 31 , e32 , . . . ) ;. . . ;
Cm; Exemplo(em1, em2 , . . . ) ;Cf ;
}}
c a se ( e n t r a d a ) :Ci ; / Comandos i n i c i a i s /i f (E ( . . . ) ) {
C0 ; a ca o = r e t o r n o ; / C as o b a s e /} e l s e { / P r i m e i r a c ha ma da r e c u r s i v a /
C1; Emp il ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada1 );t 1 = e 1 1 ; t 2 = e 1 2 ; . . . ;x1 = t 1 ; x2 = t 2 ; . . . ; / R e c a l c u l a a r g u me n t o s /
}b re a k ;
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 90
Esquema de eliminacao da recursao (cont.)
v o i d E x e m p lo( T1 x 1 , T2 x 2 , . . . ) {S 1 y 1 ; S 2 y 2 ; . . . ;Ci ; / Comandos i n i c i a i s /i f (E ( . . . ) ) {
C0 ; / C a s o b a s e /} e l s e {
/ C ha ma da s r e c u r s i v a s /C 1; E x e m p lo( e 11 , e 12 , . . . ) ;C 2; E x e m p lo( e 21 , e 22 , . . . ) ;C 3; E x e m p lo( e 31 , e 32 , . . . ) ;
. . . ;Cm; Exemplo( em1, em2 , . . . ) ;Cf ;
}}
c a se ( r e t o r n o ) :i f ( P i l h a V a z i a ( f ) ) a c ao = s a i d a ;e l s e {
Desempil ha ( f ,&x1,&x2 , . . . , & y1,&y2 , . . . , & ch );s w i t c h ( c h ) {
c a se (chamada1 ):C2; Emp il ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada2 );t 1 = e 2 1 ; t 2 = e 2 2 ; . . . ;x 1 = t 1 ; x 2 = t 2 ; . . . ;a c a o = e n t r a d a ; b re a k ;
c a se (chamada2 ):C3; Emp il ha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada3 );t 1 = e 3 1 ; t 2 = e 3 2 ; . . . ;x 1 = t 1 ; x 2 = t 2 ; . . . ;a c a o = e n t r a d a ; b re a k ;
. . . ;c a se (chamadam ) :
Cf ; b re a k ;} / s w i tc h ( c h ) /
}b re a k ;
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 91
Exemplo 1: funcao fatorial
i n t f a t o r i a l ( i n t n ) {i f (n==0)
r e t u r n 1 ;e l s e
r e t u r n n f a t o r i a l ( n 1) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 92
7/31/2019 estrutura de dados e tcnicas de programao
24/89
Funcao fatorial (cont.)
i n t f a t o r i a l ( i n t n) {i f (n==0)
r e t u r n 1 ;e l s e
r e t u r n n f a t o r i a l ( n 1);}
typ e d e f enum { chamada1 } Chamadas ;typ e d e f enum { e n t ra d a , s a i d a , r e t o r n o } Acoes ;
i n t f a t o r i a l ( i n t n ) {i n t r e s , t 1 ;P i l h a f ; C ha ma da s c h ; A c oe s a c ao ;I n i c i a l i z a P i l h a (&f ) ; acao = en tr ad a ;
do {s w i t c h ( acao ) {c a se ( e n t r a d a ) : . . . b re a k ;c a se ( r e t o r n o ) : . . . b re a k ;c a se ( s a i d a ) : b re a k ;
}} w h i l e ( a c a o ! = s a i d a ) ;r e t u r n r e s ;
} / f a t o r i a l /
c2010 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 e t u r n 1 ;
e l s er e t u r n n f a t o r i a l ( n 1);
}
c a se ( e n t r a d a ) :i f (n==0) {
r e s = 1 ; a ca o = r et o rn o ;} e l s e {
Empil ha ( f , n , chamada1 );t 1 = n ; n = t 1 1;
}b re a k ;
c2010 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 e t u r n 1 ;e l s e
r e t u r n n f a t o r i a l ( n 1);}
c a se ( r e t o r n o ) :i f ( P i l h a V a z i a ( f ) ) a c a o = s a i d a ;e l s e {
Desempi lha ( f ,&n,&ch );s w i t c h ( c h ) {
c a se (chamada1 ):r e s = n r e s ;b re a k ;
}b re a k ;
Obs.: Note como neste caso a variavel res e usada para guardar oresultado da funcao.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 95
Exemplo 2: funcao Hanoi
v o i d H a n o i ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {
i f ( ! ( n >0) );
e l s e {H a n o i ( o r g , a u x , d e s t , n 1) ;p r i n t f ( Mova d e %c p a r a % c\n , o r g , d e s t ) ;H a n o i ( a u x , d e s t , o r g , n 1) ;
}}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 96
7/31/2019 estrutura de dados e tcnicas de programao
25/89
Funcao Hanoi (cont.)
v o i d Ha n oi ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {i f ( ! ( n >0))
;e l s e {
Ha n oi ( or g , a u x , d e s t , n 1);p r i n t f ( Mo va d e % c p a r a % c\n , o r g , d e s t ) ;Ha n oi ( a u x , d e s t , or g , n1);
}}
typ e d e f enum { chamada1 , chamada2 } ;typ e d e f enum { e n t ra d a , s a i d a , r e t o r n o } Acoes ;v o i d H a n o i ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {
c h a r t 1 ; c h a r t 2 ; c h a r t 3 ; i n t t 4 ;P i l h a f ; C ha ma da s c h ; A c oe s a c ao ;I n i c i a l i z a P i l h a (&f ) ; acao = en tr ad a ;
do {s w i t c h ( acao ) {
c a se ( e n t r a d a ) : . . . ; b re a k ;c a se ( r e t o r n o ) : . . . ; b re a k ;c a se ( s a i d a ) : b re a k ;
}} w h i l e ( a c a o ! = s a i d a ) ;
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 97
Funcao Hanoi (cont.)
v o i d Ha n oi ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {i f ( ! ( n >0))
;e l s e {
Ha n oi ( or g , a u x , d e s t , n 1);p r i n t f ( Mo va d e % c p a r a % c\n , o r g , d e s t ) ;Ha n oi ( a u x , d e s t , or g , n1);
}}
c a se ( e n t r a d a ) :i f ( ! ( n >0) ) {
a ca o = r e t o r n o ;} e l s e {
Empil ha ( f , org , dest , aux ,n , chamada1 ) ;t 1 = o r g ; t 2 = a u x ; t 3 = d e s t ; t 4 = n 1;o r g = t 1 ; d e s t = t 2 ; a ux = t 3 ; n = t 4 ;
}b re a k ;
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 98
Funcao Hanoi (cont.)
v o i d Ha n oi ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {i f ( ! ( n >0))
;e l s e {
Ha n oi ( or g , a u x , d e s t , n 1);p r i n t f ( Mo va d e % c p a r a % c\n , o r g , d e s t ) ;Ha n oi ( a u x , d e s t , or g , n1);
}}
c a se ( r e t o r n o ) :i f ( P i l h a V a z i a ( f ) )
a c a o = s a i d a ;e l s e {
Desempil ha ( f ,&org ,&de st ,&aux,&n,&ch );s w i t c h ( c h ) {
c a se (chamada1 ):p r i n t f ( Mova d e %c p a r a % c\n , o r g , d e s t ) ;Empil ha ( f , org , dest , aux ,n , chamada2 ) ;t 1 = a u x ; t 2 = d e s t ; t 3 = o r g ; t 4 = n 1;o rg = t 1 ; d e s t = t 2 ; a ux = t 3 ; n = t 4 ;a c a o = e n t r a d a ;b re a k ;
c a se (chamada2 ):b re a k ;
}b re a k ;
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 99
Exemplo de eliminacao da recursao caudalAplicavel quando a ultima acao dentro do corpo da funcao e umachamada recursiva: reaproveita o mesmo registro de ativacao da funcao,mudando os valores dos argumentos.
v o i d H a n o i ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {i f ( n>0) {
H a no i ( o r g , a ux , d e s t , n 1) ;p r i n t f ( Mova d e %c p a r a % c\n , o r g , d e s t ) ;H a no i ( a u x , d e s t , o r g , n 1) ;
}}
v o i d H a n o i ( c h a r org , c h a r d e s t , c h a r aux , i n t n ) {c h a r t ;w h i l e ( n>0) {
H a n o i ( o r g , a u x , d e s t , n 1) ;p r i n t f ( Mova d e %c p a r a % c\n , o r g , d e s t ) ;
t = o r g ; o rg = a ux ; au x = t ;}}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Eliminacao da recursao 100
7/31/2019 estrutura de dados e tcnicas de programao
26/89
Recursao m utua: Analise sintatica
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 101
Exemplo simples de recursao mutua
i n t g ( i n t n ) ;
i n t f ( i n t n ) {
i f (n==0)r e t u r n 0 ;
e l s e
r e t u r n g ( n 1) ;}
i n t g ( i n t n ) {i f (n==0)
r e t u r n 1 ;e l s e
r e t u r n f ( n 1) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 102
Analise de expressoes
Expressoes com operadores binarios +, , , / e parenteses ( e ):
e = t1 t2 tn, n 1
t = f1 f2 fn, n 1
f = x ou f = ( e )
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 103
Programa de traducao de infixa para pos-fixa:
c h a r en tr ad a [TAM MAX] ;c h a r pe ;
v o i d E x p r e s s a o ( ) ;v o i d Termo ( ) ;v o i d F a t o r ( ) ;
v o i d InPos () {pe = &ent rad a [ 0 ] ;E x p r e s s a o ( ) ;i f ( ( pe)!= \0 )
E r r o ( ) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 104
7/31/2019 estrutura de dados e tcnicas de programao
27/89
Fator
f = x ou f = ( e )
v o i d F a t o r ( ) {c h a r c o r r e n t e = pe ;s w i t c h ( c o r r e n t e ) {
c a se a : c a se b : . . . : c a se z :S a i ( c o r r e n t e ) ; p e++; b re a k ;
c a se ( :pe++;E x p r e s s a o ( ) ;i f ( ( pe)== ) )
pe++;e l s e
E r r o ( ) ;b re a k ;
d e f a u l t :E r r o ( ) ;
}}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 105
Termo
t = f1 f2 fn, n 1
v o i d Termo() {c h a r op ;F a t o r ( ) ;do {
op = pe ;i f ( ( op== ) | | ( op== / )) {
pe++;F a t o r ( ) ;Sai (op );
} e l s eb re a k ; / do /
} w h i l e ( t r u e ) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 106
Expressao
e = t1 t2 tn, n 1
v o i d E x p r e s s a o ( ) {c h a r op ;Termo () ;do {
op = pe ;i f (( op==+ ) | | ( op== ) ) {
pe++;Termo () ;Sai (op );
} e l s eb re a k ; / do /
} w h i l e ( t r u e ) ;}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 107
Operador de exponenciacao
Fator redefinido:
f = p1 p2 pn, n 1Primario:
p = x ou p = ( e )
Prioridade? Solucao:
f = p ou f = p f
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 108
7/31/2019 estrutura de dados e tcnicas de programao
28/89
Fator redefinido
f = p ou f = p f
v o i d F a t o r ( ) {P r i m a r i o ( ) ;
i f ( ( pe)== ) {pe++;F a t o r ( ) ;Sai ( ) ;
}}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 109
Primario
p = x ou p = ( e )
v o i d P r i m a r i o ( ) {c o r r e n t e = pe ;s w i t c h ( c o r r e n t e ) {
c a se a : c a se b : . . . : c a se z :S a i ( c o r r e n t e ) ; p e++; b re a k ;
c a se ( :pe++;E x p r e s s a o ( ) ;i f ( ( pe)== ) )
pe++;e l s e
E r r o ( ) ;b re a k ;
d e f a u l t :E r r o ( ) ;
}}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 110
Analogia para expressoes e termos
e = t ou e = e t
t = f ou t = t f
Problemas:
como distinguir as alternativas
repeticao infinita no segundo caso (recursao esquerda)
v o i d E x p r e s s a o ( ) {. . . ;
i f ( ? ? ? )Termo ( ) ;
e l s e
E x p r e s s a o ( ) ;. . .
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Recursao mutua: Analise sintatica 111
Arvores binarias
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 112
7/31/2019 estrutura de dados e tcnicas de programao
29/89
E l d l 3 D fi i d bi i
7/31/2019 estrutura de dados e tcnicas de programao
30/89
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 temmais de 10 departamentos.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 117
Definicao de arvore binaria
Uma arvore binaria e um conjunto de nos que:
ou e vazio (arvore bin aria vazia)
ou contem um no especial denominado raiz da arvore e o resto doconjunto esta particionado em duas arvores binarias disjuntas(possivelmente vazias), denominadas subarvore esquerda e subarvoredireita.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 118
Representacao grafica, convencoes e conceitos
nvel 1
nvel 2
nvel 3
nvel 4
A
B
D E
G
C
F
H
Raiz da arvore: AFilho esquerdo de A: B Filho direito de A: CPai de F: C Irmao de E: DDescendentes de B: B, D, E e G Antepassados de H: H, F, C e AFolhas: D, G e H Nos internos: todos exceto as folhasNveis: indicados na figura Altura (profundidade) nvel maximo: 4
Subarvores binarias vazias: 9 Subarvores binarias nao vazias: 7Obs.: Alguns autores comecam a numeracao dos nveis a partir de zero.
c2010 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 log2(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 2h 1 nos
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 120
R li d R li d d
7/31/2019 estrutura de dados e tcnicas de programao
31/89
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 umapontador para a raiz.
c2010 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.
c2010 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 filhos esquerdos e direitos.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 123
Representacao sequencial: 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:
filho esquerdo: 2n + 1 (n 0)filho direito: 2n + 2 (n 0)pai: (n 1)/2 (n > 0)
A0
B1
I2
C3
F4
J5
M6
D7
E8
G9
H10
K11
L12
N13
O14
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 124
R t i l bi i l t P f did d
7/31/2019 estrutura de dados e tcnicas de programao
32/89
Representacao sequencial: 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
c2010 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
c2010 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
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 127
Percurso em largura
Percurso p or 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
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 128
I l t i d Eli i d d l
7/31/2019 estrutura de dados e tcnicas de programao
33/89
Implementacao recursiva de percursos
t y pe d ef s t r u c t NoArvBin {T i n f o ;s t r u c t NoArvBin esq , d i r ;
} NoArvBin , ArvBin ;
v o i d PreOrdem( ArvBin p) {i f (p!=NULL) {
V i s i t a ( p ) ;PreOrdem(p>e s q ) ;PreOrdem(p>d i r ) ;
}} / PreOrdem /
v o i d InOrdem( ArvBin p) {i f (p!=NULL) {
InOrdem(p>e s q ) ;V i s i t a ( p ) ;InOrdem(p>d i r ) ;
}} / InOrdem /
v o i d PosOrdem( ArvBin p) {i f (p!=NULL) {
PosOrdem(p>e s q ) ;PosOrdem(p>d i r ) ;V i s i t a ( p ) ;
}} / PosOrdem /
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 129
Eliminacao da recursao caudal
v o i d PreOrdem( ArvBin p) {i f (p!=NULL) {
V i s i t a ( p ) ;PreOrdem(p>e s q ) ;
PreOrdem(p>d i r ) ;}
} / PreOrdem /
v o i d PreOrdem( ArvBin p) {w h i l e (p!=NULL) {
V i s i t a ( p ) ;PreOrdem(p>e s q ) ;
p = p>d i r ;}
} / PreOrdem /
Transformacao analoga pode ser feita para a inordem.
E a pos-ordem?
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 130
Percurso em pre-ordem, usando uma pilha explcita
A figura indica a situacao inicial e final do percurso de uma arvorearbitraria (p ode ser vazia). Inicialmente, o ap ontador para a arvore deveestar no topo da pilha. Terminado o percurso, a pilha tera um elemento amenos.
c2010 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
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 132
Perc rso em pre ordem sando ma pilha (cont ) Perc rso em larg ra sando ma fila
7/31/2019 estrutura de dados e tcnicas de programao
34/89
Percurso em pre-ordem, usando uma pilha (cont.)
v o i d PreOrdem( ArvBin p) {P i l h a p l ;I n i c i a l i z a P i l h a (& p l ) ;Empilha(&pl , p );do {
Desempil ha(&pl ,&p );i f (p!=NULL) {
V i s i t a ( p ) ;E m p i l h a (& p l , p>d i r ) ;E m p i l h a (& p l , p>e s q ) ;
}} w h i l e ( ! P i l h a V a z i a ( p l ) ) ;
} / PreOrdem /
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 133
Percurso em largura, usando uma fila
Os nos da arvore a serem visitados sao guardados numa fila.
X
E D
nv el k
nv el k+1
Visita X
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 134
Percurso em largura, usando uma fila (cont.)
v o i d L a r g u r a ( A r v B i 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 {
R e m o v e F i l a (& f l , & p ) ;i f (p!=NULL) {
V i s i t a ( p ) ;I n s e r e F i l a (& f l , p>e s q ) ;I n s e r e F i l a (& f l , p>d i r ) ;
}} w h i l e ( ! F i l a V a z i a ( f l ) ) ;
} / L a r g u r a /
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 135
Comparacao dos percursos em pre-ordem e em largura
v o i d PreOrdem( ArvBin p) {P i l h a p l ;I n i c i a l i z a P i l h a (&p l ) ;Empilha(&pl , p );do {
Desempi lha(&pl ,&p );i f (p!=NULL) {
V i s i t a ( p ) ;E m p i l h a (& p l , p>d i r ) ;E m p i l h a (& p l , p>e s q ) ;
}} w h i l e ( ! P i l h a V a z i a ( p l ) ) ;
} / PreOrdem /
v o i d L a r g u r a ( A r v B i 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 {
R e m o v e F i l a (& f l , & p ) ;i f (p!=NULL) {
V i s i t a ( p ) ;I n s e r e F i l a (& f l , p>e s q ) ;I n s e r e F i l a (& f l , p>d i r ) ;
}} w h i l e ( ! F i l a V a z i a ( f l ) ) ;
} / L a r g u r a /
Quase identicos, exceto a troca de esquerda pela direita!
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 136
Preordem com pilha otimizada Pre ordem com pilha embutida: Deutsch Schorr e Waite
7/31/2019 estrutura de dados e tcnicas de programao
35/89
Preordem com pilha otimizada
v o i d PreOrdem( ArvBin p) {P i l h a p l ;B o ol e an f i m = f a l s e ;I n i c i a l i z a P i l h a (& p l ) ;do {
i f (p!=NULL) {
V i s i t a ( p ) ;i f ( p>d i r !=NULL)
Empilha ( pl , p>d i r ) ;p = p>esq ;
} e l s e i f ( P i l h a V a z i a ( p l ) )f i m = t r u e
e l s e
Desempi lha ( pl ,&p );} w h i l e ( ! f i m ) ;
} / PreOrdem /
c2010 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 n os 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.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 138
Pre-ordem com pilha embutida (cont.)v o i d DSW( Arv Bin p) {
A rv Bi n t = NULL ; A rv Bi n q ; B oo l ea n s o be ;do {
w h i l e (p!=NULL) { / a es qu er da /P r e V i s i t a ( p ) ; p>m a rc a = M a rc a Es q ; q = p>esq ;p>e sq = t ; t = p ; p = q ;
}s o be = t r u e ;w h i l e ( sob e && ( t !=NULL) ) {
s w i t c h ( t>marca) {c a se MarcaEsq : / a d i r e i t a /
I n V i s i t a ( t ) ; s ob e = f a l s e ; t>marca = MarcaDir ;q = p ; p = t >d i r ; t>d i r = t>e s q ; t>e s q = q ;b re a k ;
c a se MarcaDir : / s o b e /P o s V i s i t a ( t ) ; q = t>d i r ; t>d i r = p ; p = t ; t = q ;b re a k ;
}
}} w h i l e ( t !=NULL) ;
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 139
Desafios:
melhorar a pre-ordem com pilha otimizada
inordem com pilha otimizada
pos-ordem com pilha otimizada
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 140
Reconstrucao de arvores binarias Reconstrucao de arvores binarias (cont )
7/31/2019 estrutura de dados e tcnicas de programao
36/89
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 combinacao de pre- e pos-ordens naodeterminam a arvore de maneira unica.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 141
Reconstrucao de arvores binarias (cont.)
Verifica-se facilmente que a pre-ordem (ou a pos-ordem) combinada com ainordem determinam, de maneira unica, a forma da arvore. No caso dapre-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 subarvoresesquerda e direita
a partir da pre-ordem, sao determinadas as pre-ordens das subarvoresque tem os mesmos comprimentos das respectivas inordens
recursivamente sao reconstrudas as subarvores
O caso da pos-ordem e analogo.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 142
Representacoes externas de arvores binariasA
B
D E
G
C
F
H
percursos canonicos: inordem e pre (ou pos)-ordem (ja visto):
DBGEAFHCABDEGCFH
percurso canonico com indicadores de subarvores (pre-ordem):
A11B11D00E10G00C10F01H00
O ndice 0 indica a ausencia e 1 indica a existencia de filho esquerdoou direito.
descricao parentetica (inordem):
(((()D())B((()G())E()))A((()F(()H()))C()))
() representa uma arvore vazia; (X) representa uma arvore de raizX e subarvores descritas pelas cadeias e .
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias 143
Arvores binarias de busca
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 144
Exemplo de arvore de busca: numeros Exemplo de arvore de busca: nomes
7/31/2019 estrutura de dados e tcnicas de programao
37/89
Exemplo de arvore de busca: numeros
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 dono.
c2010 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.
c2010 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 subarvorevazia. O ponto de insercao e determinado pelo percurso da arvore usandoa propriedade de arvores de busca.
Y
X < Y
Y
X
Y
X > Y
Y
X
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 147
Insercao recursivaB o o l e a n I n s e r e A r v B u s c a ( A r v B i n p , T x ) {
/ V e r s a o r e c u r s i v a /i f ( ( p)==NULL) {
p = m a l l o c ( s i z e o f (NoArvBin ));( p)>e s q = ( p)> d i r = N ULL ;( p)> i n f o = x ;r e t u r n t r u e ;
} e l s e {T i n f o = ( p)> i n f o ;i f ( xes q ) , x );e ls e i f ( x>i n f o )
r e t u r n I n s e r e A r v B u s c a ( & ( ( p)> di r ) , x );e l s e
r e t u r n f a l s e ;}
}
Note-se o uso de passagem de parametro p por referencia. Esta versao apresenta somente recursao caudal que p ode ser
facilmente eliminada.c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 148
Insercao iterativa Remocao em arvore de busca
7/31/2019 estrutura de dados e tcnicas de programao
38/89
Insercao iterativa
B o o l e a n I n s e r e A r v B u s c a ( A r v B i n p , T x ) {/ V e r s a o i t e r a t i v a /T i n f o ;w h i l e ( ( p)!=NULL) {
i n f o = ( p)> i n f o ;i f ( xe s q ) ;
e ls e i f ( x>i n f o )p = & ( ( p)> d i r ) ;e l s e
r e t u r n f a l s e ;}p = m a l l o c ( s i z e o f (NoArvBin ));( p)>e sq = ( p)> di r = NULL;( p)> i n f o = x ;r e t u r n t r u e ;
}
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 149
Remocao em arvore de buscaCaso 1: pelo menos uma das subarvores e vazia:
p
X
p e o endereco do campo ou da variavel que contem o apontador parao 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.
c2010 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 informacao X por Y o valor maximo contido nasubarvore esquerda (ou mnimo na subarvore direita).
Remover o no que originalmente continha Y (sua subarvore direita evazia aplica-se o caso 1).
Implementacao: exerccio.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 151
Insercoes e remocoes em arvores binarias de busca
Problema: a altura da arvore pode crescer muito ja que numa arvorecom n nos:
altura maxima n altura mnima log2(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 insercao e feita em ordem(crescente ou descrescente)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 152
Balanceamento de arvores Arvores de altura balanceada (AVL)
7/31/2019 estrutura de dados e tcnicas de programao
39/89
Balanceamento de arvores
Algoritmo obvio nao garante balanceamento Balanceamento perfeito (altura mnima):
eficiencia de busca: O(log n)
eficiencia de insercao: O(n) inaceitavel Balanceamento aproximado:
arvores AVL eficiencia de busca, insercao e remocao: O(log n) arvores rubro-negras eficiencia de busca, insercao e remocao:
O(log n)
c2010 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 subarvoresesquerda e direita e no maximo 1, em valor absoluto.
A diferenca entre as alturas direita e esquerda e chamada fator debalanceamento.
c2010 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 segundanao e.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 155
Pior caso de desbalanceamento: arvores de Fibonacci
F0NULL
F10
F2
0
F3
0
F4
0 0
0
Forma geral altura h 2:Fh
Fh1 Fh2
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 156
Arvores de Fibonacci: propriedades Insercao em arvores AVL
7/31/2019 estrutura de dados e tcnicas de programao
40/89
Arvores de Fibonacci: propriedades
Fh1 Fh2
Para uma dada altura h, a arvore contem o numero mnimo de nospossvel preservando ainda a propriedade AVL.
Qualquer outra arvore AVL com o mesmo numero de nos tem alturamenor ou igual este e o pior caso.
Numero de nos de Fh: N(h) = N(h 1) + N(h 2) + 1, h 2
Demonstra-se por inducao: N(h) = fh+2 1, onde fi e o i-esimonumero de Fibonacci.
Usando a aproximacao fi ((1 +
(5))/2)i/
(5) obtem-se:h 1, 44log2(n + 2) (no maximo).
Operacao de busca usara O(log n) operacoes.
A ser visto: insercao e remocao tambem usarao O(log n) operacoes.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 157
Insercao em arvores AVLA explicacao a seguir supoe que a insercao e realizada por uma funcaorecursiva cujo cabecalho e:
B o o l e a n B u s c a I n s e r e ( A rv AV L p , T x , B o o l ea n 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 informacao que indicase a arvore aumentou ou nao de altura
se nao houver aumento de altura numa chamada recursiva, o resto daarvore nao sofre mudanca
conforme sera visto, o aumento da altura sera no maximo de um epode acontecer somente numa arvore vazia ou entao cuja raiz temfator de balanceamento igual a zero; neste caso, o fator resultantesera diferente de zero, exceto quando a arvore era vazia.
O valor devolvido pela funcao indica se a insercao foi efetivamenterealizada ou se o elemento x ja pertencia a arvore.
c2010 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 ? a lt : f al se
Neste caso, nao havera mais modificacoes na arvore.
c2010 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 ? al t: true
Neste caso, havera modificacao no no corrente com possvel propagacaopara as chamadas anteriores.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 160
Insercao em arvores AVL (cont ) Insercao em arvores AVL (cont )
7/31/2019 estrutura de dados e tcnicas de programao
41/89
Insercao em arvores AVL (cont.)
Caso 1: Insercao em arvore vazia:
NULL
h = 0
X0
h = 1
Neste caso a altura h aumenta. Este fato sera propagado no retorno dafuncao atraves de valor verdadeiro da variavel alt.
Nos casos seguintes, sera suposto sempre que a insercao foi realizada nasubarvore esquerda; o caso da insercao do lado direito e analogo.
c2010 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 conteudo do retangulo representa o resultado da chamada recursiva. Ofator de balanceamento sera modificado somente se a arvore esquerdaaumentou de tamanho.
Neste caso a altura permanece inalterada. Este fato sera propagado noretorno da funcao atraves de valor falso da variavel alt. Comoconsequencia, o processo de insercao para (exceto os retornos).
c2010 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 alturatotal tambem aumentara. Este fato sera propagado no retorno da funcaoatraves de valor verdadeiro da variavel alt.
c2010 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
h
x
h-1 h+1
alt: true
Neste caso, se houve aumento de altura na chamada recursiva, a arvoredeixara de ser do tipo AVL. Havera entao dois subcasos, dependendo dolado da subarvore esquerda em que houve insercao. A identificacao dosubcaso sera feita pelo valor do fator de balanceamento final da subarvoreque aumentou de altura durante a chamada recursiva.
Nos dois casos havera rearranjos convenientes mas locais da arvore.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 164
Insercao em arvores AVL (cont.) Insercao em arvores AVL (cont.)
7/31/2019 estrutura de dados e tcnicas de programao
42/89
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-2T1 T2
T3
0
0
B
A
x h-2
h-1
h-2
T1
T2 T3
0B
x
h
alt: false
Neste caso e realizada uma transformacao denominada rotacao simples LL(esquerda, esquerda). A altura final permanece inalterada e a variavel alt
recebe valor falso.c2010 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 (rotacao LR)
x
h-1 h+1
alt: true
+
+0
A
B
C
x x
T1T2 T3
T4h-2
h-2h-2/h-3
AB
C0
/0 0/+
h-2/h-3
T1
T2 T3T4x x
h-2 h-2
0 C
x
h
alt: false
Neste caso, a insercao pode ter sido realizada na subarvore esquerda oudireita do lado que cresceu, ou entao no proprio no C quando h = 2. Osfatores de balanceamento finais dependem disto, mas o da raiz sera 0. Atransformacao e denominada rotacao dupla LR (esquerda, direita). Aaltura final permanece inalterada e a variavel alt recebe valor falso.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 166
Funcao de insercao em arvores AVL
B o o l e a n B u s c a I n s e r e ( A rv AV L p , T x , B o o l ea n a l t ) {/ D e v o l v e t r u e o u f a l s e c o n f or m e h o uv e o u n a o i n s e r c a o ;
s e h ou ve i n s e r c a o , a l t i n d i c a s e h ou ve au me nt o d a a l t u r a ./
i f ( p==NULL) {p = m a l l o c ( s i z e o f (NoArvAVL ) ) ;( p)>e s q = ( p)> d i r = NULL ; ( p)> i n f o = x ;( p)> b a l = z e r o ; a l t = t r u e ;r e t u r n t r u e ;
} e l s e {T i n f o = ( p)> i n f o ;i f (x==in fo )
r e t u r n f a l s e ;e ls e i f ( xe s q ) , x , a l t ) ;i f ( ! r e s )
r e t u r n f a l s e ;
c2010 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 ) { / a um en to d e a l t u r a /ArvAVL p1 , p2 ;s w i t c h ( ( p)> b a l ) {
c a se m a i s : ( p)> b a l = z e r o ; a l t = f a l s e ; b re a k ;c a se z e r o : ( p)> bal = menos ; b re a k ;c a se menos :
p 1 = ( p)>esq ;i f ( p1>bal==menos) {
/ Rotac a o s i m p l e s L L /} e l s e {
/ Rotac ao dup la LR /}p1>b a l = z e r o ; a l t = f a l s e ;b re a k ;
}}r e t u r n t r u e ;
} e l s e {
/ d e sc e a d i r e i t a an al og o /}
}c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 168
Exemplos de insercao em arvores AVL Exemplos de insercao em arvores AVL (cont.)
7/31/2019 estrutura de dados e tcnicas de programao
43/89
e p os de se cao e a o es
Insercao de 33:
50
25 65
20 35 55
6010 30 45
70
4033
+
+
0 0
0
+
0
0
50
25 65
20 35 55
6010 30 45
70
4033
+
+
0 +
00
0
0
0
Neste caso, houve uma insercao simples e a mudanca de fatores debalanceamento afetou os nos marcados.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 169
e p os de se cao e a o es (co t )
Insercao de 63:
50
25 65
20 35 55
6010 30 45
70
40 63
+
+
0 0
0
+
0
0
50
25 65
20 35 60
6310 30 45
70
40
55
+
0
0 0
0
0
+
0
0
Neste caso, a insercao causou uma rotacao simples do tipo RR, afetandoos nos marcados.
c2010 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
6010 30 45
70
40
41
+
+
0 0
0
+
0
0
50
25 65
20 35 55
6010 30 41
70
40 45
+
+
0 0
0
+
00
0
0
Neste caso, a insercao causou uma rotacao dupla do tipo LR, afetando os
nos marcados.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 171
Remocao em arvores AVL
1. Transformacao 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 ono pai; o no a ser eliminado e a folha da subarvore
o no tem grau dois: o seu valor e substit do p elo maior valor contido nasua subarvore esquerda (ou o menor valor contido na sua subarvoredireita); o no que continha o menor (ou maior) valor copiado temnecessariamente grau zero ou um, recaindo num dos casos anteriores.
2. Remocao propriamente dita.
3. O algoritmo de remocao sera apresentado novamente como umafuncao recursiva que indica se houve diminuicao da altura da arvoreapos a remocao. Serao estudados apenas os casos de remocao dolado esquerdo; os outros sao analogos.
4. A implementacao do algoritmo e um exerccio.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 172
Remocao em arvores AVL (cont.) Remocao em arvores AVL (cont.)
7/31/2019 estrutura de dados e tcnicas de programao
44/89
( )
Caso 1: Remocao de uma folha
X0
h = 1
NULL
h = 0
Neste caso a altura h diminui. Este fato sera propagado no retorno dafuncao atraves de valor verdadeiro da variavel alt.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 173
( )
Caso 2: Remocao quando as duas alturas sao iguais
0
x
h
0
h
alt: true
+
h
alt: false
O conteudo do retangulo representa o resultado da chamada recursiva. Ofator de balanceamento sera modificado somente se a arvore esquerdadiminuiu de tamanho.
Neste caso, mesmo que haja diminuicao de altura na chamada recursiva, aaltura total permanece a mesma. Este fato sera propagado no retorno dafuncao atraves de valor falso da variavel alt.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 174
Remocao em arvores AVL (cont.)
Caso 3: Remocao 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 dasubarvore, a altura final da arvore tambem diminui e o processo continua.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 175
Remocao em arvores AVL (cont.)
Caso 4: Remocao do lado mais baixo
+
x
h
+
alt: true
h h-2
Caso a subarvore esquerda tenha sua altura diminuda, a arvore deixa deser do tipo AVL. Ha tres subcasos, dependendo do fator de balanceamentodo filho direito da raiz.Note-se que, neste caso, tem-se h 3.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 176
Remocao em arvores AVL (cont.) Remocao em arvores AVL (cont.)
7/31/2019 estrutura de dados e tcnicas de programao
45/89
( )
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
T1T2
T3
B
h
alt: false
Neste caso e realizada uma transformacao denominada rotacao simples RR(direita, direita). A altura final permanece inalterada e a variavel altrecebe valor falso. O processo de ajuste da arvore para.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 177
( )
Caso 4b: Fator de balanceamento +1 (rotacao RR)
+
alt: true
h h-2
+
+
A
B
h-2
h-3
h-3
T1
T2T3
0
0
B
A
h-2
h-3 h-3T1 T2
T3
h-1
0B
h-1
alt: true
Neste caso tambem e realizada a transformacao denominadarotacao simples RR (direita, direita). A altura final diminui e a vari avel altrecebe o valor verdadeiro. O processo de ajuste da arvore continua.
c2010 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
CT1
T2 T3
T4
h-3
h-3h-3/h-4
C
A B
0
/0 0/+
h-3/h-4
T1
T2 T3T4
h-3 h-3
0C
h-1
alt: true
Neste caso tambem e realizada uma transformacao denominada
rotacao dupla RL (direita, esquerda). A altura final diminui e a variavelalt recebe o valor verdadeiro. O processo de ajuste da arvore continua.
c2010 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
6010 30 45
70
40
+
+
0 0
0
+
0
0
50
25 65
20 35 55
6010 30 45
70
0
0
+
0 0
0
00
0
Neste caso, houve uma remocao s imples e a mudanca de fatores debalanceamento afetou os nos marcados.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 180
Exemplos de remocao em arvores AVL (cont.)
7/31/2019 estrutura de dados e tcnicas de programao
46/89
p ( )
Remocao de 60:
50
25 65
20 35 55
6010 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 raizoriginal, uma rotacao dupla do tip o LR, afetando os nos marcados.
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores binarias de busca 181
Arvores do tipo B
(B trees)
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores do tipo B 182
Discos magneticos
Esboco esquematico do corte vertical de uma unidade com quatro discos(oito superfcies):
0
1
2
3
4
5
6
7
cabecas leitoras/gravadoras
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores do tipo B 183
Discos magneticos (cont.)Esboco esquematico de uma superfcie de um disco:
.
..
uma trilha um cilindro(trilhas iguais)
setores
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores do tipo B 184
Discos magneticos (cont.) Arvores B
7/31/2019 estrutura de dados e tcnicas de programao
47/89
( )Dados para um disco fictcio 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 enderecamento)
tempo medio de busca da trilha enderecada (seek): S(10 milissegundos)
tempo medio de latencia esp era 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 deacesso a memoria RAM (tipicamente 100.000 vezes).
Numero de acessos: altura da arvore log2 n nao e mais aceitavel
Solucao: logk n, com k >> 2
c2010 T. Kowaltowski Estruturas de Dados e Tecnicas de Programacao Arvores do tipo B 185
Autores: Rudolf Bayer e Ed McCreight (1971) T e uma arvore B de ordem b 2 se:
1. todas as folhas de T tem o mesmo nvel;2. cada no interno tem um numero variavel r de registros de informacao e
r+1 de filhos, onde
b/2 r b se no = raiz
1 r b se no = raiz
3. cada folha tem um numero variavel r de registros obedecendo a mesmarestricao do item anterior;
4. os campos de informacao contidos nos registros obedecem apropriedade de arvores de busca.
Alguns autores definem 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:
logb/2(n + 1)/2.
c2010 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 deinformacao.
3 5 20 35 48 51 80 85 150 205
17 50 83 203
125
c2010
Top Related