Estruturas de Dados
e
T´
ecnicas de Programa¸
c˜
ao
Tomasz Kowaltowski
Instituto de Computa¸c˜ao Universidade Estadual de Campinas
www.ic.unicamp.br/∼tomasz c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao 1
Copyright c 2010 Tomasz Kowaltowski
Instituto de Computa¸c˜ao
Universidade Estadual de Campinas
Algumas transparˆencias foram adaptadas da apostila Estruturas de Dados
e T´ecnicas de Programa¸c˜ao de autoria de Cl´audio L. Lucchesi e Tomasz Kowaltowski.
Estas transparˆencias somente podem ser copiadas para uso pessoal dos
docentes e alunos das disciplinas oferecidas pelo Instituto de Computa¸c˜ao da UNICAMP.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao 2
Introdu¸c˜
ao
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Introdu¸c˜ao 3
Pr´
e-requisito e objetivos
I Pr´e-requisito: curso b´asico de programa¸c˜ao em C
I Objetivos:
I Programa¸c˜ao em (relativamente) baixo n´ıvel
I T´ecnicas de programa¸c˜ao e estrutura¸c˜ao de dados
I Prepara¸c˜ao para:
I An´alise de algoritmos
I Programa¸c˜ao de sistemas I Programa¸c˜ao em geral I Bancos de dados I Engenharia de software I . . . c
Programa
I Introdu¸c˜ao `a an´alise de algoritmos
I Estrutura¸c˜ao elementar de dados: matrizes, registros, apontadores
I Estruturas lineares: pilhas, filas, filas duplas
I Recurs˜ao e retrocesso
I Arvores bin´´ arias: representa¸c˜ao, percursos
I Arvores gerais: representa¸´ c˜ao, percursos
I Aplica¸c˜ao de ´arvores:
´arvores de busca (AVL), filas de prioridade, ´arvores B, ´arvores digitais
I Listas generalizadas
I Espalhamento
I Processamento de cadeias de caracteres
I Gerenciamento de mem´oria
I Algoritmos de ordena¸c˜ao
I Algoritmos em grafos
I Tipos abstratos de dados e orienta¸c˜ao a objetos c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Introdu¸c˜ao 5
Bibliografia
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao 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 T´ecnicas de Programa¸c˜ao. Instituto de Computa¸c˜ao – UNICAMP, 2003.
P. Feofiloff.
Algoritmos em Linguagem C. Elsevier Editora Ltda., 2009.
G. H. Gonnet.
Handbook of Algorithms and Data Structures. Addison-Wesley, 1984.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao 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.
c
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.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Bibliografia 9
No¸c˜
oes de An´
alise de Algoritmos
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 10
Escolha da estrutura
Importˆancia da escolha de estrutura de dados – busca de um elemento
numa seq¨uˆencia:
. . . x = a [ k ] ; . . . . . . p = a ; i = 0 ; w h i l e ( i <k ) { p = p−>p r o x ; i ++; } x = p−>i n f o ; . . . (a) (b)
(a) N´umero de opera¸c˜oes constante (vetor).
(b) N´umero de opera¸c˜oes proporcional a k (lista ligada).
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 11
Exemplo de an´
alise de trechos de programas
. . . x = a+b ; . . . . . . f o r ( i =0; i <n ; i ++) x = a+b ; . . . . . . f o r ( i =0; i <n ; i ++) f o r ( j =0; j <n ; j ++) x = a+b ; . . . (a) (b) (c) a b c
an´alise simples (1) 1 n n2
an´alise detalhada (2) 2 5n + 2 5n2+ 5n + 2
(1): atribui¸c˜oes (2): atribui¸c˜oes, opera¸c˜oes aritm´eticas e compara¸c˜oes
As duas an´alises produzem resultados proporcionais para valores crescentes de n.
c
Significado intuitivo da nota¸c˜
ao
O
()
c =
O
(1) para qualquer constante c2 =
O
(1) 5n + 2 =O
(n) 5n2+ 5n + 2 =O
(n2) n2 =O
(n3) nk =O
(nk+1), k ≥ 0 logan =O
(logbn), a, b > 0 log2n =O
(log10n) c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 13
Exemplo de an´
alise de um procedimento de ordena¸c˜
ao
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 <n −1; i ++) { m = i ; f o r ( 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 compara¸c˜oes de elementos de v, para cada valor de i, ´e n − i − 1. O n´umero total de compara¸c˜oes ser´a:
n−2 X i=0 (n − i − 1) = n 2 2 + n 2
ou seja, o n´umero de compara¸c˜oes ´e da ordem de
O
(n2). c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 14
Crescimento de algumas fun¸c˜
oes
n log2n n log2n n2 n3 2n 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 ≈ 18×1018 128 7 896 16.384 2.097.152 ≈ 34×1037 c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 15
Exemplo
Suponha duas m´aquinas M1 e M2, sendo a primeira cem vezes mais
r´apida do que a segunda. Ambas as m´aquinas executam um algoritmo de
busca num vetor ordenado de comprimento n. A m´aquina M1 executa o
algoritmo de busca sequencial (pior caso: n opera¸c˜oes); a m´aquina M2 executa o algoritmo de busca bin´aria (pior caso: log2n opera¸c˜oes). A seguinte tabela poderia ser obtida atrav´es de medidas experimentais de tempo de execu¸c˜ao para vetores de diversos tamanhos, usando alguma unidade de tempo conveniente.
c
Exemplo (cont.)
n M1 M2 16 16 400 32 32 500 64 64 600 128 128 700 256 256 800 512 512 900 1024 1024 1000 2048 2048 1100 . . . . 220 1.048.576 2000 221 2.097.152 2100 . . . . 230 1.073.741.824 3000Supondo que a unidade seja 1 microssegundo, 2.097.152µs corresponde a 17 minutos e 1.073.741.824µs equivale a cerca de 12 horas.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao No¸c˜oes de An´alise de Algoritmos 17
Execu¸c˜
ao de programas
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Execu¸c˜ao de programas 18
Exemplo de fun¸c˜
oes 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 execu¸c˜ao (sup˜oe inteiros de dois bytes):
i c v main z y b f 235 x y 235 g 235
Obs.: Na realidade, os inteiros s˜ao armazenados sob a forma bin´aria. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Execu¸c˜ao de programas 19
Exemplo de fun¸c˜
oes com aloca¸c˜
ao dinˆ
amica
t y p e d e f c h a r C a d e i a [ 5 ] ; t y p e d e f C a d e i a ∗ A p C a d e i a ; t y p e d e f s t r u c t { C a d e i a nome ; i n t i d a d e ; } Reg , ∗ApReg ; A p C a d e i a a p c ; ApReg a p r ; i n t ∗ a p i ; v o i d A l o c a ( A p C a d e i a ∗ 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 ( Reg ) ) ; } /∗ A l o c a ∗/ i n t main ( ) {
A l o c a (& apc ,& 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 ∗/
mem´oria dinˆamica pilha de execu¸c˜ao
apc apr api global main c r Aloca 10 10 c
Exemplo de fun¸c˜
ao 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 0 1 1 2 6 24 24 c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Execu¸c˜ao de programas 21
Estruturas ligadas
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 22
Listas ligadas simples
p
. . .
Declara¸c˜oes (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 ∗ p r o x ; } R e g L i s t a , ∗ L i s t a ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 23
Inser¸c˜
ao e remo¸c˜
ao 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−>p r o x ; p−>p r o x = q ; } v o i d Remove ( L i s t a p , T ∗ x ) { L i s t a q = p−>p r o x ; ∗ x = q−>i n f o ; p−>p r o x = q−>p r o x ; f r e e ( q ) ; } c
Inser¸c˜
ao e remo¸c˜
ao com passagem por valor (cont.)
. . . x . . .
p q
I O argumento p ´e o apontador para o predecessor do n´o a ser inserido ou removido.
I A fun¸c˜ao ’Remove’ n˜ao pode remover um n´o que ´e o ´unico da lista.
I A fun¸c˜ao ’Insere’ n˜ao pode inserir um n´o no in´ıcio da lista, inclusive se ela for vazia.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 25
Inser¸c˜
ao e remo¸c˜
ao com passagem por referˆ
encia
. . . 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 ( L i s t a ∗p , T ∗ x ) { L i s t a q = ∗ p ; ∗ x = q−>i n f o ; ∗p = q−>p r o x ; f r e e ( q ) ; }
Esta conven¸c˜ao elimina os problemas da passagem por valor. Note-se que as vari´aveis p e q tˆem tipos diferentes.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 26
Lista simples com n´
o cabe¸ca
p
. . .
Lista vazia:
p
Esta conven¸c˜ao permite o uso de passagem por valor nas fun¸c˜oes b´asicas. O campo de informa¸c˜ao do n´o cabe¸ca pode ser aproveitado para guardar alguma informa¸c˜ao adicional (por exemplo, o comprimento da lista).
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 27
Lista simples circular
p
. . .
Problema: lista vazia?
c
Lista circular com n´
o cabe¸ca
p . . . Lista vazia: p c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 29
Busca em lista circular com n´
o cabe¸ca – sentinelas
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 ) { /∗ Busca sem s e n t i n e l a ∗/ L i s t a q = p ; do { q = q−>p r o x ; } 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 ) { /∗ 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−>p r o x ; } 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 ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 30
Lista duplamente ligada com n´
o cabe¸ca
p
. . .
Lista vazia:
p
I E poss´ıvel percorrer os elementos nas duas dire¸´ c˜oes, a partir de qualquer lugar da lista.
I E poss´ıvel remover o elemento apontado.´
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 31
Opera¸c˜
oes 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 ∗ e s q , ∗ 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−>e s q ; q−> d i r = p ; p−>e s 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−>e s q −> d i r = p−> d i r ; p−>d i r −>e s q = p−>e s q ; ∗ x = p−>i n f o ; f r e e ( p ) ; }
A fun¸c˜ao ’RemoveDupla’ sup˜oe que h´a pelo menos um elemento na lista. c
Exemplo: opera¸c˜
oes com polinˆ
omios
Seja um polinˆomio de grau n:
P (x) = anxn+ an−1xn−1+ . . . + a1x1+ a0x0 onde an 6= 0, exceto possivelmente no caso n = 0.
Representa¸c˜ao ligada omite os termos n˜ao nulos. Por exemplo, os polinˆomios:
P1(x) = 5x20− 3x5+ 7 e P2(x) = 0:
podem ser representados por:
-1
p1 5 20 -3 5 7 0
-1
p2
Por conven¸c˜ao, o expoente do n´o cabe¸ca ´e -1. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 33
Exemplo de fun¸c˜
ao: impress˜
ao
t y p e d e f s t r u c t AuxPol { i n t e x p o ; f l o a t c o e f ; s t r u c t AuxPol ∗ p r o x ; } 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−>p r o x==p ) { p r i n t f ( ” P o l i n ˆo m i o n u l o \ n ” ) ; r e t u r n ; } p = p−>p r o x ; w h i l e ( p−>e x p o !=−1) { p r i n t f ( ”(%2d , % 5 . 1 f ) ” , p−>expo , p−>c o e f ) ; p = p−>p r o x ; } p r i n t f ( ” \ n ” ) ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 34
Soma de polinˆ
omios: paradigma de intercala¸c˜
ao
-1 p pp0 . . . pp -1 q qq0 . . . qq -1 r rr0 . . . rr
As vari´aveis pp e qq representam os termos correntes dos polinˆomios dentro da malha de repeti¸c˜ao e a vari´avel rr aponta para o ´ultimo termo j´a calculado da soma; pp0, qq0 e rr0 s˜ao os valores iniciais das vari´aveis pp, qq e rr.
A implementa¸c˜ao das opera¸c˜oes ´e um exerc´ıcio. Note-se que o produto de dois polinˆomios pode ser calculado como uma sequˆencia de somas de
produtos de um polinˆomio por um termo.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 35
Matrizes esparsas
Exemplo: 50 0 0 0 10 0 20 0 0 0 0 0 −30 0 −60 5Dada uma matriz n × n, quando o n´umero de elementos n˜ao nulos ´e uma
percentagem pequena de n2 (n˜ao ´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 s˜ao numeradas a
partir de 1.
c
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 5O acesso `a matriz ´e feito a partir do n´o cabe¸ca das listas das cabe¸cas das linhas e das colunas (super-cabe¸ca!).
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 37
Opera¸c˜
oes 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 o u 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 ; } R e g E s p a r s a , ∗ 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 t r 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 o u 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 i z a , i n t i , i n t j , d o u b l e x ) ; v o i d S o m a M a t r i 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 i z a , M a t r i z b , M a t r i z ∗ c ) ; ´
E importante notar os casos em que a passagem do argumento do tipo ’Matriz’ ´e feita por referˆencia. (Nas duas ´ultimas opera¸c˜oes, a vari´avel ’c’ recebe o resultado.)
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas ligadas 38
Estruturas lineares
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 39
Estruturas lineares em geral: opera¸c˜
oes t´ıpicas
I selecionar e modificar o k-´esimo elemento;
I inserir um novo elemento entre as posi¸c˜oes k e k + 1;
I remover o k-´esimo elemento;
I concatenar duas sequˆencias;
I desdobrar uma sequˆencia;
I copiar uma sequˆencia;
I determinar o tamanho de uma sequˆencia;
I buscar um elemento que satisfaz uma propriedade;
I ordenar uma sequˆencia;
I aplicar um procedimento a todos os elementos de uma sequˆencia;
I . . .
c
Estruturas lineares particulares
I Pilha (stack): inser¸c˜ao e remo¸c˜ao na mesma extremidade da estrutura
I Fila (queue): inser¸c˜ao numa extremidade (fim) e remo¸c˜ao na outra extremidade (in´ıcio)
I Fila dupla (double ended queue): inser¸c˜ao e remo¸c˜ao em ambas extremidades da estrutura
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 41
Pilha: implementa¸c˜
ao sequencial
. . . . . . 0 topo empilha (insere) desempilha (remove) Pilha vazia: . . . 0 topo (-1) Inicialmente: topo=-1. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 42
Pilha: implementa¸c˜
ao sequencial (cont.)
. . . . . . 0 topo empilha (insere) desempilha (remove) t y p e d e f s t r u c t { i n t t o p o ; T e l e m e n t o s [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 o p o==(TAM MAX−1)) T r a t a E r r o ( ” P i l h a c h e i a ” ) ; ( ∗ p ) . t o p o ++; ( ( ∗ p ) . e l e m e n t o s ) [ ( ∗ p ) . t o p o ] = x ; }
Exerc´ıcio: a fun¸c˜ao “Desempilha”. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 43
Pilha: implementa¸c˜
ao ligada
topo
. . .
Pilha vazia:
topo
(Uma lista ligada simples.)
c
Pilha: implementa¸c˜
ao ligada (cont.)
topo . . . t y p e d e f 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 ∗ p r o x ; } 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 h a 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 mem´oria ” ) ; q−>i n f o = x ; q−P r o x = ∗ p ; ∗p = q ; }Exerc´ıcio: a fun¸c˜ao “Desempilha”. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 45
Fila: implementa¸c˜
ao sequencial
. . . .
frente fim
remove insere
Conven¸c˜ao: frente precede o primeiro elemento da fila; consequentemente, o tamanho da fila ´e dado por fim−frente.
Fila vazia:
. . . .
frente fim
Condi¸c˜ao de fila vazia: frente == fim. Inicialmente: frente = fim = −1.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 46
Fila: implementa¸c˜
ao ligada circular
fila frente . . . fim Fila vazia: fila frente fim
A fila pode ser representada por uma ´unica vari´avel (fila) ou um par de vari´aveis (frente e fim).
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 47
Fila: implementa¸c˜
ao sequencial circular
n-1 0 1 2 3 ... frente .. . fim .. .
Conven¸c˜ao: frente precede o primeiro elemento da fila; consequentemente,
o tamanho da fila ´e dado por (fim−frente + n)%n.
c
Fila: implementa¸c˜
ao sequencial circular (cont.)
n-1 0 1 2 3 ... frente ... fim ... Condi¸c˜oes:I Inicial: frente == fim == 0 (ou qualquer outro valor)
I Fila vazia: frente == fim
I Fila cheia: frente == fim (a mesma condi¸c˜ao!)
I Solu¸c˜ao 1: sacrificar uma posi¸c˜ao do vetor; a condi¸c˜ao de fila cheia fica: frente == (fim + 1)%n.
I Solu¸c˜ao 2: uma vari´avel adicional inteira com o tamanho da fila ou booleana indicando se a fila est´a vazia.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 49
Fila: implementa¸c˜
ao sequencial circular (cont.)
n-1 0 1 2 3 ... frente ... fim ...
#d e f i n e TAM MAX FILA 1000 t y p e d e f s t r u c t {
i n t f r e n t e , f i m ;
T e l e m e n t o s [ 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 ) . f i m +1)%TAM MAX FILA ) ) T r a t a E r r o ( ” F i l a c h e i a ” ) ;
( ∗ f ) . f i m = ( ( ∗ f ) . f i m +1)%TAM MAX FILA ; ( ∗ f ) . e l e m e n t o s [ ( ∗ f ) . f i m ] = x ;
}
Exerc´ıcio: a fun¸c˜ao “RemoveFila”.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Estruturas lineares 50
Aplica¸c˜
oes de pilhas
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 51
Aplica¸c˜
oes de pilhas
I Processamento de linguagens parent´eticas: I linguagens de programa¸c˜ao
I XML
I Implementa¸c˜ao da recurs˜ao
I Percurso de estruturas hier´arquicas (´arvores)
I Avalia¸c˜ao express˜oes em nota¸c˜ao p´os-fixa (nota¸c˜ao polonesa reversa)
I Transforma¸c˜ao entre nota¸c˜oes
c
Exemplo de aplica¸c˜
ao simples: balanceamento de parˆ
enteses
Correto Incorreto ( () ) [()] [) []()[()[]] ()()[ ((([[[]]]))) )( c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 53
Balanceamento de parˆ
enteses (cont.)
Pilha Resto da sequˆencia
Vazia ([([][()])]) ( [([][()])]) ([ ([][()])]) ([( [][()])]) ([([ ][()])]) ([( [()])]) ([([ ()])]) ([([( )])]) ([([ ])]) ([( )]) ([ ]) ( ) Vazia c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 54
Nota¸c˜
oes para express˜
oes aritm´
eticas
I Infixa:
I um operador un´ario precede o operando
I um operador bin´ario separa os dois operandos
I parˆenteses indicam prioridades
I P´os-fixa: os operadores seguem os operandos
I Pr´e-fixa: os operadores precedem os operandos Exemplos:
infixa p´os-fixa pr´e-fixa
a a a
a + b ab+ +ab
a + b ∗ c abc ∗ + +a ∗ bc
(a + b) ∗ c ab + c∗ ∗ + abc
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 55
Exemplo: avalia¸c˜
ao de express˜
oes sob forma p´
os-fixa
Nota¸c˜ao infixa: (3 + 5) ∗ 2 − (10 − 3)/2 Nota¸c˜ao p´os-fixa: 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
Exemplo: transforma¸c˜
ao de nota¸c˜
ao infixa para p´
os-fixa
a ∗ b + c ∗ de/f − g ∗ h
Entrada infixa:
a
∗ b + c ∗ d ∧ e / f −g ∗ h
Sa´ıda p´os-fixa:
a b
∗ c d e ∧ ∗ f /+g h ∗−
I As var´aveis s˜ao copiadas diretamente para a sa´ıda.
I Os operadores precisam ser lembrados numa pilha.
I Um operador ´e copiado da pilha para a sa´ıda somente quando aparece
na entrada um operador de prioridade menor ou igual. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 57
Transforma¸c˜
ao de nota¸c˜
ao infixa para p´
os-fixa (cont.)
Sa´ıda 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
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 58
Transforma¸c˜
ao de nota¸c˜
ao infixa para p´
os-fixa (cont.)
Sa´ıda 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
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Aplica¸c˜oes de pilhas 59
Exemplos de recurs˜
ao
c
Exemplo 1: fun¸c˜
ao 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 ) ; } 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 <=n ; i ++) f = f ∗ i ; r e t u r n f ; }Eficiˆencia: ambos
O
(n) (n multiplica¸c˜oes).c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 61
Exemplo 2: n´
umeros de Fibonacci
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... i n t f i b o ( i n t n ) { i f ( n<=1) r e t u r n n ; e l s e r e t u r n f i b o ( n−1)+ f i b o ( n − 2 ) ; } i n t f i b o ( i n t n ) { i n t f 1 =0 , f 2 =1 , f 3 , i ; f o r ( i =1; i <=n ; i ++) { f 3 = f 1+f 2 ; f 1 = f 2 ; f 2 = f 3 ; } r e t u r n f 1 ; } Eficiˆencia:
O
(1.6n)O
(n) n = 100: ≈ 1020 somas 100 somas c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 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:
I um disco de cada vez
I disco de diˆametro maior n˜ao pode ficar em cima de um disco de diˆametro menor
Solu¸c˜ao recursiva: fun¸c˜ao Hanoi(org,dest,aux,n). c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 63
Torres de Hanoi: transferˆ
encia recursiva de N-1 discos
X ... ... N Y Z Hanoi(X,Z,Y,N-1) X Y Z ... ... N-1 c
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 T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 65
Torres de Hanoi: transferˆ
encia recursiva final de N-1 discos
X Y Z ... ... N-1 Hanoi(Z,Y,X,N-1) X Y ... ... N Z c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 66
Torres de Hanoi: fun¸c˜
ao Hanoi
v o i d H a n o i ( c h a r o r g , c h a r d e s t , c h a r aux , i n t n ) { i f ( n >0) { H a n o i ( o r g , aux , d e s t , n − 1 ) ; p r i n t f ( ”Mova de %c p a r a %c \ n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n − 1 ) ; } }
I Chamada inicial: Hanoi(’A’,’B’,’C’,64).
I N´umero de movimentos: 2N − 1 (prova por indu¸c˜ao).
I Este ´e o n´umero m´ınimo.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 67
Torres de Hanoi: exemplos de sa´ıda
N=1: N=3: Mova de A p a r a B Mova de A p a r a B Mova de A p a r a C Mova de B p a r a C N=2: Mova de A p a r a B Mova de C p a r a A Mova de A p a r a C Mova de C p a r a B Mova de A p a r a B Mova de A p a r a B Mova de C p a r a B c
Torres de Hanoi: exemplos de sa´ıda (cont.)
N=4 Mova de A p a r a C Mova de C p a r a B Mova de A p a r a B Mova de C p a r a A Mova de C p a r a B Mova de B p a r a A Mova de A p a r a C Mova de C p a r a B Mova de B p a r a A Mova de A p a r a C Mova de B p a r a C Mova de A p a r a B Mova de A p a r a C Mova de C p a r a B Mova de A p a r a B c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 69
Exemplo 4: gera¸c˜
ao de permuta¸c˜
oes
Problema: Gerar todas as permuta¸c˜oes dos m elementos de um vetor.
. . .
0 k-1 k m-1
. . .
I Suponha uma fun¸c˜ao Permuta(k,m) que gera (imprime) todas as
permuta¸c˜oes dos elementos de 0 a k-1, seguidas dos elementos de k a m-1.
I A chamada inicial Permuta(m,m) resolveria o problema.
I A solu¸c˜ao consistir´a em trocar o elemento de ´ındice k-1
consecutivamente com todos os elementos que o precedem e aplicar a fun¸c˜ao recursivamente.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 70
Gera¸c˜
ao das permuta¸c˜
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
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 71
Gera¸c˜
ao das permuta¸c˜
oes (cont.)
. . . 0 k-1 k m-1 . . . Fun¸c˜ao Permuta: v o i d Permuta ( i n t k , i n t m) { i f ( k==0) I m p r i m e (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 ) ; } } }
I A fun¸c˜ao Imprime imprime os m elementos do vetor.
I Chamada inicial: Permuta(m,m).
c
Gera¸c˜
ao das permuta¸c˜
oes (cont.)
Sa´ıda de Permuta(2,3) 1 2 3 2 1 3 1 3 2 3 1 2 3 2 1 2 3 1Desafio: imprimir em ordem lexicogr´afica:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de recurs˜ao 73
Exemplos de retrocesso
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 74
Exemplo 1: movimentos do cavalo
Movimentos poss´ıveis 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
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 75
Movimentos do cavalo (cont.)
Um percurso da posi¸c˜ao (0,0) at´e (4,4) (existem 27.419 solu¸c˜oes).
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
Movimentos do cavalo (cont.)
Um percurso da posi¸c˜ao (0,0) at´e (4,4) cobrindo todas as posi¸c˜oes:
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.: N˜ao existe solu¸c˜ao para o tabuleiro da transparˆencia anterior (provar!).
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 77
Movimentos do cavalo (cont.)
Tipos de solu¸c˜ao:
1. Achar uma solu¸c˜ao
2. Achar uma solu¸c˜ao que cobre todas as posi¸c˜oes livres
3. Enumerar todas as solu¸c˜oes
Observa¸c˜ao: Esta n˜ao ´e a melhor maneira de resolver este problema mas ilustra bem o mecanismo geral de retrocesso.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao 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 #d e f i n e TAM MAX 20 #d e f i n e NUM MOV 8 t y p e d e f enum { f a l s e , t r u e } B o o l e a n ; 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 ImprimeTab ( i n t tam ) { i n t i , j ; f o r ( i =0; i <tam ; i ++) { f o r ( j =0; j <tam ; j ++) p r i n t f ( ”%5d ” , t a b [ i ] [ j ] ) ; p r i n t f ( ” \ n ” ) ; } } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 79
Movimentos do cavalo: achar uma solu¸c˜
ao
B o o l e a n TentaMovimento ( 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 k , l p , cp ;
B o o l e a n r e s = f a l s e ;
i f ((0<= l i n ) && ( l i n <tam ) && (0<= c o l ) && ( c o l <tam ) && ( t a b [ l i n ] [ c o l ]==0)) { t a b [ l i n ] [ c o l ] = num ; i f ( ( l i n==l d ) && ( c o l==cd ) ) { r e s = t r u e ; ImprimeTab ( tam ) ; } e l s e { k = 0 ; do { l p = l i n +d l [ k ] ; cp = c o l+dc [ k ] ;
r e s = TentaMovimento ( tam , num+1 , l p , cp , l d , cd ) ; k++;
} w h i l e ( ( ! r e s ) && ( k<NUM MOV ) ) ; }
t a b [ l i n ] [ c o l ] = 0 ; }
r e t u r n r e s ; }
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd) c
Movimentos do cavalo: exemplo de entrada e sa´ıda
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 E n t r a d a S a´ıd a −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−− 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 c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 81
Movimentos do cavalo: achar uma solu¸c˜
ao completa
B o o l e a n TentaMovimento ( 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 noc ) { i n t k , l p , cp ;
B o o l e a n r e s = f a l s e ;
i f ((0<= l i n ) && ( l i n <tam ) && (0<= c o l ) && ( c o l <tam ) && ( t a b [ l i n ] [ c o l ]==0)) { t a b [ l i n ] [ c o l ] = num ;
i f ( ( l i n==l d ) && ( c o l==cd ) && ( ( noc+num)==tam ∗ tam ) ) { r e s = t r u e ; ImprimeTab ( tam ) ;
} e l s e { k = 0 ;
do { l p = l i n +d l [ k ] ; cp = c o l+dc [ k ] ; r e s =
TentaMovimento ( tam , num+1 , l p , cp , l d , cd , noc ) ; k++;
} w h i l e ( ( ! r e s ) && ( k<NUM MOV ) ) ; }
t a b [ l i n ] [ c o l ] = 0 ; }
r e t u r n r e s ; }
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd,ocupadas) c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 82
Movimentos do cavalo: achar todas as solu¸c˜
oes
v o i d TentaMovimento ( 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 k , l p , cp ;
i f ((0<= l i n ) && ( l i n <tam ) && (0<= c o l ) && ( c o l <tam ) && ( t a b [ l i n ] [ c o l ]==0)) { t a b [ l i n ] [ c o l ] = num ; i f ( ( l i n==l d ) && ( c o l==cd ) ) { ImprimeTab ( tam ) ; } e l s e { k = 0 ; do { l p = l i n +d l [ k ] ; cp = c o l+dc [ k ] ;
TentaMovimento ( tam , num+1 , l p , cp , l d , cd ) ; k++; } w h i l e ( k<NUM MOV) ; } t a b [ l i n ] [ c o l ] = 0 ; } }
Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd) c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 83
Exemplo 2: distˆ
ancia de edi¸c˜
ao
RECURS˜AO E RETROCESSO
RCURC¸ ˜AO ER RTROCESOS
ˆ ˆ ˆ ˆ ˆ ˆ
| | | | | |
I S R I I R
I Opera¸c˜oes elementares: I A: avan¸co (subentendido)
I I: inser¸c˜ao
I S: substitui¸c˜ao
I R: remo¸c˜ao
I Cada opera¸c˜ao recebe um custo (avan¸co, em geral, zero)
I Problema: achar uma sequˆencia de opera¸c˜oes que torna as cadeias iguais ao custo total m´ınimo.
c
Distˆ
ancia de edi¸c˜
ao: fun¸c˜
ao 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 d I n s , dRem , dSub ;
i f ( ( ( ∗ t e s t e )==NUL CHAR ) && ( ( ∗ c o r r e t a )==NUL CHAR ) ) r e t u r n 0 ;
d I n s = 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 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 ( ( ( ∗ t e s t e )!=NUL CHAR ) && ( ( ∗ c o r r e t a )!=NUL CHAR ) ) dSub = 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 ( ( ∗ t e s t e )!=NUL CHAR )
dRem = custoRem+D i s t a n c 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 )
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 min ( d I n s , min ( dRem , dSub ) ) ;
}
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 85
Distˆ
ancia de edi¸c˜
ao: desafios
I Melhorar o desempenho do algoritmo: o algoritmo ´e exponencial n˜ao sendo vi´avel, sob esta forma, em aplica¸c˜oes pr´aticas
I Imprimir o n´umero de opera¸c˜oes de cada tipo (avan¸co, inser¸c˜ao, remo¸c˜ao e substitui¸c˜ao) para obter a solu¸c˜ao
I Imprimir a sequˆencia de opera¸c˜oes para obter a solu¸c˜ao
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Exemplos de retrocesso 86
Elimina¸c˜
ao da recurs˜
ao
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 87
Esquema de fun¸c˜
ao recursiva
v o i d Exemplo ( T1 x1 , T2 x2 , . . . ) { S1 y1 ; S2 y2 ; . . . ; C i ; /∗ Comandos i n i c i a i s ∗/ i f ( E ( . . . ) ) { C0 ; /∗ Caso b a s e ∗/ } e l s e { /∗ Chamadas 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 s´ımbolos Ci, C0, C1, . . ., Cm e Cf representam sequˆencias, possivelmente vazias, de comandos.
c
Esquema de elimina¸c˜
ao da recurs˜
ao
v o i d Exemplo ( T1 x1 , T2 x2 , . . . ) { S1 y1 ; S2 y2 ; . . . ; C i ; /∗ Comandos i n i c i a i s ∗/ i f ( E ( . . . ) ) { C0 ; /∗ Caso b a s e ∗/ } e l s e { /∗ Chamadas 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 , . . . ) ; C f ;
} }
t y p e d e f enum { chamada1 , chamada2 , chamada3 , . . . } Chamadas ; t y p e d e f enum { e n t r a d a , s a i d a , r e t o r n o } A c o e s ; v o i d Exemplo ( 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 m p o r ´a r i a s ∗/ P i l h a f ; Chamadas ch ; A c o e s a c a o ; I n i c i a l i z a P i l h a (& f ) ; a c a o = e n t r a d a ; do { s w i t c h ( a c a o ) { c a s e ( e n t r a d a ) : . . . b r e a k ; c a s e ( r e t o r n o ) : . . . b r e a k ; c a s e ( s a i d a ) : b r e a k ; } } w h i l e ( a c a o != s a i d a ) ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 89
Esquema de elimina¸c˜
ao da recurs˜
ao (cont.)
v o i d Exemplo ( T1 x1 , T2 x2 , . . . ) { S1 y1 ; S2 y2 ; . . . ; C i ; /∗ Comandos i n i c i a i s ∗/ i f ( E ( . . . ) ) { C0 ; /∗ Caso b a s e ∗/ } e l s e { /∗ Chamadas 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 , . . . ) ; C f ; } } c a s e ( e n t r a d a ) : C i ; /∗ Comandos i n i c i a i s ∗/ i f ( E ( . . . ) ) { C0 ; a c a o = r e t o r n o ; /∗ Caso b a s e ∗/ } e l s e { /∗ P r i m e i r a chamada r e c u r s i v a ∗/ C1 ; E m p i l h a ( 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 m e n t o s ∗/ } b r e a k ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 90
Esquema de elimina¸c˜
ao da recurs˜
ao (cont.)
v o i d Exemplo ( T1 x1 , T2 x2 , . . . ) { S1 y1 ; S2 y2 ; . . . ; C i ; /∗ Comandos i n i c i a i s ∗/ i f ( E ( . . . ) ) { C0 ; /∗ Caso b a s e ∗/ } e l s e { /∗ Chamadas 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 , . . . ) ; C f ; } } c a s e ( 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 {
D e s e m p i l h a ( f ,& x1 ,& x2 , . . . , & y1 ,& y2 , . . . , & ch ) ; s w i t c h ( ch ) { c a s e ( chamada1 ) : C2 ; E m p i l h a ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada2 ) ; t 1 = e 2 1 ; t 2 = e 2 2 ; . . . ; x1 = t 1 ; x2 = t 2 ; . . . ; a c a o = e n t r a d a ; b r e a k ; c a s e ( chamada2 ) : C3 ; E m p i l h a ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada3 ) ; t 1 = e 3 1 ; t 2 = e 3 2 ; . . . ; x1 = t 1 ; x2 = t 2 ; . . . ; a c a o = e n t r a d a ; b r e a k ; . . . ; c a s e ( chamadam ) : Cf ; b r e a k ; } /∗ s w i t c h ( ch ) ∗/ } b r e a k ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 91
Exemplo 1: fun¸c˜
ao 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 ) ; } c
Fun¸c˜
ao 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); }t y p e d e f enum { chamada1 } Chamadas ;
t y p e d e f enum { e n t r a d a , s a i d a , r e t o r n o } A c o e s ; 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 ; Chamadas ch ; A c o e s a c a o ; I n i c i a l i z a P i l h a (& f ) ; a c a o = e n t r a d a ; do { s w i t c h ( a c a o ) { c a s e ( e n t r a d a ) : . . . b r e a k ; c a s e ( r e t o r n o ) : . . . b r e a k ; c a s e ( s a i d a ) : b r e 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 ∗/ c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 93
Fun¸c˜
ao 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 s e ( e n t r a d a ) : i f ( n==0) { r e s = 1 ; a c a o = r e t o r n o ; } e l s e { E m p i l h a ( f , n , chamada1 ) ; t 1 = n ; n = t1 −1; } b r e a k ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 94
Fun¸c˜
ao 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 s e ( 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 { D e s e m p i l h a ( f ,&n ,& ch ) ; s w i t c h ( ch ) { c a s e ( chamada1 ) : r e s = n ∗ r e s ; b r e a k ; } b r e a k ;
Obs.: Note como neste caso a vari´avel res ´e usada para guardar o resultado da fun¸c˜ao.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 95
Exemplo 2: fun¸c˜
ao Hanoi
v o i d H a n o i ( c h a r o r g , 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 , aux , d e s t , n − 1 ) ; p r i n t f ( ”Mova de %c p a r a %c \ n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n − 1 ) ; } } c
Fun¸c˜
ao Hanoi (cont.)
v o i d H a n o i ( c h a r o r g , 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 , aux , d e s t , n −1); p r i n t f ( ”Mova de %c p a r a %c\n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n −1); } }t y p e d e f enum { chamada1 , chamada2 } ;
t y p e d e f enum { e n t r a d a , s a i d a , r e t o r n o } A c o e s ; v o i d H a n o i ( c h a r o r g , 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 ; Chamadas ch ; A c o e s a c a o ; I n i c i a l i z a P i l h a (& f ) ; a c a o = e n t r a d a ; do { s w i t c h ( a c a o ) { c a s e ( e n t r a d a ) : . . . ; b r e a k ; c a s e ( r e t o r n o ) : . . . ; b r e a k ; c a s e ( s a i d a ) : b r e a k ; } } w h i l e ( a c a o != s a i d a ) ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 97
Fun¸c˜
ao Hanoi (cont.)
v o i d H a n o i ( c h a r o r g , 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 , aux , d e s t , n −1); p r i n t f ( ”Mova de %c p a r a %c\n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n −1); } } c a s e ( e n t r a d a ) : i f ( ! ( n >0)) { a c a o = r e t o r n o ; } e l s e { E m p i l h a ( f , o r g , d e s t , aux , n , chamada1 ) ; t 1 = o r g ; t 2 = aux ; t 3 = d e s t ; t 4 = n −1; o r g = t 1 ; d e s t = t 2 ; aux = t 3 ; n = t 4 ; } b r e a k ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 98
Fun¸c˜
ao Hanoi (cont.)
v o i d H a n o i ( c h a r o r g , 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 , aux , d e s t , n −1); p r i n t f ( ”Mova de %c p a r a %c\n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n −1); } } c a s e ( 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 {
D e s e m p i l h a ( f ,& o r g ,& d e s t ,& aux ,&n ,& ch ) ; s w i t c h ( ch ) { c a s e ( chamada1 ) : p r i n t f ( ”Mova de %c p a r a %c \ n ” , o r g , d e s t ) ; E m p i l h a ( f , o r g , d e s t , aux , n , chamada2 ) ; t 1 = aux ; t 2 = d e s t ; t 3 = o r g ; t 4 = n −1; o r g = t 1 ; d e s t = t 2 ; aux = t 3 ; n = t 4 ; a c a o = e n t r a d a ; b r e a k ; c a s e ( chamada2 ) : b r e a k ; } b r e a k ; c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Elimina¸c˜ao da recurs˜ao 99
Exemplo de elimina¸c˜
ao da recurs˜
ao caudal
Aplic´avel quando a ´ultima a¸c˜ao dentro do corpo da fun¸c˜ao ´e uma chamada recursiva: reaproveita o mesmo registro de ativa¸c˜ao da fun¸c˜ao, mudando os valores dos argumentos.
v o i d H a n o i ( c h a r o r g , c h a r d e s t , c h a r aux , i n t n ) { i f ( n >0) { H a n o i ( o r g , aux , d e s t , n − 1 ) ; p r i n t f ( ”Mova de %c p a r a %c \ n ” , o r g , d e s t ) ; H a n o i ( aux , d e s t , o r g , n − 1 ) ; } } v o i d H a n o i ( c h a r o r g , 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 , aux , d e s t , n − 1 ) ; p r i n t f ( ”Mova de %c p a r a %c \ n ” , o r g , d e s t ) ; t = o r g ; o r g = aux ; aux = t ; } } c
Recurs˜
ao m´
utua: An´
alise sint´
atica
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 101
Exemplo simples de recurs˜
ao m´
utua
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 ) ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 102
An´
alise de express˜
oes
Express˜oes com operadores bin´arios ‘+’, ‘−’, ‘∗’, ‘/’ e parˆenteses ‘(’ e ‘)’: e = t1⊕ t2⊕ · · · ⊕ tn, n ≥ 1
t = f1⊗ f2⊗ · · · ⊗ fn, n ≥ 1
f = x ou f = ( e )
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 103
Programa de tradu¸c˜
ao de infixa para p´
os-fixa:
c h a r e n t r a d 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 I n P o s ( ) { pe = &e n t r a d a [ 0 ] ; E x p r e s s a o ( ) ; i f ( ( ∗ pe )!= ’ \0 ’ ) E r r o ( ) ; } c
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 s e ’ a ’ : c a s e ’ b ’ : . . . : c a s e ’ z ’ : S a i ( c o r r e n t e ) ; pe++; b r e a k ; c a s e ’ ( ’ : pe++; E x p r e s s a o ( ) ; i f ( ( ∗ pe)== ’ ) ’ ) pe++; e l s e E r r o ( ) ; b r e a k ; d e f a u l t : E r r o ( ) ; } } c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 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 ( ) ; S a i ( op ) ; } e l s e b r e a k ; /∗ do ∗/ } w h i l e ( t r u e ) ; } c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 106
Express˜
ao
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 ( ) ; S a i ( op ) ; } e l s e b r e a k ; /∗ do ∗/ } w h i l e ( t r u e ) ; } c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 107
Operador de exponencia¸c˜
ao
Fator redefinido:
f = p1∧ p2∧ · · · ∧ pn, n ≥ 1
Prim´ario:
p = x ou p = ( e )
Prioridade? Solu¸c˜ao:
f = p ou f = p ∧ f
c
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 ( ) ; S a i ( ’ ˆ ’ ) ; } } c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 109
Prim´
ario
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 s e ’ a ’ : c a s e ’ b ’ : . . . : c a s e ’ z ’ : S a i ( c o r r e n t e ) ; pe++; b r e a k ; c a s e ’ ( ’ : pe++; E x p r e s s a o ( ) ; i f ( ( ∗ pe)== ’ ) ’ ) pe++; e l s e E r r o ( ) ; b r e a k ; d e f a u l t : E r r o ( ) ; } } c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 110
Analogia para express˜
oes e termos
e = t ou e = e ⊕ t
t = f ou t = t ⊗ f
Problemas:
I como distinguir as alternativas
I repeti¸c˜ao infinita no segundo caso (recurs˜ao 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 ( ) ; . . . } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Recurs˜ao m´utua: An´alise sint´atica 111
´
Arvores bin´
arias
c
Exemplo de ´
arvore bin´
aria 1: pedigree
Sugarted’s Bonnie
Carina de Wood Ladge
Matarazzo’s Beauty Lady Weberly Johnson
Fancy Boots
Scotland dos Seis Irm˜aos Arisca dos Seis Irm˜aos Ator dos
Seis Irm˜aos
Jesse James R. J. B. Helvetia Carina de Wood Ladge R. J. B. Sean R. J. B. Hill Lakeview Lois R. J. B. Sean
I Alguns nomes s˜ao repetidos: eles devem ser tratados como instˆancias separadas.
I Pela pr´opria natureza da ´arvore, cada elemento tem dois predecessores: ´arvore bin´aria.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 113
Exemplo de ´
arvore bin´
aria 2: ´
arvore de decis˜
ao
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
I A ´arvore representa as decis˜oes tomadas por um algoritmo de ordena¸c˜ao usando opera¸c˜oes de compara¸c˜ao; V: verdadeiro, F: falso.
I Devido `a natureza das compara¸c˜oes, a ´arvore ´e bin´aria.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 114
Exemplo de ´
arvore geral 1: descendentes
Indo-Europeu Balto-Eslavo B´altico Let˜ao Lituano Eslavo Checo Russo Polonˆes It´alico Latim
Catal˜ao Italiano Francˆes Castelhano Portuguˆes Indo-Iraniano Persa Antigo Persa Hindustano Urdu Hindi Germˆanico Germˆanico Setentrional Sueco Norueguˆes Dinamarquˆes Germˆanico Ocidental Holandˆes Alem˜ao Inglˆes Grego
Cl´assico Grego Moderno
I A ´arvore ´e incompleta e n˜ao necessariamente exata.
I Cada elemento pode ter um n´umero vari´avel de sucessores: ´arvore geral.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 115
Exemplo de ´
arvore geral 2: descendentes
Fam´ılia Subfam´ılia Tribo Gˆenero Esp´ecie Subesp´ecie Hominidae Homininae Hominini Homo Homo sapiens Homo sapiens sapiens Homo habilis Homo neander-thalensis . . . Pan Chimpanz´e Bonobo Gorillini Gorilla Gorila Ponginae Pongo Orangotango
I Arvore da fam´ılia Hominidae determinada por compara¸´ c˜ao de DNA de v´arias esp´ecies (incompleta).
I Cada elemento pode ter um n´umero vari´avel de sucessores: ´arvore geral.
c
Exemplo de ´
arvore geral 3: organograma
UNICAMP IC DSC DSI DTC IMECC DE DM DMA FEEC DCA DEB DT FCMDAP DAN DTO
. . .
. . . .
Obs.: A UNICAMP tem 21 unidades acadˆemicas. Algumas unidades tˆem
mais de 10 departamentos.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 117
Defini¸c˜
ao de ´
arvore bin´
aria
Uma ´arvore bin´aria ´e um conjunto de n´os que:
I ou ´e vazio (´arvore bin´aria vazia)
I ou cont´em um n´o especial denominado raiz da ´arvore e o resto do conjunto est´a particionado em duas ´arvores bin´arias disjuntas
(possivelmente vazias), denominadas sub´arvore esquerda e sub´arvore direita.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 118
Representa¸c˜
ao gr´
afica, conven¸c˜
oes e conceitos
n´ıvel 1 n´ıvel 2 n´ıvel 3 n´ıvel 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 Irm˜ao de E: D
Descendentes de B: B, D, E e G Antepassados de H: H, F , C e A
Folhas: D, G e H N´os internos: todos exceto as folhas
N´ıveis: indicados na figura Altura (profundidade) – n´ıvel m´aximo: 4
Sub´arvores bin´arias vazias: 9 Sub´arvores bin´arias n˜ao vazias: 7 Obs.: Alguns autores come¸cam a numera¸c˜ao dos n´ıveis a partir de zero.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 119
Fatos sobre ´
arvores bin´
arias
I Uma ´arvore bin´aria com n n´os tem: I altura m´axima n
I altura m´ınima dlog2(n + 1)e
I sub´arvores vazias: n + 1
I sub´arvores n˜ao vazias: n − 1 (se n > 0)
I Uma ´arvore bin´aria de altura h tem: I no m´ınimo h n´os
I no m´aximo 2h− 1 n´os
c
Representa¸c˜
ao ligada comum
p A B C D E F G HO acesso a todos os n´os da ´arvore pode ser realizado atrav´es de um apontador para a raiz.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 121
Representa¸c˜
ao ligada com trˆ
es 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
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 122
Representa¸c˜
ao com o campo pai apenas
A
B C
D E F
G H
Problemas:
I E necess´´ ario haver acesso (apontadores) pelo menos a todas as folhas.
I N˜ao ´e poss´ıvel distinguir entre os filhos esquerdos e direitos.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 123
Representa¸c˜
ao seq¨
uencial: ´
arvores bin´
arias 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 N´o n: filho esquerdo: 2n + 1 (n ≥ 0) filho direito: 2n + 2 (n ≥ 0) pai: b(n − 1)/2c (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
Representa¸c˜
ao seq¨
uencial: ´
arvores bin´
arias 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 T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 125
Percursos em profundidade
I Pr´e-ordem:
Visitar a raiz
Percorrer a sub´arvore esquerda em pr´e-ordem Percorrer a sub´arvore direita em pr´e-ordem
I P´os-ordem:
Percorrer a sub´arvore esquerda em p´os-ordem Percorrer a sub´arvore direita em p´os-ordem Visitar a raiz
I Inordem (ou ordem sim´etrica):
Percorrer a sub´arvore esquerda em inordem
Visitar a raiz
Percorrer a sub´arvore direita em inordem
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 126
Exemplos de percurso em profundidade
A B D E G C F H Pr´e-ordem: A,B,D,E,G,C,F ,H
P´os-ordem: D,G,E,B,H,F ,C,A
Inordem: D,B,G,E,A,F ,H,C
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 127
Percurso em largura
Percurso por n´ıveis, da esquerda para a direita:
n´ıvel 1 n´ıvel 2 n´ıvel 3 n´ıvel 4 A B D E G C F H Percurso: A,B,C,D,E,F ,G,H c
Implementa¸c˜
ao recursiva de percursos
t y p e d e f s t r u c t NoArvBin { T i n f o ; s t r u c t NoArvBin ∗ e s q , ∗ d i r ; } NoArvBin , ∗ A r v B i n ; v o i d PreOrdem ( A r v B i n 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 ( A r v B i n 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 ( A r v B i n 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 T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 129
Elimina¸c˜
ao da recurs˜
ao caudal
v o i d PreOrdem ( A r v B i n 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 ( A r v B i n 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 ∗/
I Transforma¸c˜ao an´aloga pode ser feita para a inordem.
I E a p´os-ordem?
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 130
Percurso em pr´
e-ordem, usando uma pilha expl´ıcita
A figura indica a situa¸c˜ao inicial e final do percurso de uma ´arvore arbitr´aria (pode ser vazia). Inicialmente, o apontador para a ´arvore deve estar no topo da pilha. Terminado o percurso, a pilha ter´a um elemento a menos.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 131
Percurso em pr´
e-ordem, usando uma pilha expl´ıcita (cont.)
X
E D
Visita X Percorre E Percorre D
c
Percurso em pr´
e-ordem, usando uma pilha (cont.)
v o i d PreOrdem ( A r v B i n 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 ) ; E m p i l h a (& p l , p ) ; do { D e s e m p i l h a (& p l ,& 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 T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 133
Percurso em largura, usando uma fila
Os n´os da ´arvore a serem visitados s˜ao guardados numa fila.
X E D n´ıvel k n´ıvel k +1 Visita X c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 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 ∗/ c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 135
Compara¸c˜
ao dos percursos em pr´
e-ordem e em largura
v o i d PreOrdem ( A r v B i n 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 ) ; E m p i l h a (& p l , p ) ; do { D e s e m p i l h a (& p l ,& 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 idˆenticos, exceto a troca de esquerda pela direita!
c
Preordem com pilha otimizada
v o i d PreOrdem ( A r v B i n p ) { P i l h a p l ; B o o l e a n 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 ) E m p i l h a ( p l , p−> d i r ) ; p = p−>e s q ; } 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 D e s e m p i l h a ( p l ,& p ) ; } w h i l e ( ! f i m ) ; } /∗ PreOrdem ∗/ c2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 137
Pr´
e-ordem com pilha embutida: Deutsch, Schorr e Waite
... ... ... ... ... ... ... ... ... ... t p NULL
I A vari´avel p aponta para a sub´arvore a ser percorrida.
I A vari´avel t aponta para o topo de uma pilha formada pelos n´os que levam ao n´o p (apontadores invertidos).
I Cada n´o dever´a conter uma marca indicando qual dos dois apontadores est´a invertido.
I A fun¸c˜ao seguinte implementa os trˆes percursos em profundidade. c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 138
Pr´
e-ordem com pilha embutida (cont.)
v o i d DSW( A r v B i n p ) {
A r v B i n t = NULL ; A r v B i n q ; B o o l e a n s o b e ; do {
w h i l e ( p!=NULL ) { /∗ `a e s q u e r d a ∗/
P r e V i s i t a ( p ) ; p−>marca = MarcaEsq ; q = p−>e s q ; p−>e s q = t ; t = p ; p = q ; } s o b e = t r u e ; w h i l e ( s o b e && ( t !=NULL ) ) { s w i t c h ( t−>marca ) { c a s e MarcaEsq : /∗ `a d i r e i t a ∗/ I n V i s i t a ( t ) ; s o b e = f a l s e ; t−>marca = M a r c a D i r ; q = p ; p = t−> d i r ; t−> d i r = t−>e s q ; t−>e s q = q ; b r e a k ; c a s e M a r c a D i r : /∗ 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 r e a k ; } } } w h i l e ( t !=NULL ) ; } c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 139
Desafios:
I melhorar a pr´e-ordem com pilha otimizada
I inordem com pilha otimizada
I p´os-ordem com pilha otimizada
c
Reconstru¸c˜
ao de ´
arvores bin´
arias
Pr´e-ordem AB: A B A B Inordem AB: B A A B P´os-ordem AB: B A B APr´e-ordem AB e p´os-ordem BA:
A B
A B
Conclus˜ao: uma ´unica ordem e a combina¸c˜ao de pr´e- e p´os-ordens n˜ao determinam a ´arvore de maneira ´unica.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 141
Reconstru¸c˜
ao de ´
arvores bin´
arias (cont.)
Verifica-se facilmente que a pr´e-ordem (ou a p´os-ordem) combinada com a inordem determinam, de maneira ´unica, a forma da ´arvore. No caso da pr´e-ordem e inordem, pode-se seguir o seguinte algoritmo:
I a partir da pr´e-ordem, determine a raiz da ´arvore
I dada a raiz, ela separa a inordem em inordens das suas sub´arvores esquerda e direita
I a partir da pr´e-ordem, s˜ao determinadas as pr´e-ordens das sub´arvores
que tˆem os mesmos comprimentos das respectivas inordens
I recursivamente s˜ao reconstru´ıdas as sub´arvores
O caso da p´os-ordem ´e an´alogo.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 142
Representa¸c˜
oes externas de ´
arvores bin´
arias
A B D E G C F H
I percursos canˆonicos: inordem e pr´e (ou p´os) -ordem (j´a visto):
DBGEAF HC ABDEGCF H
I percurso canˆonico com indicadores de sub´arvores (pr´e-ordem): A11B11D00E10G00C10F01H00
O ´ındice 0 indica a ausˆencia e 1 indica a existˆencia de filho esquerdo ou direito.
I descri¸c˜ao parent´etica (inordem):
(((()D())B((()G())E()))A((()F (()H()))C()))
() representa uma ´arvore vazia; (αXβ) representa uma ´arvore de raiz X e sub´arvores descritas pelas cadeias α e β.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias 143
´
Arvores bin´
arias de busca
c
Exemplo de ´
arvore de busca: n´
umeros
16 8 5 15 10 27 21 25Para qualquer n´o da ´arvore, os elementos da sua sub´arvore esquerda (direita) s˜ao menores ou iguais (maiores ou iguais) do que o elemento do n´o.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias de busca 145
Exemplo de ´
arvore de busca: nomes
jul fev ago abr dez jan set mai jun mar nov out
Para qualquer n´o da ´arvore, os elementos da sua sub´arvore esquerda (direita) precedem (seguem) em ordem alfab´etica o elemento do n´o.
c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias de busca 146
Inser¸c˜
ao em ´
arvore de busca
A inser¸c˜ao de um valor X cria uma nova folha em lugar de uma sub´arvore vazia. O ponto de inser¸c˜ao ´e determinado pelo percurso da ´arvore usando a propriedade de ´arvores de busca.
Y X < Y Y X Y X > Y Y X c
2010 T. Kowaltowski Estruturas de Dados e T´ecnicas de Programa¸c˜ao Arvores bin´´ arias de busca 147
Inser¸c˜
ao recursiva
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 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 = NULL ; ( ∗ 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 ( 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)−> e s q ) , x ) ; e l s 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)−> d i r ) , x ) ; e l s e r e t u r n f a l s e ; } }I Note-se o uso de passagem de parˆametro p por referˆencia.
I Esta vers˜ao apresenta somente recurs˜ao caudal que pode ser facilmente eliminada.
c