• Nenhum resultado encontrado

estrutura de dados e técnicas de programação

N/A
N/A
Protected

Academic year: 2021

Share "estrutura de dados e técnicas de programação"

Copied!
89
0
0

Texto

(1)

Estruturas de Dados

e

ecnicas de Programa¸

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

(2)

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

(3)

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

(4)

Significado intuitivo da nota¸c˜

ao

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 logan =

O

(logbn), a, b > 0 log2n =

O

(log10n) c

2010 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). c

2010 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

(5)

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 3000

Supondo 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

(6)

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 c

2010 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

(7)

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

(8)

Lista circular com n´

o cabe¸ca

p . . . Lista vazia: p c

2010 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

(9)

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 5

Dada 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

(10)

Matrizes esparsas: listas ortogonais

50 0 0 0 10 0 20 0 0 0 0 0 −30 0 −60 5 4 -1 3 -1 2 -1 1 -1 -1 -1 -1 1 -1 2 -1 3 -1 4 1 1 50 2 1 10 2 3 20 4 1 -30 4 3 -60 4 4 5

O acesso `a matriz ´e feito a partir do 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

(11)

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

(12)

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

(13)

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

(14)

Exemplo de aplica¸c˜

ao simples: balanceamento de parˆ

enteses

Correto Incorreto  ( () ) [()] [) []()[()[]] ()()[ ((([[[]]]))) )( c

2010 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

(15)

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

(16)

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 c

2010 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

(17)

Torres de Hanoi: movimento do maior disco

X Y Z ... ... N-1 Move X para Y X Y Z ... ... N-1 c

2010 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

(18)

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 c

2010 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

(19)

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 1

Desafio: 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

(20)

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

(21)

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 c

2010 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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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 ( ) ; } } c

2010 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 ) ; } c

2010 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 ) ; } c

2010 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

(28)

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 ( ’ ˆ ’ ) ; } } c

2010 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 ( ) ; } } c

2010 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

(29)

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

(30)

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 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

(31)

Representa¸c˜

ao ligada comum

p A B C D E F G H

O 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

(32)

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 c

2010 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

(33)

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 ∗/ c

2010 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

(34)

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 ∗/ c

2010 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

(35)

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 ∗/ c

2010 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

(36)

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 A

Pr´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

(37)

Exemplo de ´

arvore de busca: n´

umeros

16 8 5 15 10 27 21 25

Para 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

Referências

Documentos relacionados

Os instrumentos de pesquisa utilizados serão: Ficha de Rastreamento das Participantes do Estudo, International Consultation on Incontinence Questionnaire – Short Form

Objeto: Pregão Eletrônico - Re- gistro de Preços para a eventual aquisição de materiais de audiovisual e tecnologia da informação para atender ao Campus Blumenau da

Changes in the gut microbiota appears to be a key element in the pathogenesis of hepatic and gastrointestinal disorders, including non-alcoholic fatty liver disease, alcoholic

A incidência de FO no estado de Sergipe obtida através dos dados do SINASC, no mesmo período da pesquisa, foi de 0,54 novos casos de fissura para cada 1000 nascidos vivos..

Entretanto, encontramos evidências neste trabalho de que estas variáveis não satisfazem as condições para serem utilizadas como instrumentos (Cap.2, seção 3.1.).

Assim como a Natureza, a leitura de folhetos de cordel constituiu uma fonte de inspiração para fazer poesia.. Na comunidade em que vivia Patativa, a leitura dos folhetos de

As quinolonas já têm sido relatadas como seguras para o tratamento da otite, sem apresentar sinais de ototoxicidade nos animais (GOTTHELF, 2004), e não foram observados

Observações como esta ganham peso ainda maior quando se leva em conta que, num país desprovido de cultura científica, os veículos de comunicação representam o canal mais