Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Estruturas de Dados e Te´cnicas de Programac¸a˜o Tomasz Kowaltowski Instituto de Computac¸a˜o Universidade Estadual de Campinas www.ic.unicamp.br/∼tomasz c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o 1 Copyright c© 2010-2011 Tomasz Kowaltowski Instituto de Computac¸a˜o Universidade Estadual de Campinas Algumas transpareˆncias foram adaptadas da apostila Estruturas de Dados e Te´cnicas de Programac¸a˜o de autoria de Cla´udio L. Lucchesi e Tomasz Kowaltowski. Estas transpareˆncias somente podem ser copiadas para uso pessoal dos docentes e alunos das disciplinas oferecidas pelo Instituto de Computac¸a˜o da UNICAMP. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o 2 Introduc¸a˜o c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Introduc¸a˜o 3 Pre´-requisito e objetivos I Pre´-requisito: curso ba´sico de programac¸a˜o em C I Objetivos: I Programac¸a˜o em (relativamente) baixo n´ıvel I Te´cnicas de programac¸a˜o e estruturac¸a˜o de dados I Preparac¸a˜o para: I Ana´lise de algoritmos I Programac¸a˜o de sistemas I Programac¸a˜o em geral I Bancos de dados I Engenharia de software I . . . c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Introduc¸a˜o 4 Programa I Introduc¸a˜o a` ana´lise de algoritmos I Estruturac¸a˜o elementar de dados: matrizes, registros, apontadores I Estruturas lineares: pilhas, filas, filas duplas I Recursa˜o e retrocesso I A´rvores bina´rias: representac¸a˜o, percursos I A´rvores gerais: representac¸a˜o, percursos I Aplicac¸a˜o de a´rvores: a´rvores de busca (AVL), filas de prioridade, a´rvores B, a´rvores rubro-negras, a´rvores digitais I Listas generalizadas I Espalhamento I Processamento de cadeias de caracteres I Gerenciamento de memo´ria I Algoritmos de ordenac¸a˜o I Algoritmos em grafos I Tipos abstratos de dados e orientac¸a˜o a objetos c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Introduc¸a˜o 5 Bibliografia c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Bibliografia 6 A. V. Aho, J. E. Hopcroft, and J. Ullman. Data Structures and Algorithms. Addison-Wesley, 1983. A. Drozdek. Estrutura de Dados e Algoritmos em C++. Thomson, 2002. J. L. Szwarcfiter e L. Markenzon. Estruturas de Dados e seus Algoritmos. LTC Editora, 1994. C. L. Lucchesi e T. Kowaltowski. Estruturas de Dados e Te´cnicas de Programac¸a˜o. Instituto de Computac¸a˜o – UNICAMP, 2003. P. Feofiloff. Algoritmos em Linguagem C. Elsevier Editora Ltda., 2009. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Bibliografia 7 G. H. Gonnet. Handbook of Algorithms and Data Structures. Addison-Wesley, 1984. E. Horowitz and S. Sahni. Fundamentals of Data Structures in Pascal. Computer Science Press, 1984. D. E. Knuth. The Art of Computer Programming, volume I: Fundamental Algorithms. Addison-Wesley, 1978. E. M. Reingold and W. J. Hanson. Data Structures. Little Brown and Company, 1983. R. Sedgewick. Algorithms in C. Addison-Wesley, 1990. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Bibliografia 8 D. F. Stubbs and N. W. Webre. Data Structures with Abstract Data Types and Pascal. Brooks/Cole, 1985. A. M. Tenenbaum, Y. Langsam, and M. J. Augenstein. Data Structures using C. Prentice-Hall, 1990. N. Wirth. Algorithms + Data Structures = Programs. Prentice-Hall, 1976. N. Ziviani. Projeto de Algoritmos (2a. ed.) Thomson, 2004. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Bibliografia 9 Noc¸o˜es de Ana´lise de Algoritmos c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 10 Escolha da estrutura Importaˆncia da escolha de estrutura de dados – busca do k-e´simo elemento numa sequ¨eˆncia: . . . x = a [ k ] ; . . . . . . p = a ; i = 0 ; whi le ( i<k ) { p = p−>prox ; i ++; } x = p−> i n f o ; . . . (a) (b) (a) Nu´mero de operac¸o˜es constante (vetor). (b) Nu´mero de operac¸o˜es proporcional a k (lista ligada). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 11 Exemplo de ana´lise 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 ana´lise simples (1) 1 n n2 ana´lise detalhada (2) 2 5n+ 2 5n2 + 5n+ 2 (1): atribuic¸o˜es (2): atribuic¸o˜es, operac¸o˜es aritme´ticas e comparac¸o˜es As duas ana´lises produzem resultados proporcionais para valores crescentes de n. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 12 Notac¸a˜o O() Definic¸a˜o: f(n) = O(g(n)) se existem n0 e k com f(n) ≤ k ∗ g(n) para todo n > n0. Exemplos: c = O(1) para qualquer constante c 2 = O(1) 5n+ 2 = O(n) 5n2 + 5n+ 2 = O(n2) n2 = O(n3) nk = O(nk+1), k ≥ 0 loga n = O(logb n), a, b > 0 log2 n = O(log10 n) Outras notac¸o˜es importantes: Θ(), Ω(), etc. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 13 Exemplo de ana´lise de um procedimento de ordenac¸a˜o vo id 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 nu´mero de comparac¸o˜es de elementos de v, para cada valor de i, e´ n− i− 1. O nu´mero total de comparac¸o˜es sera´: n−2∑ i=0 (n− i− 1) = n 2 2 + n 2 ou seja, o nu´mero de comparac¸o˜es e´ da ordem de O(n2). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 14 Crescimento de algumas func¸o˜es n log2 n n log2 n n 2 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 15 Exemplo Suponha duas ma´quinas M1 e M2, sendo a primeira cem vezes mais ra´pida do que a segunda. Ambas as ma´quinas executam um algoritmo de busca num vetor ordenado de comprimento n. A ma´quina M1 executa o algoritmo de busca sequencial (pior caso: n operac¸o˜es); a ma´quina M2 executa o algoritmo de busca bina´ria (pior caso: log2 n operac¸o˜es). A seguinte tabela poderia ser obtida atrave´s de medidas experimentais de tempo de execuc¸a˜o para vetores de diversos tamanhos, usando alguma unidade de tempo conveniente. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 16 Exemplo (cont.) n M1 (ra´pida) M2 (lenta) 16 16 400 32 32 500 64 64 600 128 128 700 256 256 800 512 512 900 1024 1024 1000 2048 2048 1100 . . . . . . . . . 220 1.048.576 2000 221 2.097.152 2100 . . . . . . . . . 230 1.073.741.824 3000 Supondo que a unidade seja 1µs (microssegundo), 2.097.152µs corresponde a 17 minutos e 1.073.741.824µs equivale a cerca de 12 horas. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Noc¸o˜es de Ana´lise de Algoritmos 17 Execuc¸a˜o de programas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Execuc¸a˜o de programas 18 Exemplo de func¸o˜es simples vo id g ( i n t x , i n t ∗y ) { ∗y = x ; } /∗ g ∗/ vo id f ( i n t ∗ z ) { i n t y ; char b ; y = 2 3 5 ; g ( y , z ) ; } /∗ f ∗/ i n t main ( ) { i n t i ; char c ; char v [ 5 ] ; f (& i ) ; r e t u r n 0 ; } /∗ main ∗/ Pilha de execuc¸a˜o (supo˜e inteiros de dois bytes): i c v main z y b f 235 x y 235 g 235 Obs.: Na realidade, os inteiros sa˜o armazenados sob a forma bina´ria. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Execuc¸a˜o de programas 19 Exemplo de func¸o˜es com alocac¸a˜o dinaˆmica typedef char Cade ia [ 5 ] ; typedef Cade ia ∗ApCadeia ; typedef s t r u c t { Cade ia nome ; i n t i d a d e ; } Reg , ∗ApReg ; ApCadeia apc ; ApReg apr ; i n t ∗ a p i ; vo id Aloca ( ApCadeia ∗c , ApReg ∗ r ) { a p i = m a l l o c ( s i z e o f ( i n t ) ) ; ∗ a p i = 1 0 ; ∗c = m a l l o c ( s i z e o f ( Cade ia ) ) ; ∗ r = m a l l o c ( s i z e o f ( Reg ) ) ; } /∗ Aloca ∗/ i n t main ( ) { Aloca (&apc ,& apr ) ; f r e e ( apc ) ; f r e e ( apr ) ; f r e e ( a p i ) ; r e t u r n 0 ; } /∗ main ∗/ memo´ria dinaˆmica pilha de execuc¸a˜o apc apr api global main c r Aloca 1010 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Execuc¸a˜o de programas 20 Exemplo de func¸a˜o recursiva i n t main ( ) { i n t m; m = f a t ( 4 ) ; r e t u r n 0 ; } /∗ main ∗/ i n t f a t ( i n t n ) { i f ( n==0) r e t u r n 1 ; e l s e r e t u r n n∗ f a t ( n−1); } /∗ f a t ∗/ m res n 4 res n 3 res n 2 res n 1 res n 011262424 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Execuc¸a˜o de programas 21 Estruturas ligadas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 22 Listas ligadas simples p . . . Declarac¸o˜es (equivalentes): typedef s t r u c t R e g L i s t a ∗ L i s t a ; typedef s t r u c t R e g L i s t a { T i n f o ; L i s t a prox ; } R e g L i s t a ; typedef s t r u c t R e g L i s t a { T i n f o ; s t r u c t R e g L i s t a ∗ prox ; } R e g L i s t a , ∗ L i s t a ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 23 Inserc¸a˜o e remoc¸a˜o com passagem por valor . . . x . . . p q vo id 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−>prox = p−>prox ; p−>prox = q ; } vo id Remove ( L i s t a p , T ∗x ) { L i s t a q = p−>prox ; ∗x = q−> i n f o ; p−>prox = q−>prox ; f r e e ( q ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 24 Inserc¸a˜o e remoc¸a˜o com passagem por valor (cont.) . . . x . . . p q I O argumento p e´ o apontador para o predecessor do no´ a ser inserido ou removido. I A func¸a˜o ’Remove’ na˜o pode remover um no´ que e´ o u´nico da lista. I A func¸a˜o ’Insere’ na˜o pode inserir um no´ no in´ıcio da lista, inclusive se ela for vazia. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 25 Inserc¸a˜o e remoc¸a˜o com passagem por refereˆncia . . . x . . . p q vo id 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−>prox = ∗p ; ∗p = q ; } vo id Remove ( L i s t a ∗p , T ∗x ) { L i s t a q = ∗p ; ∗x = q−> i n f o ; ∗p = q−>prox ; f r e e ( q ) ; } Esta convenc¸a˜o elimina os problemas da passagem por valor. Note-se que as varia´veis p e q teˆm tipos diferentes. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 26 Lista simples com no´ cabec¸a p . . . Lista vazia: p Esta convenc¸a˜o permite o uso de passagem por valor nas func¸o˜es ba´sicas. O campo de informac¸a˜o do no´ cabec¸a pode ser aproveitado para guardar alguma informac¸a˜o adicional (por exemplo, o comprimento da lista). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 27 Lista simples circular p . . . Problema: lista vazia? c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 28 Lista circular com no´ cabec¸a p . . . Lista vazia: p c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 29 Busca em lista circular com no´ cabec¸a – 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−>prox ; } whi le ( ( 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−>prox ; } whi le ( 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 30 Lista duplamente ligada com no´ cabec¸a p . . . Lista vazia: p I E´ poss´ıvel percorrer os elementos nas duas direc¸o˜es, a partir de qualquer lugar da lista. I E´ poss´ıvel remover o elemento apontado. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 31 Operac¸o˜es sobre listas duplamente ligadas typedef s t r u c t R e g L i s t a D u p l a { T i n f o ; s t r u c t R e g L i s t a D u p l a ∗ esq ,∗ d i r ; } RegLis taDupla , ∗ L i s t a D u p l a ; vo id 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−>esq = p−>esq ; q−>d i r = p ; p−>esq−>d i r = q ; p−>esq = q ; } vo id RemoveDupla ( L i s t a D u p l a p , T ∗x ) { p−>esq−>d i r = p−>d i r ; p−>d i r−>esq = p−>esq ; ∗x = p−> i n f o ; f r e e ( p ) ; } A func¸a˜o ’RemoveDupla’ supo˜e que ha´ pelo menos um elemento na lista. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 32 Exemplo: operac¸o˜es com polinoˆmios Seja um polinoˆmio de grau n: P (x) = anx n + an−1xn−1 + . . .+ a1x1 + a0x0 onde an 6= 0, exceto possivelmente no caso n = 0. Representac¸a˜o ligada omite os termos na˜o nulos. Por exemplo, os polinoˆmios: P1(x) = 5x 20 − 3x5 + 7 e P2(x) = 0: podem ser representados por: -1p1 5 20 -3 5 7 0 -1p2 Por convenc¸a˜o, o expoente do no´ cabec¸a e´ -1. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 33 Exemplo de func¸a˜o: impressa˜o typedef s t r u c t AuxPol { i n t expo ; f l o a t c o e f ; s t r u c t AuxPol ∗ prox ; } Termo , ∗P o l i n o m i o ; vo id Im pr ime Po l ino mi o ( P o l i n o m i o p ) { i f ( p−>prox==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−>prox ; whi le ( p−>expo !=−1) { p r i n t f ( ”(%2d ,%5.1 f ) ” , p−>expo , p−>c o e f ) ; p = p−>prox ; } p r i n t f ( ”\n” ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 34 Soma de polinoˆmios: paradigma de intercalac¸a˜o -1p pp0 . . . pp -1q qq0 . . . qq -1r rr0 . . . rr As varia´veis pp e qq representam os termos correntes dos polinoˆmios dentro da malha de repetic¸a˜o e a varia´vel rr aponta para o u´ltimo termo ja´ calculado da soma; pp0, qq0 e rr0 sa˜o os valores iniciais das varia´veis pp, qq e rr. A implementac¸a˜o das operac¸o˜es e´ um exerc´ıcio. Note-se que o produto de dois polinoˆmios pode ser calculado como uma sequeˆncia de somas de produtos de um polinoˆmio por um termo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o 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 nu´mero de elementos na˜o nulos e´ uma percentagem pequena de n2 (na˜o 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 sa˜o numeradas a partir de 1. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 36 Matrizes esparsas: listas ortogonais 50 0 0 0 10 0 20 0 0 0 0 0 −30 0 −60 5 4 -1 3 -1 2 -1 1 -1 -1 -1 -1 1 -1 2 -1 3 -1 4 1 1 50 2 1 10 2 3 20 4 1 -30 4 3 -60 4 4 5 O acesso a` matriz e´ feito a partir do no´ cabec¸a das listas das cabec¸as das linhas e das colunas (super-cabec¸a!). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 37 Operac¸o˜es sobre matrizes esparsas Alguns exemplos: typedef s t r u c t RegEsparsa { i n t l i n h a , c o l u n a ; double v a l o r ; s t r u c t RegEsparsa ∗ d i r e i t a , ∗ a b a i x o ; } RegEsparsa , ∗M a t r i z ; vo id 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 ) ; vo id L i b e r a M a t r i z ( M a t r i z a ) ; double ElementoMatr i z ( M a t r i z a , i n t i , i n t j ) ; vo id 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 , double x ) ; vo id SomaMatr izes ( M a t r i z a , M a t r i z b , M a t r i z ∗c ) ; vo id 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 refereˆncia. (Nas duas u´ltimas operac¸o˜es, a varia´vel ’c’ recebe o resultado.) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas ligadas 38 Estruturas lineares c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 39 Estruturas lineares em geral: operac¸o˜es t´ıpicas I selecionar e modificar o k-e´simo elemento; I inserir um novo elemento entre as posic¸o˜es k e k + 1; I remover o k-e´simo elemento; I concatenar duas sequeˆncias; I desdobrar uma sequeˆncia; I copiar uma sequeˆncia; I determinar o tamanho de uma sequeˆncia; I buscar um elemento que satisfaz uma propriedade; I ordenar uma sequeˆncia; I aplicar um procedimento a todos os elementos de uma sequeˆncia; I . . . c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 40 Estruturas lineares particulares I Pilha (stack): inserc¸a˜o e remoc¸a˜o na mesma extremidade da estrutura I Fila (queue): inserc¸a˜o numa extremidade (fim) e remoc¸a˜o na outra extremidade (in´ıcio) I Fila dupla (double ended queue): inserc¸a˜o e remoc¸a˜o em ambas extremidades da estrutura c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 41 Pilha: implementac¸a˜o sequencial . . .. . . 0 topo empilha (insere) desempilha (remove) Pilha vazia: . . . 0 topo (-1) Inicialmente: topo=-1. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 42 Pilha: implementac¸a˜o sequencial (cont.) . . .. . . 0 topo empilha (insere) desempilha (remove) typedef s t r u c t { i n t topo ; T e l e m e n t o s [TAM MAX ] ; } P i l h a ; vo id Empi lha ( P i l h a ∗p , T x ) { i f ( (∗ p ) . topo==(TAM MAX−1)) T r a t a E r r o ( ” P i l h a c h e i a ” ) ; (∗p ) . topo++; ( (∗ p ) . e l e m e n t o s ) [ ( ∗ p ) . topo ] = x ; } Exerc´ıcio: a func¸a˜o “Desempilha”. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 43 Pilha: implementac¸a˜o ligada topo . . . Pilha vazia: topo (Uma lista ligada simples.) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 44 Pilha: implementac¸a˜o ligada (cont.) topo . . . typedef s t r u c t E l e m P i l h a { T i n f o ; s t r u c t E l e m P i l h a ∗ prox ; } ElemPi lha , ∗ P i l h a ; vo id Empi lha ( 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 memo´ria ” ) ; q−> i n f o = x ; q−Prox = ∗p ; ∗p = q ; } Exerc´ıcio: a func¸a˜o “Desempilha”. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 45 Fila: implementac¸a˜o sequencial . . . . . . . . . frente fim remove insere Convenc¸a˜o: frente precede o primeiro elemento da fila; consequentemente, o tamanho da fila e´ dado por fim−frente. Fila vazia: . . . . . . frente fim Condic¸a˜o de fila vazia: frente == fim. Inicialmente: frente = fim = −1. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 46 Fila: implementac¸a˜o ligada circular fila frente . . . fim Fila vazia: fila frente fim A fila pode ser representada por uma u´nica varia´vel (fila) ou um par de varia´veis (frente e fim). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 47 Fila: implementac¸a˜o sequencial circular n-1 0 1 2 3 ... frente ... fim ... Convenc¸a˜o: frente precede o primeiro elemento da fila; consequentemente, o tamanho da fila e´ dado por (fim−frente + n)%n. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 48 Fila: implementac¸a˜o sequencial circular (cont.) n-1 0 1 2 3 ... frente ... fim ... Condic¸o˜es: I Inicial: frente == fim == 0 (ou qualquer outro valor) I Fila vazia: frente == fim I Fila cheia: frente == fim (a mesma condic¸a˜o!) I Soluc¸a˜o 1: sacrificar uma posic¸a˜o do vetor; a condic¸a˜o de fila cheia fica: frente == (fim + 1)%n. I Soluc¸a˜o 2: uma varia´vel adicional inteira com o tamanho da fila ou booleana indicando se a fila esta´ vazia. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 49 Fila: implementac¸a˜o sequencial circular (cont.) n-1 0 1 2 3 ... frente ... fim ... #d e f i n e TAM MAX FILA 1000 typedef s t r u c t { i n t f r e n t e , f im ; T e l e m e n t o s [ TAM MAX FILA ] ; } F i l a ; vo id 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 im+1)%TAM MAX FILA ) ) T r a t a E r r o ( ” F i l a c h e i a ” ) ; (∗ f ) . f im = ( (∗ f ) . f im+1)%TAM MAX FILA ; (∗ f ) . e l e m e n t o s [ ( ∗ f ) . f im ] = x ; } Exerc´ıcio: a func¸a˜o “RemoveFila”. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Estruturas lineares 50 Aplicac¸o˜es de pilhas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 51 Aplicac¸o˜es de pilhas I Processamento de linguagens parente´ticas: I linguagens de programac¸a˜o I XML I Implementac¸a˜o da recursa˜o I Percurso de estruturas hiera´rquicas (a´rvores) I Avaliac¸a˜o expresso˜es em notac¸a˜o po´s-fixa (notac¸a˜o polonesa reversa) I Transformac¸a˜o entre notac¸o˜es c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 52 Exemplo de aplicac¸a˜o simples: balanceamento de pareˆnteses Correto Incorreto � ( () ) [()] [) []()[()[]] ()()[ ((([[[]]]))) )( c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 53 Balanceamento de pareˆnteses (cont.) Pilha Resto da sequeˆncia Vazia ([([][()])]) ( [([][()])]) ([ ([][()])]) ([( [][()])]) ([([ ][()])]) ([( [()])]) ([([ ()])]) ([([( )])]) ([([ ])]) ([( )]) ([ ]) ( ) Vazia � c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 54 Notac¸o˜es para expresso˜es aritme´ticas I Infixa: I um operador una´rio precede o operando I um operador bina´rio separa os dois operandos I pareˆnteses indicam prioridades I Po´s-fixa: os operadores seguem os operandos I Pre´-fixa: os operadores precedem os operandos Exemplos: infixa po´s-fixa pre´-fixa a a a a+ b ab+ +ab a+ b ∗ c abc ∗+ +a ∗ bc (a+ b) ∗ c ab+ c∗ ∗+ abc c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 55 Exemplo: avaliac¸a˜o de expresso˜es sob forma po´s-fixa Notac¸a˜o infixa: (3 + 5) ∗ 2− (10− 3)/2 Notac¸a˜o po´s-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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 56 Exemplo: transformac¸a˜o de notac¸a˜o infixa para po´s-fixa a ∗ b+ c ∗ d e/f − g ∗ h Entrada infixa: a ∗ b+c ∗ d∧e / f−g ∗h Sa´ıda po´s-fixa: a b ∗ c d e∧∗f /+g h ∗− I As vara´veis sa˜o 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 57 Transformac¸a˜o de notac¸a˜o infixa para po´s-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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 58 Transformac¸a˜o de notac¸a˜o infixa para po´s-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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Aplicac¸o˜es de pilhas 59 Exemplos de recursa˜o c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 60 Exemplo 1: func¸a˜o 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 ; } Eficieˆncia: ambos O(n) (n multiplicac¸o˜es). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 61 Exemplo 2: nu´meros 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, f3 , 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 ; } Eficieˆncia: O(1.6n) O(n) n = 100: ≈ 1020 somas 100 somas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 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 diaˆmetro maior na˜o pode ficar em cima de um disco de diaˆmetro menor Soluc¸a˜o recursiva: func¸a˜o Hanoi(org,dest,aux,n). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 63 Torres de Hanoi: transfereˆncia recursiva de N-1 discos X . .. . . . N Y Z Hanoi(X,Z,Y,N-1) X Y Z . .. . . . N-1 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 64 Torres de Hanoi: movimento do maior disco X Y Z . .. . . . N-1 Move X para Y X Y Z . .. . . . N-1 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 65 Torres de Hanoi: transfereˆncia recursiva final de N-1 discos X Y Z . .. . . . N-1 Hanoi(Z,Y,X,N-1) X Y . .. . . . N Z c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 66 Torres de Hanoi: func¸a˜o Hanoi vo id Hanoi ( char org , char dest , char aux , i n t n ) { i f ( n>0) { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } I Chamada inicial: Hanoi(’A’,’B’,’C’,64). I Nu´mero de movimentos: 2N − 1 (prova por induc¸a˜o). I Este e´ o nu´mero m´ınimo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 67 Torres de Hanoi: exemplos de sa´ıda N=1: N=3: Mova de A para B Mova de A para B Mova de A para C Mova de B para C N=2: Mova de A para B Mova de C para A Mova de A para C Mova de C para B Mova de A para B Mova de A para B Mova de C para B c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 68 Torres de Hanoi: exemplos de sa´ıda (cont.) N=4 Mova de A para C Mova de C para B Mova de A para B Mova de C para A Mova de C para B Mova de B para A Mova de A para C Mova de C para B Mova de B para A Mova de A para C Mova de B para C Mova de A para B Mova de A para C Mova de C para B Mova de A para B c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 69 Exemplo 4: gerac¸a˜o de permutac¸o˜es Problema: Gerar todas as permutac¸o˜es dos m elementos de um vetor. . . . 0 k-1 k m-1 . . . I Suponha uma func¸a˜o Permuta(k,m) que gera (imprime) todas as permutac¸o˜es 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 soluc¸a˜o consistira´ em trocar o elemento de ı´ndice k-1 consecutivamente com todos os elementos que o precedem e aplicar a func¸a˜o recursivamente. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 70 Gerac¸a˜o das permutac¸o˜es (cont.) Passo recursivo: i=k-1, ..., 0 . . . 0 k-1 k m-1 . . . . . . i Troca(i,k-1) . . . 0 k-1 k m-1 . . . . . . i . . . 0 k-1 k m-1 . . . . . . i Permuta(k-1,m) Troca(i,k-1) . . . 0 k-1 k m-1 . . . . . . i c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 71 Gerac¸a˜o das permutac¸o˜es (cont.) . . . 0 k-1 k m-1 . . . Func¸a˜o Permuta: vo id Permuta ( i n t k , i n t m) { i f ( k==0) Imprime (m) ; e l s e { i n t i ; f o r ( i=k−1; i >=0; i−−) { Troca ( i , k−1); Permuta ( k−1,m) ; Troca ( i , k−1); } } } I A func¸a˜o Imprime imprime os m elementos do vetor. I Chamada inicial: Permuta(m,m). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 72 Gerac¸a˜o das permutac¸o˜es (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 lexicogra´fica: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de recursa˜o 73 Exemplos de retrocesso c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o 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 12 3 4 5 6 7 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 75 Movimentos do cavalo (cont.) Um percurso da posic¸a˜o (0,0) ate´ (4,4) (existem 27.419 soluc¸o˜es). 0 0 1 1 2 2 3 3 4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 76 Movimentos do cavalo (cont.) Um percurso da posic¸a˜o (0,0) ate´ (4,4) cobrindo todas as posic¸o˜es: 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.: Na˜o existe soluc¸a˜o para o tabuleiro da transpareˆncia anterior (provar!). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 77 Movimentos do cavalo (cont.) Tipos de soluc¸a˜o: 1. Achar uma soluc¸a˜o 2. Achar uma soluc¸a˜o que cobre todas as posic¸o˜es livres 3. Enumerar todas as soluc¸o˜es Observac¸a˜o: Esta na˜o e´ a melhor maneira de resolver este problema mas ilustra bem o mecanismo geral de retrocesso. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 78 Movimentos do cavalo (cont.) -2 -2 -1 -1 0 0 1 1 2 2 0 12 3 4 5 6 7 #d e f i n e TAM MAX 20 #d e f i n e NUM MOV 8 typedef enum { f a l s e , t r u e } Boolean ; i n t tab [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 } ; vo id 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” , tab [ i ] [ j ] ) ; p r i n t f ( ”\n” ) ; } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 79 Movimentos do cavalo: achar uma soluc¸a˜o Boolean TentaMovimento ( i n t tam , i n t num , i n t l i n , i n t c o l , i n t ld , i n t cd ) { i n t k , lp , cp ; Boolean 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 ) && ( tab [ l i n ] [ c o l ]==0)) { tab [ 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, lp , cp , ld , cd ) ; k++; } whi le ( ( ! r e s ) && ( k<NUM MOV) ) ; } tab [ 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 80 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 Entrada 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 81 Movimentos do cavalo: achar uma soluc¸a˜o completa Boolean TentaMovimento ( i n t tam , i n t num , i n t l i n , i n t c o l , i n t ld , i n t cd , i n t noc ) { i n t k , lp , cp ; Boolean 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 ) && ( tab [ l i n ] [ c o l ]==0)) { tab [ 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, lp , cp , ld , cd , noc ) ; k++; } whi le ( ( ! r e s ) && ( k<NUM MOV) ) ; } tab [ 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 82 Movimentos do cavalo: achar todas as soluc¸o˜es vo id TentaMovimento ( i n t tam , i n t num , i n t l i n , i n t c o l , i n t ld , i n t cd ) { i n t k , lp , cp ; i f ((0<= l i n ) && ( l i n <tam ) && (0<= c o l ) && ( c o l<tam ) && ( tab [ l i n ] [ c o l ]==0)) { tab [ 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, lp , cp , ld , cd ) ; k++; } whi le ( k<NUM MOV) ; } tab [ l i n ] [ c o l ] = 0 ; } } Chamada inicial: TentaMovimento(tam,1,lo,co,ld,cd) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 83 Exemplo 2: distaˆncia de edic¸a˜o RECURSA˜O E RETROCESSO RCURC¸A˜O ER RTROCESOS ˆ ˆ ˆ ˆ ˆ ˆ | | | | | | I S R I I R I Operac¸o˜es elementares: I A: avanc¸o (subentendido) I I: inserc¸a˜o I S: substituic¸a˜o I R: remoc¸a˜o I Cada operac¸a˜o recebe um custo (avanc¸o, em geral, zero) I Problema: achar uma sequeˆncia de operac¸o˜es que torna as cadeias iguais ao custo total m´ınimo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 84 Distaˆncia de edic¸a˜o: func¸a˜o Distancia i n t D i s t a n c i a ( char ∗ t e s t e , char ∗ c o r r e t a ) { i n t dIns , 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 = custoSub+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 Ins , min (dRem , dSub ) ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 85 Distaˆncia de edic¸a˜o: desafios I Melhorar o desempenho do algoritmo: o algoritmo e´ exponencial na˜o sendo via´vel, sob esta forma, em aplicac¸o˜es pra´ticas I Imprimir o nu´mero de operac¸o˜es de cada tipo (avanc¸o, inserc¸a˜o, remoc¸a˜o e substituic¸a˜o) para obter a soluc¸a˜o I Imprimir a sequeˆncia de operac¸o˜es para obter a soluc¸a˜o c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Exemplos de retrocesso 86 Eliminac¸a˜o da recursa˜o c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 87 Esquema de func¸a˜o recursiva vo id 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 base ∗/ } 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 sequeˆncias, possivelmente vazias, de comandos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 88 Esquema de eliminac¸a˜o da recursa˜o 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 base ∗/ } 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 ; } } typedef enum {chamada1 , chamada2 , chamada3 , . . . } Chamadas ; typedef enum { ent rada , s a i d a , r e t o r n o } Acoes ; vo id 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 ; Acoes acao ; I n i c i a l i z a P i l h a (& f ) ; acao = e n t r a d a ; do { switch ( acao ) { case ( e n t r a d a ) : . . . break ; case ( r e t o r n o ) : . . . break ; case ( s a i d a ) : break ; } } whi le ( acao != s a i d a ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 89 Esquema de eliminac¸a˜o da recursa˜o (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 base ∗/ } 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 ; } } case ( e n t r a d a ) : Ci ; /∗ Comandos i n i c i a i s ∗/ i f (E ( . . . ) ) { C0 ; acao = r e t o r n o ; /∗ Caso base ∗/ } e l s e { /∗ P r i m e i r a chamada r e c u r s i v a ∗/ C1 ; Empi lha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada1 ) ; t1 = e11 ; t2 = e12 ; . . . ; x1 = t1 ; x2 = t2 ; . . . ; /∗ R e c a l c u l a argumentos ∗/ } break ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 90 Esquema de eliminac¸a˜o da recursa˜o (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 base ∗/ } 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 ; } } case ( r e t o r n o ) : i f ( P i l h a V a z i a ( f ) ) acao = s a i d a ; e l s e { Desempi lha ( f ,&x1 ,&x2 , . . . , & y1 ,&y2 , . . . , & ch ) ; switch ( ch ) { case ( chamada1 ) : C2 ; Empi lha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada2 ) ; t1 = e21 ; t2 = e22 ; . . . ; x1 = t1 ; x2 = t2 ; . . . ; acao = e n t r a d a ; break ; case ( chamada2 ) : C3 ; Empi lha ( f , x1 , x2 , . . . , y1 , y2 , . . . , chamada3 ) ; t1 = e31 ; t2 = e32 ; . . . ; x1 = t1 ; x2 = t2 ; . . . ; acao = e n t r a d a ; break ; . . . ; case ( chamadam ) : Cf ; break ; } /∗ s w i t c h ( ch ) ∗/ } break ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 91 Exemplo 1: func¸a˜o 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 92 Func¸a˜o 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); } typedef enum {chamada1} Chamadas ; typedef enum { ent rada , s a i d a , r e t o r n o } Acoes ; i n t f a t o r i a l ( i n t n ) { i n t r e s , t1 ; P i l h a f ; Chamadas ch ; Acoes acao ; I n i c i a l i z a P i l h a (& f ) ; acao = e n t r a d a ; do { switch ( acao ) { case ( e n t r a d a ) : . . . break ; case ( r e t o r n o ) : . . . break ; case ( s a i d a ) : break ; } } whi le ( acao != s a i d a ) ; r e t u r n r e s ; } /∗ f a t o r i a l ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 93 Func¸a˜o 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); } case ( e n t r a d a ) : i f ( n==0) { r e s = 1 ; acao = r e t o r n o ; } e l s e { Empi lha ( f , n , chamada1 ) ; t1 = n ; n = t1−1; } break ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 94 Func¸a˜o 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); } case ( r e t o r n o ) : i f ( P i l h a V a z i a ( f ) ) acao = s a i d a ; e l s e { Desempi lha ( f ,&n,& ch ) ; switch ( ch ) { case ( chamada1 ) : r e s = n∗ r e s ; break ; } break ; Obs.: Note como neste caso a varia´vel res e´ usada para guardar o resultado da func¸a˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 95 Exemplo 2: func¸a˜o Hanoi vo id Hanoi ( char org , char dest , char aux , i n t n ) { i f ( ! ( n>0)) ; e l s e { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 96 Func¸a˜o Hanoi (cont.) v o i d Hanoi ( char org , char dest , char aux , i n t n ) { i f ( ! ( n>0)) ; e l s e { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } typedef enum {chamada1 , chamada2 } ; typedef enum { ent rada , s a i d a , r e t o r n o } Acoes ; vo id Hanoi ( char org , char dest , char aux , i n t n ) { char t1 ; char t2 ; char t3 ; i n t t4 ; P i l h a f ; Chamadas ch ; Acoes acao ; I n i c i a l i z a P i l h a (& f ) ; acao = e n t r a d a ; do { switch ( acao ) { case ( e n t r a d a ) : . . . ; break ; case ( r e t o r n o ) : . . . ; break ; case ( s a i d a ) : break ; } } whi le ( acao != s a i d a ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 97 Func¸a˜o Hanoi (cont.) v o i d Hanoi ( char org , char dest , char aux , i n t n ) { i f ( ! ( n>0)) ; e l s e { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } case ( e n t r a d a ) : i f ( ! ( n>0)) { acao = r e t o r n o ; } e l s e { Empi lha ( f , org , dest , aux , n , chamada1 ) ; t1 = org ; t2 = aux ; t3 = d e s t ; t4 = n−1; org = t1 ; d e s t = t2 ; aux = t3 ; n = t4 ; } break ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 98 Func¸a˜o Hanoi (cont.) v o i d Hanoi ( char org , char dest , char aux , i n t n ) { i f ( ! ( n>0)) ; e l s e { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } case ( r e t o r n o ) : i f ( P i l h a V a z i a ( f ) ) acao = s a i d a ; e l s e { Desempi lha ( f ,& org ,& dest ,& aux ,&n,& ch ) ; switch ( ch ) { case ( chamada1 ) : p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Empi lha ( f , org , dest , aux , n , chamada2 ) ; t1 = aux ; t2 = d e s t ; t3 = org ; t4 = n−1; org = t1 ; d e s t = t2 ; aux = t3 ; n = t4 ; acao = e n t r a d a ; break ; case ( chamada2 ) : break ; } break ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 99 Exemplo de eliminac¸a˜o da recursa˜o caudal Aplica´vel quando a u´ltima ac¸a˜o dentro do corpo da func¸a˜o e´ uma chamada recursiva: reaproveita o mesmo registro de ativac¸a˜o da func¸a˜o, mudando os valores dos argumentos. vo id Hanoi ( char org , char dest , char aux , i n t n ) { i f ( n>0) { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; Hanoi ( aux , dest , org , n−1); } } vo id Hanoi ( char org , char dest , char aux , i n t n ) { char t ; whi le ( n>0) { Hanoi ( org , aux , dest , n−1); p r i n t f ( ”Mova de %c para %c\n” , org , d e s t ) ; t = org ; org = aux ; aux = t ; } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Eliminac¸a˜o da recursa˜o 100 Recursa˜o mu´tua: Ana´lise sinta´tica c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 101 Exemplo simples de recursa˜o mu´tua 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 102 Ana´lise de expresso˜es Expresso˜es com operadores bina´rios ‘+’, ‘−’, ‘∗’, ‘/’ e pareˆnteses ‘(’ e ‘)’: e = t1 ⊕ t2 ⊕ · · · ⊕ tn, n ≥ 1 t = f1 ⊗ f2 ⊗ · · · ⊗ fn, n ≥ 1 f = x ou f = ( e ) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 103 Programa de traduc¸a˜o de infixa para po´s-fixa: char e n t r a d a [TAM MAX ] ; char ∗pe ; vo id E x p r e s s a o ( ) ; vo id Termo ( ) ; vo id F a t o r ( ) ; vo id InPos ( ) { 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 104 Fator f = x ou f = ( e ) vo id F a t o r ( ) { char c o r r e n t e = ∗pe ; switch ( c o r r e n t e ) { case ’ a ’ : case ’ b ’ : . . . : case ’ z ’ : S a i ( c o r r e n t e ) ; pe++; break ; case ’ ( ’ : pe++; E x p r e s s a o ( ) ; i f ( (∗ pe)== ’ ) ’ ) pe++; e l s e E r r o ( ) ; break ; d e f a u l t : E r r o ( ) ; } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 105 Termo t = f1 ⊗ f2 ⊗ · · · ⊗ fn, n ≥ 1 vo id Termo ( ) { char 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 break ; /∗ do ∗/ } whi le ( t r u e ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 106 Expressa˜o e = t1 ⊕ t2 ⊕ · · · ⊕ tn, n ≥ 1 vo id E x p r e s s a o ( ) { char op ; Termo ( ) ; do { op = ∗pe ; i f ( ( op==’+ ’ ) | | ( op==’− ’ ) ) { pe++; Termo ( ) ; S a i ( op ) ; } e l s e break ; /∗ do ∗/ } whi le ( t r u e ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 107 Operador de exponenciac¸a˜o Fator redefinido: f = p1 ∧ p2 ∧ · · · ∧ pn, n ≥ 1 Prima´rio: p = x ou p = ( e ) Prioridade? Soluc¸a˜o: f = p ou f = p ∧ f c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 108 Fator redefinido f = p ou f = p ∧ f vo id 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 109 Prima´rio p = x ou p = ( e ) vo id P r i m a r i o ( ) { c o r r e n t e = ∗pe ; switch ( c o r r e n t e ) { case ’ a ’ : case ’ b ’ : . . . : case ’ z ’ : S a i ( c o r r e n t e ) ; pe++; break ; case ’ ( ’ : pe++; E x p r e s s a o ( ) ; i f ( (∗ pe)== ’ ) ’ ) pe++; e l s e E r r o ( ) ; break ; d e f a u l t : E r r o ( ) ; } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 110 Analogia para expresso˜es e termos e = t ou e = e⊕ t t = f ou t = t⊗ f Problemas: I como distinguir as alternativas I repetic¸a˜o infinita no segundo caso (recursa˜o esquerda) vo id 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Recursa˜o mu´tua: Ana´lise sinta´tica 111 A´rvores bina´rias c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 112 Exemplo de a´rvore bina´ria 1: pedigree Sugarted’s Bonnie Carina de Wood Ladge Matarazzo’s Beauty Lady Weberly Johnson Fancy Boots Scotland dos Seis Irma˜os Arisca dos Seis Irma˜os Ator dos Seis Irma˜os 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 sa˜o repetidos: eles devem ser tratados como instaˆncias separadas. I Pela pro´pria natureza da a´rvore, cada elemento tem dois predecessores: a´rvore bina´ria. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 113 Exemplo de a´rvore bina´ria 2: a´rvore de decisa˜o 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 a´rvore representa as deciso˜es tomadas por um algoritmo de ordenac¸a˜o usando operac¸o˜es de comparac¸a˜o; V: verdadeiro, F: falso. I Devido a` natureza das comparac¸o˜es, a a´rvore e´ bina´ria. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 114 Exemplo de a´rvore geral 1: descendentes Indo- Europeu Balto- Eslavo Ba´ltico Leta˜o Lituano Eslavo Checo Russo Poloneˆs Ita´lico Latim Catala˜o Italiano Franceˆs Castelhano Portugueˆs Indo- Iraniano Persa Antigo Persa Hindustano Urdu Hindi Germaˆnico Germaˆnico Setentrional Sueco Noruegueˆs Dinamarqueˆs Germaˆnico Ocidental Holandeˆs Alema˜o Ingleˆs Grego Cla´ssico Grego Moderno I A a´rvore e´ incompleta e na˜o necessariamente exata. I Cada elemento pode ter um nu´mero varia´vel de sucessores: a´rvore geral. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 115 Exemplo de a´rvore geral 2: descendentes Fam´ılia Subfam´ılia Tribo Geˆnero Espe´cie Subespe´cie Hominidae Homininae Hominini Homo Homo sapiens Homo sapiens sapiens Homo habilis Homo neander- thalensis . . . Pan Chimpanze´ Bonobo Gorillini Gorilla Gorila Ponginae Pongo Orangotango I A´rvore da fam´ılia Hominidae determinada por comparac¸a˜o de DNA de va´rias espe´cies (incompleta). I Cada elemento pode ter um nu´mero varia´vel de sucessores: a´rvore geral. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 116 Exemplo de a´rvore 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 acadeˆmicas. Algumas unidades teˆm mais de 10 departamentos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 117 Definic¸a˜o de a´rvore bina´ria Uma a´rvore bina´ria e´ um conjunto de no´s que: I ou e´ vazio (a´rvore bina´ria vazia) I ou conte´m um no´ especial denominado raiz da a´rvore e o resto do conjunto esta´ particionado em duas a´rvores bina´rias disjuntas (possivelmente vazias), denominadas suba´rvore esquerda e suba´rvore direita. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 118 Representac¸a˜o gra´fica, convenc¸o˜es e conceitos n´ıvel 1 n´ıvel 2 n´ıvel 3 n´ıvel 4 A B D E G C F H Raiz da a´rvore: A Filho esquerdo de A: B Filho direito de A: C Pai de F : C Irma˜o de E: D Descendentes de B: B, D, E e G Antepassados de H: H, F , C e A Folhas: D, G e H No´s internos: todos exceto as folhas N´ıveis: indicados na figura Altura (profundidade) – n´ıvel ma´ximo: 4 Suba´rvores bina´rias vazias: 9 Suba´rvores bina´rias na˜o vazias: 7 Obs.: Alguns autores comec¸am a numerac¸a˜o dos n´ıveis a partir de zero. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 119 Fatos sobre a´rvores bina´rias I Uma a´rvore bina´ria com n no´s tem: I altura ma´xima n I altura m´ınima dlog2(n+ 1)e I suba´rvores vazias: n+ 1 I suba´rvores na˜o vazias: n− 1 (se n > 0) I Uma a´rvore bina´ria de altura h tem: I no m´ınimo h no´s I no ma´ximo 2h − 1 no´s c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 120 Representac¸a˜o ligada comum p A B C D E F G H O acesso a todos os no´s da a´rvore pode ser realizado atrave´s de um apontador para a raiz. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 121 Representac¸a˜o ligada com treˆs apontadores p A B D E G C F H O terceiro apontador possibilita descer e subir pela estrutura, analogamente a`s listas duplamente ligadas. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 122 Representac¸a˜o com o campo pai apenas A B C D E F G H Problemas: I E´ necessa´rio haver acesso (apontadores) pelo menos a todas as folhas. I Na˜o e´ poss´ıvel distinguir entre os filhos esquerdos e direitos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 123 Representac¸a˜o sequ¨encial: a´rvores bina´rias completas A B C D E F G H I J K L M N O 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 No´ n: filho esquerdo: 2n+ 1 (n ≥ 0) filho direito: 2n+ 2 (n ≥ 0) pai: 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 124 Representac¸a˜o sequ¨encial: a´rvores bina´rias quase completas A B C D E F G H I J K M 0 1 2 3 4 5 6 7 8 9 10 11 A 0 B 1 I 2 C 3 F 4 J 5 M 6 D 7 E 8 G 9 H 10 K 11 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 125 Percursos em profundidade I Pre´-ordem: Visitar a raiz Percorrer a suba´rvore esquerda em pre´-ordem Percorrer a suba´rvore direita em pre´-ordem I Po´s-ordem: Percorrer a suba´rvore esquerda em po´s-ordem Percorrer a suba´rvore direita em po´s-ordem Visitar a raiz I Inordem (ou ordem sime´trica): Percorrer a suba´rvore esquerda em inordem Visitar a raiz Percorrer a suba´rvore direita em inordem c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 126 Exemplos de percurso em profundidade A B D E G C F H Pre´-ordem: A,B,D,E,G,C,F ,H Po´s-ordem: D,G,E,B,H,F ,C,A Inordem: D,B,G,E,A,F ,H,C c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 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©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 128 Implementac¸a˜o recursiva de percursos typedef s t r u c t NoArvBin { T i n f o ; s t r u c t NoArvBin ∗ esq , ∗ d i r ; } NoArvBin , ∗ArvBin ; vo id PreOrdem ( ArvBin p ) { i f ( p!=NULL) { V i s i t a ( p ) ; PreOrdem ( p−>esq ) ; PreOrdem ( p−>d i r ) ; } } /∗ PreOrdem ∗/ vo id InOrdem ( ArvBin p ) { i f ( p!=NULL) { InOrdem ( p−>esq ) ; V i s i t a ( p ) ; InOrdem ( p−>d i r ) ; } } /∗ InOrdem ∗/ vo id PosOrdem ( ArvBin p ) { i f ( p!=NULL) { PosOrdem ( p−>esq ) ; PosOrdem ( p−>d i r ) ; V i s i t a ( p ) ; } } /∗ PosOrdem ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 129 Eliminac¸a˜o da recursa˜o caudal vo id PreOrdem ( ArvBin p ) { i f ( p!=NULL) { V i s i t a ( p ) ; PreOrdem ( p−>esq ) ; PreOrdem ( p−>d i r ) ; } } /∗ PreOrdem ∗/ vo id PreOrdem ( ArvBin p ) { whi le ( p!=NULL) { V i s i t a ( p ) ; PreOrdem ( p−>esq ) ; p = p−>d i r ; } } /∗ PreOrdem ∗/ I Transformac¸a˜o ana´loga pode ser feita para a inordem. I E a po´s-ordem? c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 130 Percurso em pre´-ordem, usando uma pilha expl´ıcita A figura indica a situac¸a˜o inicial e final do percurso de uma a´rvore arbitra´ria (pode ser vazia). Inicialmente, o apontador para a a´rvore deve estar no topo da pilha. Terminado o percurso, a pilha tera´ um elemento a menos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 131 Percurso em pre´-ordem, usando uma pilha expl´ıcita (cont.) X E D Visita X Percorre E Percorre D c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 132 Percurso em pre´-ordem, usando uma pilha (cont.) vo id PreOrdem ( ArvBin p ) { P i l h a p l ; I n i c i a l i z a P i l h a (& p l ) ; Empi lha (& pl , p ) ; do { Desempi lha (& pl ,&p ) ; i f ( p!=NULL) { V i s i t a ( p ) ; Empi lha (& pl , p−>d i r ) ; Empi lha (& pl , p−>esq ) ; } } whi le ( ! P i l h a V a z i a ( p l ) ) ; } /∗ PreOrdem ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 133 Percurso em largura, usando uma fila Os no´s da a´rvore a serem visitados sa˜o guardados numa fila. X E D n´ıvel k n´ıvel k+1 Visita X c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 134 Percurso em largura, usando uma fila (cont.) vo id L a r g u r a ( ArvBin p ) { F i l a f l ; I n i c i a l i z a F i l a (& f l ) ; I n s e r e F i l a (& f l , p ) ; do { RemoveFi la (& 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−>esq ) ; I n s e r e F i l a (& f l , p−>d i r ) ; } } whi le ( ! F i l a V a z i a ( f l ) ) ; } /∗ L a r g u r a ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 135 Comparac¸a˜o dos percursos em pre´-ordem e em largura vo id PreOrdem ( ArvBin p ) { P i l h a p l ; I n i c i a l i z a P i l h a (& p l ) ; Empi lha (& pl , p ) ; do { Desempi lha (& pl ,&p ) ; i f ( p!=NULL) { V i s i t a ( p ) ; Empi lha (& pl , p−>d i r ) ; Empi lha (& pl , p−>esq ) ; } } whi le ( ! P i l h a V a z i a ( p l ) ) ; } /∗ PreOrdem ∗/ vo id L a r g u r a ( ArvBin p ) { F i l a f l ; I n i c i a l i z a F i l a (& f l ) ; I n s e r e F i l a (& f l , p ) ; do { RemoveFi la (& 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−>esq ) ; I n s e r e F i l a (& f l , p−>d i r ) ; } } whi le ( ! F i l a V a z i a ( f l ) ) ; } /∗ L a r g u r a ∗/ Quase ideˆnticos, exceto a troca de esquerda pela direita! c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 136 Preordem com pilha otimizada vo id PreOrdem ( ArvBin p ) { P i l h a p l ; Boolean f im = 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) Empi lha ( p l , p−>d i r ) ; p = p−>esq ; } e l s e i f ( P i l h a V a z i a ( p l ) ) f im = t r u e e l s e Desempi lha ( p l ,&p ) ; } whi le ( ! f im ) ; } /∗ PreOrdem ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 137 Pre´-ordem com pilha embutida: Deutsch, Schorr e Waite ... ... ... ... ... ... ... ... ... ... t p NULL I A varia´vel p aponta para a suba´rvore a ser percorrida. I A varia´vel t aponta para o topo de uma pilha formada pelos no´s que levam ao no´ p (apontadores invertidos). I Cada no´ devera´ conter uma marca indicando qual dos dois apontadores esta´ invertido. I A func¸a˜o seguinte implementa os treˆs percursos em profundidade. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 138 Pre´-ordem com pilha embutida (cont.) vo id DSW( ArvBin p ) { ArvBin t = NULL ; ArvBin q ; Boolean sobe ; do { whi le ( 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−>esq ; p−>esq = t ; t = p ; p = q ; } sobe = t r u e ; whi le ( sobe && ( t !=NULL ) ) { switch ( t−>marca ) { case MarcaEsq : /∗ a` d i r e i t a ∗/ I n V i s i t a ( t ) ; sobe = f a l s e ; t−>marca = MarcaDir ; q = p ; p = t−>d i r ; t−>d i r = t−>esq ; t−>esq = q ; break ; case MarcaDir : /∗ sobe ∗/ P o s V i s i t a ( t ) ; q = t−>d i r ; t−>d i r = p ; p = t ; t = q ; break ; } } } whi le ( t !=NULL ) ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 139 Desafios: I melhorar a pre´-ordem com pilha otimizada I inordem com pilha otimizada I po´s-ordem com pilha otimizada c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 140 Reconstruc¸a˜o de a´rvores bina´rias Pre´-ordem AB: A B A B Inordem AB: B A A B Po´s-ordem AB: B A B A Pre´-ordem AB e po´s-ordem BA: A B A B Conclusa˜o: uma u´nica ordem e a combinac¸a˜o de pre´- e po´s-ordens na˜o determinam a a´rvore de maneira u´nica. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 141 Reconstruc¸a˜o de a´rvores bina´rias (cont.) Verifica-se facilmente que a pre´-ordem (ou a po´s-ordem) combinada com a inordem determinam, de maneira u´nica, a forma da a´rvore. No caso da pre´-ordem e inordem, pode-se seguir o seguinte algoritmo: I a partir da pre´-ordem, determine a raiz da a´rvore I dada a raiz, ela separa a inordem em inordens das suas suba´rvores esquerda e direita I a partir da pre´-ordem, sa˜o determinadas as pre´-ordens das suba´rvores que teˆm os mesmos comprimentos das respectivas inordens I recursivamente sa˜o reconstru´ıdas as suba´rvores O caso da po´s-ordem e´ ana´logo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 142 Representac¸o˜es externas de a´rvores bina´rias A B D E G C F H I percursos canoˆnicos: inordem e pre´ (ou po´s) -ordem (ja´ visto): DBGEAFHC ABDEGCFH I percurso canoˆnico com indicadores de suba´rvores (pre´-ordem): A11B11D00E10G00C10F01H00 O ı´ndice 0 indica a auseˆncia e 1 indica a existeˆncia de filho esquerdo ou direito. I descric¸a˜o parente´tica (inordem): (((()D())B((()G())E()))A((()F (()H()))C())) () representa uma a´rvore vazia; (αXβ) representa uma a´rvore de raiz X e suba´rvores descritas pelas cadeias α e β. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias 143 A´rvores bina´rias de busca c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 144 Exemplo de a´rvore de busca: nu´meros 16 8 5 15 10 27 21 25 Para qualquer no´ da a´rvore, os elementos da sua suba´rvore esquerda (direita) sa˜o menores ou iguais (maiores ou iguais) do que o elemento do no´. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 145 Exemplo de a´rvore de busca: nomes jul fev ago abr dez jan set mai jun mar nov out Para qualquer no´ da a´rvore, os elementos da sua suba´rvore esquerda (direita) precedem (seguem) em ordem alfabe´tica o elemento do no´. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 146 Inserc¸a˜o em a´rvore de busca A inserc¸a˜o de um valor X cria uma nova folha em lugar de uma suba´rvore vazia. O ponto de inserc¸a˜o e´ determinado pelo percurso da a´rvore usando a propriedade de a´rvores de busca. Y X < Y Y X Y X > Y Y X c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 147 Inserc¸a˜o recursiva Boolean I n s e r e A r v B u s c a ( ArvBin ∗p , T x ) { /∗ Vers 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)−>esq = (∗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)−>esq ) , 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 paraˆmetro p por refereˆncia. I Esta versa˜o apresenta somente recursa˜o caudal que pode ser facilmente eliminada. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 148 Inserc¸a˜o iterativa Boolean I n s e r e A r v B u s c a ( ArvBin ∗p , T x ) { /∗ Vers a˜o i t e r a t i v a ∗/ T i n f o ; whi le ( (∗ p )!=NULL) { i n f o = (∗p)−> i n f o ; i f ( x< i n f o ) p = &((∗p)−>esq ) ; e l s e i f ( x> i n f o ) p = &((∗p)−>d i r ) ; e l s e r e t u r n f a l s e ; } ∗p = m a l l o c ( s i z e o f ( NoArvBin ) ) ; (∗p)−>esq = (∗p)−>d i r = NULL ; (∗p)−> i n f o = x ; r e t u r n t r u e ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 149 Remoc¸a˜o em a´rvore de busca Caso 1: pelo menos uma das suba´rvores e´ vazia: p X I p e´ o enderec¸o do campo ou da varia´vel que conte´m o apontador para o no´ com a informac¸a˜o X. I O caso de ambas as suba´rvores vazias tambe´m esta´ coberto. I O caso de suba´rvore esquerda vazia mas direita na˜o vazia e´ ana´logo. I O no´ com a informac¸a˜o X pode ser liberado. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 150 Remoc¸a˜o em a´rvore de busca (cont.) Caso 2: as duas suba´rvores sa˜o na˜o vazias p X Y p X Y Y I Substituir a informac¸a˜o X por Y – o valor ma´ximo contido na suba´rvore esquerda (ou m´ınimo na suba´rvore direita). I Remover o no´ que originalmente continha Y (sua suba´rvore direita e´ vazia – aplica-se o caso 1). I Implementac¸a˜o: exerc´ıcio. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 151 Inserc¸o˜es e remoc¸o˜es em a´rvores bina´rias de busca I Problema: a altura da a´rvore pode crescer muito ja´ que numa a´rvore com n no´s: I altura ma´xima n I altura m´ınima dlog2(n+ 1)e I Se n ≈ 1.000: I altura ma´xima 1.000 I altura m´ınima 10 I Se n ≈ 1.000.000: I altura ma´xima 1.000.000 I altura m´ınima 20 I O pior caso ocorre, por exemplo, quando a inserc¸a˜o e´ feita em ordem (crescente ou descrescente) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 152 Balanceamento de a´rvores I Algoritmo o´bvio na˜o garante balanceamento I Balanceamento perfeito (altura m´ınima): I eficieˆncia de busca: O(log n) I eficieˆncia de inserc¸a˜o: O(n) – inaceita´vel I Balanceamento aproximado: I a´rvores AVL – eficieˆncia de busca, inserc¸a˜o e remoc¸a˜o: O(log n) I a´rvores rubro-negras – eficieˆncia de busca, inserc¸a˜o e remoc¸a˜o: O(log n) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 153 A´rvores de altura balanceada (AVL) I Autores: G. M. Adel’son-Vel’ski˘ı e E. M. Landis (1962) I Uma a´rvore bina´ria de busca e´ do tipo AVL se ela e´ vazia, ou enta˜o, se para todos os seus no´s a diferenc¸a de alturas entre as suba´rvores esquerda e direita e´ no ma´ximo 1, em valor absoluto. I A diferenc¸a entre as alturas direita e esquerda e´ chamada fator de balanceamento. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 154 Exemplos de a´rvores AVL 0 0 0 − − + + 0 0 0 Note-se que a primeira a´rvore e´ de altura m´ınima enquanto que a segunda na˜o e´. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 155 Pior caso de desbalanceamento: a´rvores de Fibonacci F0 NULL F1 0 F2 − 0 F3 − − 0 − F4 − − − − 0 0 0 Forma geral – altura h≥2: Fh − Fh−1 Fh−2 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 156 A´rvores de Fibonacci: propriedades − Fh−1 Fh−2 I Para uma dada altura h, a a´rvore conte´m o nu´mero m´ınimo de no´s poss´ıvel preservando ainda a propriedade AVL. I Qualquer outra a´rvore AVL com o mesmo nu´mero de no´s tem altura menor ou igual – este e´ o pior caso. I Nu´mero de no´s de Fh: N(h) = N(h− 1) +N(h− 2) + 1, h ≥ 2 I Demonstra-se por induc¸a˜o: N(h) = fh+2 − 1, onde fi e´ o i-e´simo nu´mero de Fibonacci. I Usando a aproximac¸a˜o fi ≈ ((1 + √ (5))/2)i/ √ (5) obte´m-se: h ≈ 1, 44 log2(n+ 2) (no ma´ximo). I Operac¸a˜o de busca usara´ O(log n) operac¸o˜es. I A ser visto: inserc¸a˜o e remoc¸a˜o tambe´m usara˜o O(log n) operac¸o˜es. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 157 Inserc¸a˜o em a´rvores AVL A explicac¸a˜o a seguir supo˜e que a inserc¸a˜o e´ realizada por uma func¸a˜o recursiva cujo cabec¸alho e´: Boolean B u s c a I n s e r e ( ArvAVL ∗p , T x , Boolean ∗ a l t ) ; onde I p: enderec¸o da varia´vel que conte´m o apontador para a a´rvore I x: valor a ser inserido de algum tipo T conveniente I alt: enderec¸o da varia´vel na qual e´ devolvida a informac¸a˜o que indica se a a´rvore aumentou ou na˜o de altura I se na˜o houver aumento de altura numa chamada recursiva, o resto da a´rvore na˜o sofre mudanc¸a I conforme sera´ visto, o aumento da altura sera´ no ma´ximo de um e pode acontecer somente numa a´rvore vazia ou enta˜o cuja raiz tem fator de balanceamento igual a zero; neste caso, o fator resultante sera´ diferente de zero, exceto quando a a´rvore era vazia. O valor devolvido pela func¸a˜o indica se a inserc¸a˜o foi efetivamente realizada ou se o elemento x ja´ pertencia a` arvore. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 158 Inserc¸a˜o em a´rvores AVL (cont.) Explicac¸a˜o geral: caso de chamada recursiva sem aumento de altura p h x α alt: ? p h x ? alt: false α Neste caso, na˜o havera´ mais modificac¸o˜es na a´rvore. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 159 Inserc¸a˜o em a´rvores AVL (cont.) Explicac¸a˜o geral: caso de chamada recursiva com aumento de altura p h x α alt: ? p h+1 x ? alt: true α Neste caso, havera´ modificac¸a˜o no no´ corrente com poss´ıvel propagac¸a˜o para as chamadas anteriores. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 160 Inserc¸a˜o em a´rvores AVL (cont.) Caso 1: Inserc¸a˜o em a´rvore vazia: NULL h = 0 X 0 h = 1 Neste caso a altura h aumenta. Este fato sera´ propagado no retorno da func¸a˜o atrave´s de valor verdadeiro da varia´vel alt. Nos casos seguintes, sera´ suposto sempre que a inserc¸a˜o foi realizada na suba´rvore esquerda; o caso da inserc¸a˜o do lado direito e´ ana´logo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 161 Inserc¸a˜o em a´rvores AVL (cont.) Caso 2: Inserc¸a˜o do lado mais baixo: + h + x h alt: true 0 x h alt: false O conteu´do do retaˆngulo representa o resultado da chamada recursiva. O fator de balanceamento sera´ modificado somente se a a´rvore esquerda aumentou de tamanho. Neste caso a altura permanece inalterada. Este fato sera´ propagado no retorno da func¸a˜o atrave´s de valor falso da varia´vel alt. Como consequeˆncia, o processo de inserc¸a˜o pa´ra (exceto os retornos). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 162 Inserc¸a˜o em a´rvores AVL (cont.) Caso 3: Inserc¸a˜o quando as duas alturas sa˜o iguais 0 h 0 x h+1 alt: true − x h+1 alt: true Neste caso, se houve aumento de altura na chamada recursiva, a altura total tambe´m aumentara´. Este fato sera´ propagado no retorno da func¸a˜o atrave´s de valor verdadeiro da varia´vel alt. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 163 Inserc¸a˜o em a´rvores AVL (cont.) Caso 4: Inserc¸a˜o do lado mais alto − h − x h-1 h+1 alt: true Neste caso, se houve aumento de altura na chamada recursiva, a a´rvore deixara´ de ser do tipo AVL. Havera´ enta˜o dois subcasos, dependendo do lado da suba´rvore esquerda em que houve inserc¸a˜o. A identificac¸a˜o do subcaso sera´ feita pelo valor do fator de balanceamento final da suba´rvore que aumentou de altura durante a chamada recursiva. Nos dois casos havera´ rearranjos convenientes mas locais da a´rvore. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 164 Inserc¸a˜o em a´rvores AVL (cont.) Caso 4a: inserc¸a˜o do lado esquerdo da suba´rvore (rotac¸a˜o LL) − x h-1 h+1 alt: true − − A B x h-2 h-1 h-2T1 T2 T3 0 0 B A x h-2 h-1 h-2 T1 T2 T3 0 B x h alt: false Neste caso e´ realizada uma transformac¸a˜o denominada rotac¸a˜o simples LL (esquerda, esquerda). A altura final permanece inalterada e a varia´vel alt recebe valor falso. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 165 Inserc¸a˜o em a´rvores AVL (cont.) Caso 4b: inserc¸a˜o do lado direito da suba´rvore (rotac¸a˜o LR) − x h-1 h+1 alt: true − + +0− A B C x x T1 T2 T3 T4 h-2 h-2 h-2/h-3 AB C 0 −/0 0/+ h-2/h-3 T1 T2 T3 T4x x h-2 h-2 0 C x h alt: false Neste caso, a inserc¸a˜o pode ter sido realizada na suba´rvore esquerda ou direita do lado que cresceu, ou enta˜o no pro´prio no´ C quando h = 2. Os fatores de balanceamento finais dependem disto, mas o da raiz sera´ 0. A transformac¸a˜o e´ denominada rotac¸a˜o dupla LR (esquerda, direita). A altura final permanece inalterada e a varia´vel alt recebe valor falso. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 166 Func¸a˜o de inserc¸a˜o em a´rvores AVL Boolean B u s c a I n s e r e ( ArvAVL ∗p , T x , Boolean ∗ a l t ) { /∗ Devo lve ’ t r u e ’ ou ’ f a l s e ’ conforme houve ou na˜o i n s e r c¸ a˜ o ; s e houve i n s e r c¸ a˜ o , ’ a l t ’ i n d i c a s e houve aumento da a l t u r a . ∗/ i f (∗p==NULL) { ∗p = m a l l o c ( s i z e o f ( NoArvAVL ) ) ; (∗p)−>esq = (∗p)−>d i r = NULL ; (∗p)−> i n f o = x ; (∗p)−>b a l = z e r o ; ∗ a l t = t r u e ; r e t u r n t r u e ; } e l s e { T i n f o = (∗p)−> i n f o ; i f ( x==i n f o ) r e t u r n f a l s e ; e l s e i f ( x< i n f o ) { /∗ d e s c e a` e s q u e r d a ∗/ Boolean r e s = B u s c a I n s e r e (&((∗p)−>esq ) , x , a l t ) ; i f ( ! r e s ) r e t u r n f a l s e ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 167 Func¸a˜o de inserc¸a˜o em a´rvores AVL (cont.) i f (∗ a l t ) { /∗ aumento de a l t u r a ∗/ ArvAVL p1 , p2 ; switch ( (∗ p)−>b a l ) { case mais : (∗p)−>b a l = z e r o ; ∗ a l t = f a l s e ; break ; case z e r o : (∗p)−>b a l = menos ; break ; case menos : p1 = (∗p)−>esq ; i f ( p1−>b a l==menos ) { /∗ Rotac¸ a˜o s i m p l e s LL ∗/ } e l s e { /∗ Rotac¸ a˜o d u p l a LR ∗/ } p1−>b a l = z e r o ; ∗ a l t = f a l s e ; break ; } } r e t u r n t r u e ; } e l s e { /∗ d e s c e a` d i r e i t a − a n a´ l o g o ∗/ } } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 168 Exemplos de inserc¸a˜o em a´rvores AVL Inserc¸a˜o de 33: 50 25 65 20 35 55 6010 30 45 70 4033 − + − + 0 0 0 − + 0− 0 50 25 65 20 35 55 6010 30 45 70 4033 − + − + 0 + 00 − 0 0− 0 Neste caso, houve uma inserc¸a˜o simples e a mudanc¸a de fatores de balanceamento afetou os no´s marcados. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 169 Exemplos de inserc¸a˜o em a´rvores AVL (cont.) Inserc¸a˜o de 63: 50 25 65 20 35 55 6010 30 45 70 40 63 − + − + 0 0 0 − + 0− 0 50 25 65 20 35 60 6310 30 45 70 40 55 − + − 0 0 0 0 0 − + 0− 0 Neste caso, a inserc¸a˜o causou uma rotac¸a˜o simples do tipo RR, afetando os no´s marcados. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 170 Exemplos de inserc¸a˜o em a´rvores AVL (cont.) Inserc¸a˜o de 41: 50 25 65 20 35 55 6010 30 45 70 40 41 − + − + 0 0 0 − + 0− 0 50 25 65 20 35 55 6010 30 41 70 40 45 − + − + 0 0 0 − + 00 0 0 Neste caso, a inserc¸a˜o causou uma rotac¸a˜o dupla do tipo LR, afetando os no´s marcados. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 171 Remoc¸a˜o em a´rvores AVL 1. Transformac¸a˜o em remoc¸a˜o de uma folha - treˆs casos: I o no´ tem grau zero: ja´ e´ uma folha I o no´ tem grau um: pela propriedade AVL, a sua u´nica suba´rvore e´ necessariamente constitu´ıda por uma folha, cujo valor e´ copiado para o no´ pai; o no´ a ser eliminado e´ a folha da suba´rvore I o no´ tem grau dois: o seu valor e´ substit´ıdo pelo maior valor contido na sua suba´rvore esquerda (ou o menor valor contido na sua suba´rvore direita); o no´ que continha o menor (ou maior) valor copiado tem necessariamente grau zero ou um, recaindo num dos casos anteriores. 2. Remoc¸a˜o propriamente dita. 3. O algoritmo de remoc¸a˜o sera´ apresentado novamente como uma func¸a˜o recursiva que indica se houve diminuic¸a˜o da altura da a´rvore apo´s a remoc¸a˜o. Sera˜o estudados apenas os casos de remoc¸a˜o do lado esquerdo; os outros sa˜o ana´logos. 4. A implementac¸a˜o do algoritmo e´ um exerc´ıcio. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 172 Remoc¸a˜o em a´rvores AVL (cont.) Caso 1: Remoc¸a˜o de uma folha X 0 h = 1 NULL h = 0 Neste caso a altura h diminui. Este fato sera´ propagado no retorno da func¸a˜o atrave´s de valor verdadeiro da varia´vel alt. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 173 Remoc¸a˜o em a´rvores AVL (cont.) Caso 2: Remoc¸a˜o quando as duas alturas sa˜o iguais 0 x h 0 h alt: true + h alt: false O conteu´do do retaˆngulo representa o resultado da chamada recursiva. O fator de balanceamento sera´ modificado somente se a a´rvore esquerda diminuiu de tamanho. Neste caso, mesmo que haja diminuic¸a˜o de altura na chamada recursiva, a altura total permanece a mesma. Este fato sera´ propagado no retorno da func¸a˜o atrave´s de valor falso da varia´vel alt. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 174 Remoc¸a˜o em a´rvores AVL (cont.) Caso 3: Remoc¸a˜o do lado mais alto − x h − alt: true h-1 0 alt: true h-1 Neste caso, se a chamada recursiva indica diminuic¸a˜o da altura da suba´rvore, a altura final da a´rvore tambe´m diminui e o processo continua. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 175 Remoc¸a˜o em a´rvores AVL (cont.) Caso 4: Remoc¸a˜o do lado mais baixo + x h + alt: true h h-2 Caso a suba´rvore esquerda tenha sua altura diminu´ıda, a a´rvore deixa de ser do tipo AVL. Ha´ treˆs subcasos, dependendo do fator de balanceamento do filho direito da raiz. Note-se que, neste caso, tem-se h ≥ 3. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 176 Remoc¸a˜o em a´rvores AVL (cont.) Caso 4a: Fator de balanceamento 0 (rotac¸a˜o RR) + alt: true h h-2 + 0 A B h-2 h-3 h-2 T1 T2 T3 − + B A h-2 h-3 h-2 T1 T2 T3 − B h alt: false Neste caso e´ realizada uma transformac¸a˜o denominada rotac¸a˜o simples RR (direita, direita). A altura final permanece inalterada e a varia´vel alt recebe valor falso. O processo de ajuste da a´rvore pa´ra. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 177 Remoc¸a˜o em a´rvores AVL (cont.) Caso 4b: Fator de balanceamento +1 (rotac¸a˜o RR) + alt: true h h-2 + + A B h-2 h-3 h-3 T1 T2 T3 0 0 B A h-2 h-3 h-3 T1 T2 T3 h-1 0 B h-1 alt: true Neste caso tambe´m e´ realizada a transformac¸a˜o denominada rotac¸a˜o simples RR (direita, direita). A altura final diminui e a varia´vel alt recebe o valor verdadeiro. O processo de ajuste da a´rvore continua. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 178 Remoc¸a˜o em a´rvores AVL (cont.) Caso 4c: Fator de balanceamento -1 (rotac¸a˜o RL) + alt: true h h-2 + − +0− A B CT1 T2 T3 T4 h-3 h-3 h-3/h-4 C A B 0 −/0 0/+ h-3/h-4 T1 T2 T3 T4 h-3 h-3 0 C h-1 alt: true Neste caso tambe´m e´ realizada uma transformac¸a˜o denominada rotac¸a˜o dupla RL (direita, esquerda). A altura final diminui e a varia´vel alt recebe o valor verdadeiro. O processo de ajuste da a´rvore continua. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 179 Exemplos de remoc¸a˜o em a´rvores AVL Remoc¸a˜o de 40: 50 25 65 20 35 55 6010 30 45 70 40 − + − + 0 0 0 − + 0− 0 50 25 65 20 35 55 6010 30 45 70 0 0 − + 0 0 − 0 00 0 Neste caso, houve uma remoc¸a˜o simples e a mudanc¸a de fatores de balanceamento afetou os no´s marcados. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 180 Exemplos de remoc¸a˜o em a´rvores AVL (cont.) Remoc¸a˜o de 60: 50 25 65 20 35 55 6010 30 45 70 40 − + − + 0 0 0 − + 0− 0 35 25 50 20 30 45 65 10 40 55 70 0 − − − 0 0 0 + 0 0 0 Neste caso, a remoc¸a˜o causou, apo´s a volta da chamada com a raiz original, uma rotac¸a˜o dupla do tipo LR, afetando os no´s marcados. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores bina´rias de busca 181 A´rvores do tipo B (B trees) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 182 Discos magne´ticos Esboc¸o esquema´tico do corte vertical de uma unidade com quatro discos (oito superf´ıcies): 0 1 2 3 4 5 6 7 cabec¸as leitoras/gravadoras c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 183 Discos magne´ticos (cont.) Esboc¸o esquema´tico de uma superf´ıcie de um disco: ... uma trilha um cilindro (trilhas iguais) setores c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 184 Discos magne´ticos (cont.) Dados para um disco fict´ıcio de 40 gigabytes: I 10 cabec¸as leitoras/gravadoras I 20.000 trilhas (2.000 por superf´ıcie) I 400 setores por trilha I 512 bytes por setor (unidade m´ınima de enderec¸amento) I tempo me´dio de busca da trilha enderec¸ada (seek): ∆S (10 milissegundos) I tempo me´dio de lateˆncia – espera pelo setor enderec¸ado: ∆L (10 milissegundos) I tempo de transfereˆncia de dados: ∆T (60 megabytes/segundo) I Estes tempos sa˜o va´rias ordens de grandeza maiores do que tempo de acesso a` memo´ria RAM (tipicamente 100.000 vezes). I Nu´mero de acessos: altura da a´rvore – log2 n na˜o e´ mais aceita´vel I Soluc¸a˜o: logk n, com k >> 2 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 185 A´rvores B I Autores: Rudolf Bayer e Ed McCreight (1971) I T e´ uma a´rvore B de ordem b≥2 se: 1. todas as folhas de T teˆm o mesmo n´ıvel; 2. cada no´ interno tem um nu´mero varia´vel r de registros de informac¸a˜o e r+1 de filhos, onde bb/2c ≤ r ≤ b se no´ 6= raiz 1 ≤ r ≤ b se no´ = raiz 3. cada folha tem um nu´mero varia´vel r de registros obedecendo a` mesma restric¸a˜o do item anterior; 4. os campos de informac¸a˜o contidos nos registros obedecem a` propriedade de a´rvores de busca. I Alguns autores definem de maneira diferente o conceito de ordem. I Pode-se provar que a altura ma´xima h de uma a´rvore B de ordem b que conte´m n registros e´ dada por: logbb/2c(n+ 1)/2. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 186 Exemplo de a´rvore B de ordem 3 Neste caso, cada no´ tem no m´ınimo um e no ma´ximo treˆs registros de informac¸a˜o. 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 187 Exemplo de a´rvore B de ordem 5 Neste caso, cada no´ tem no m´ınimo dois e no ma´ximo cinco registros de informac¸a˜o. 1 2 3 5 10 12 13 20 21 25 30 32 45 46 55 56 57 61 62 63 71 72 75 76 80 7 15 40 60 70 50 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 188 Nu´meros m´ınimos e ma´ximos de registros A´rvore B de ordem 255: m´ınimo ma´ximo n´ıvel no´s registros no´s registros 1 1 1 1 1 × 255 2 2 2 × 127 2561 2561 × 255 3 2 × 1281 2 × 1281 × 127 2562 2562 × 255 4 2 × 1282 2 × 1282 × 127 2563 2563 × 255 5 2 × 1283 2 × 1283 × 127 2564 2564 × 255 Total 4.227.331 536.870.911 4.311.810.305 1.099.511.627.775 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 189 Exemplos de inserc¸a˜o Inserc¸a˜o de 81: 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 3 5 20 35 48 51 80 81 85 150 205 17 50 83 203 125 Neste caso, foi feita inserc¸a˜o numa folha com espac¸o dispon´ıvel. Houve h leituras e uma gravac¸a˜o (h e´ a altura da a´rvore). O processo na˜o se propaga. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 190 Exemplos de inserc¸a˜o (cont.) Inserc¸a˜o de 33: 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 3 5 20 33 48 51 80 85 150 205 17 35 83 203 50 125 A capacidade de uma folha seria excedida e foi feita uma quebra que propagou-se para cima. Haveria no ma´ximo h leituras e 2h+1 gravac¸o˜es (se a raiz tambe´m fosse quebrada). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 191 Representac¸a˜o de a´rvores B #d e f i n e ORDEM 255 typedef s t r u c t NoArvB ∗ ArvB ; typedef s t r u c t NoArvB { i n t numregs ; ArvB f i l h o s [ORDEM+1]; T i n f o [ORDEM] ; } NoArvBin ; Esta representac¸a˜o sera´ usada para simular a´rvores B na memo´ria RAM. Normalmente, a´rvores B sa˜o implementadas em memo´rias externas como discos. O enderec¸amento em discos e´ usado em lugar de apontadores comuns. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 192 Inserc¸a˜o em a´rvores B A explicac¸a˜o a seguir supo˜e que a inserc¸a˜o e´ realizada por uma func¸a˜o recursiva auxiliar cujo cabec¸alho e´: Boolean I n s e r e R e c A r v B ( ArvB ∗p , ArvB ∗ s , T ∗x , Boolean ∗ prop ) ; onde I p: enderec¸o da varia´vel que conte´m o apontador para a a´rvore I prop: enderec¸o da varia´vel na qual e´ devolvida a informac¸a˜o que indica se houve propagac¸a˜o de inserc¸a˜o no retorno I x: enderec¸o de uma varia´vel I numa chamada: conte´m o valor a ser inserido de algum tipo T conveniente I no retorno, se houver propagac¸a˜o: conte´m o valor a ser propagado que separa os valores das a´rvores apontadas por p e por s I s: enderec¸o da varia´vel que conte´m o apontador para a a´rvore propagada (se houver) I se na˜o houver propagac¸a˜o numa chamada recursiva, o resto da a´rvore na˜o sofre mudanc¸a O valor devolvido pela func¸a˜o indica se a inserc¸a˜o foi efetivamente realizada ou se o elemento x ja´ pertencia a` arvore. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 193 Inserc¸a˜o em a´rvores B (cont.) Explicac¸a˜o geral: caso de chamada recursiva sem propagac¸a˜o no retorno p x s prop: ?α ? p x s prop: false? ? α Neste caso, na˜o havera´ mais modificac¸o˜es na a´rvore. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 194 Inserc¸a˜o em a´rvores B (cont.) Explicac¸a˜o geral: caso de chamada recursiva com propagac¸a˜o no retorno p x s prop: ?α ? p x s < > prop: trueβ α α Neste caso, a modificac¸a˜o devera´ ser propagada para cima. O valor α da varia´vel x foi inserido numa das duas a´rvores (ou e´ o β). Se p apontava para a raiz da a´rvore, sera´ necessa´rio criar uma nova raiz, com um u´nico valor β, e suba´rvores apontadas por p e s. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 195 Inserc¸a˜o em a´rvores B (cont.) Caso 1: a´rvore vazia p x s prop: ?α ? p x s prop: trueα Neste caso, sa˜o adotados valores das varia´veis x, s e prop de maneira a recair no caso geral de propagac¸a˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 196 Inserc¸a˜o em a´rvores B (cont.) Caso 2: inserc¸a˜o com espac¸o dispon´ıvel (r<b) p 0 i−1 i r−1 b−1 ... ...xi−1 xi Ti x s ? prop: ?α (inserc¸a˜o recursiva em Ti) p 0 i−1 i r−1 b−1 ... ...xi−1 xi x s prop: trueβ p 0 i−1 i r b−1 ... ...xi−1 xi x s ? prop: false?β Neste caso, o valor propagado apo´s a chamada recursiva e´ absorvido no no´ corrente e a propagac¸a˜o pa´ra. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 197 Inserc¸a˜o em a´rvores B (cont.) Caso 3: inserc¸a˜o sem espac¸o dispon´ıvel (r=b) p 0 i−1 i b−1 ... ...xi−1 xi Ti xb−1 x s ? prop: ?α (inserc¸a˜o recursiva em Ti) p 0 i−1 i b−1 ... ...xi−1 xi xb−1 x s prop: trueβ p 0 i−1 i b−1 ... ...xi−1 xi xb−1 x s ? prop: ??β b Neste caso, o valor propagado apo´s a chamada recursiva na˜o pode ser absorvido pois o no´ teria que ser aumentado ale´m da capacidade ma´xima; continua com quebra do no´ (o espac¸o extra e´ apenas conceitual). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 198 Inserc¸a˜o em a´rvores B (cont.) Caso 3: inserc¸a˜o sem espac¸o dispon´ıvel – quebra do no´ p 0 i−1 i b−1 ... ...xi−1 xi xb−1 x s ? prop: ??β b (equivalente) p 0 k b−1 ... ...yk yb x s ? prop: ?? Tk Tk+1 Tb+1 b p 0 k b−1 yk−1 Tk x s prop: true yk 0 b−k b−1 Tk+1 Tb+1 yk+1 O no´ corrente e´ quebrado em dois; o primeiro (no´ original apontado por p) rete´m k = db/2e+1 primeiros registros; o k-e´simo elemento e um novo no´ com b−k registros restantes sa˜o propagados de volta. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 199 Func¸a˜o de inserc¸a˜o auxiliar (esboc¸o) Boolean I n s e r e R e c A r v B ( ArvB ∗p , ArvB ∗ s , T ∗x , Boolean ∗ prop ) { i n t i ; Boolean i n s e r i u ; i f ( p==NULL) { ∗ prop = t r u e ; ∗ s = NULL ; r e t u r n t r u e ; } i = I n d i c e A r v B ( p , x ) ; // l o c a l i z a o ponto de i n s e r c¸ a˜ o i f ( ( i <((∗p)−>numregs ) ) && ( x==((∗p)−> i n f o ) [ i ] ) ) { ∗ prop = f a l s e ; r e t u r n f a l s e ; } i n s e r i u = I n s e r e R e c A r v B (&((∗p)−> f i l h o s [ i ] ) , s , x , prop ) ; i f (∗ prop ) { I n s e r e I n f o A r v B ( p , s , x , i ) } ; // i n s e r e ’ s ’ e ’ x ’ no no´ ( (∗ p)−>numregs )++; i f ( ( (∗ p)−>numregs<=ORDEM) ) ∗ prop = f a l s e ; e l s e { QuebraNoArvB ( p , s , x ) ; ∗ prop = t r u e ; // quebra } } r e t u r n i n s e r i u ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 200 Func¸a˜o de inserc¸a˜o inicial Boolean I n s e r e A r v B ( ArvB ∗p , T ∗x ) { /∗ Devo lve ’ f a l s e ’ s e o v a l o r de ’ x ’ j a´ o c o r r e na a´ r v o r e ’ p ’ ∗/ Boolean prop ; ArvB q , s ; Boolean i n s e r i u = I n s e r e R e c A r v B ( p,& s , x ,& prop ) ; i f ( prop ) { q = ( ArvB ) m a l l o c ( s i z e o f ( NoArvB ) ) ; q−>numregs = 1 ; ( q−> f i l h o s ) [ 0 ] = ∗p ; ( q−> f i l h o s ) [ 1 ] = s ; ( q−> i n f o ) [ 0 ] = ∗x ; ∗p = q ; } r e t u r n i n s e r i u ; } O eventual aumento da altura da a´rvore se dara´ sempre nesta func¸a˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 201 Exemplos de remoc¸a˜o Remoc¸a˜o de 51: 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 3 5 20 35 48 80 85 150 205 17 50 83 203 125 Neste caso, foi feita remoc¸a˜o numa folha com nu´mero de registros acima do m´ınimo. Houve h leituras e uma gravac¸a˜o (h e´ a altura da a´rvore). O processo na˜o se propaga. Em todos os casos, a remoc¸a˜o devera´ iniciar-se numa folha. Se necessa´rio, um elemento de um no´ interno devera´ ser substitu´ıdo convenientemente. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 202 Exemplos de remoc¸a˜o (cont.) Remoc¸a˜o de 85: 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 3 5 20 35 48 51 83 150 205 17 50 80 203 125 Neste caso, foi feita remoc¸a˜o numa folha com nu´mero m´ınimo de registros, e foi feito um “empre´stimo” de um no´ irma˜o imediato com sobra de registros. O empre´stimo passa pelo no´ pai a fim de manter a propriedade de a´rvore de busca. Haveria no ma´ximo h+ 2 leituras e treˆs gravac¸o˜es. O processo na˜o se propaga. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 203 Exemplos de remoc¸a˜o (cont.) Remoc¸a˜o de 150: 3 5 20 35 48 51 80 85 150 205 17 50 83 203 125 3 5 20 35 48 51 80 85 203 205 17 50 125 83 Neste caso, foi feita remoc¸a˜o numa folha com nu´mero m´ınimo de registros e cujos irma˜os tambe´m esta˜o no m´ınimo. Foi feita enta˜o uma junc¸a˜o de dois no´s e inclu´ıdo o valor do no´ pai que os separa. A remoc¸a˜o deste valor do no´ pai seguira´ o mesmo esquema de remoc¸o˜es, e podera´ se propagar ate´ a raiz. Haveria no ma´ximo 3h− 2 leituras e 2h− 1 gravac¸o˜es. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 204 Observac¸o˜es I Verifica-se facilmente que tanto no caso de quebras (inserc¸a˜o) como no caso de junc¸o˜es (remoc¸a˜o), os no´s resultantes preservam as propriedades de a´rvores B. I O nu´mero de leituras e gravac¸o˜es e´ sempre proporcional a` altura da a´rvore. I O no´ raiz da a´rvore e´ normalmente guardado na memo´ria, diminuindo o nu´mero de acessos ao disco. I De acordo com a definic¸a˜o das a´rvores B, a utlizac¸a˜o m´ınima do espac¸o dos no´s e´ de cerca de 50%; pode-se provar que a utilizac¸a˜o me´dia e´ de cerca de 69%. I Usando te´cnicas probabil´ısticas, pode-se mostrar que as operac¸o˜es mais complicadas sa˜o muito infrequentes. I A remoc¸a˜o pode ser implementada de maneira ana´loga a` inserc¸a˜o e sera´ deixada para exerc´ıcio. I Uma a´rvore B inicial pode ser constru´ıda por inserc¸o˜es sucessivas o que seria muito ineficiente; na pra´tica, utiliza-se um algoritmo direto. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 205 Variantes de a´rvores B I A´rvores B∗: o nu´mero de registros ocupados de um no´ e´ no m´ınimo 23 da sua capacidade. I A´rvores B+: I no´s internos com chaves apenas para orientar o percurso I pares (chave, valor) apenas nas folhas I regra de descida: I suba´rvore esquerda: menor I suba´rvore direita: maior ou igual I apontadores em lugar de valores tornando mais eficiente a movimentac¸a˜o dos registros durante inserc¸o˜es e remoc¸o˜es I ligac¸o˜es facilitando percurso em ordem de chaves c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 206 Variantes de a´rvores B (cont.) Exemplo de a´rvore B+ de ordem 3: 4 6 8 11 12 14 15 18 20 23 25 26 29 35 11 15 26 23 Setas tracejadas indicam apontadores para os valores da informac¸a˜o. A lista ligada das folhas permite percurso simples e eficiente em ordem de chaves. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores do tipo B 207 Filas de prioridade (Priority queues) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 208 Definic¸a˜o e propriedades I Uma fila de prioridade e´ uma a´rvore bina´ria com as propriedades: I a a´rvore e´ completa ou quase completa; I em cada no´ da a´rvore, o valor da chave e´ maior ou igual aos valores das chaves dos filhos (e consequentemente, de todos os descendentes). I Uma fila de prioridade na˜o e´ uma a´rvore de busca! I A determinac¸a˜o do elemento ma´ximo de uma fila de prioridade pode ser feita em tempo constante (esta´ na raiz). I As operac¸o˜es de inserc¸a˜o e de remoc¸a˜o podem ser realizadas em tempo proporcional a` altura (O(log n)). I Filas de prioridade podem ser implementadas eficientemente de maneira sequencial. I Em algumas aplicac¸o˜es e´ conveniente utilizar filas de prioridade em que um elemento e´ menor ou igual a todos os seus descendentes. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 209 Exemplo 0 95 1 88 2 75 3 30 4 45 5 40 6 38 7 15 8 10 9 23 Implementac¸a˜o sequencial (heap): 95 0 88 1 75 2 30 3 45 4 40 5 38 6 15 7 10 8 23 9 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 210 Operac¸a˜o de subida Supondo que, exceto pelo u´ltimo elemento, a a´rvore e´ uma fila de prioridade, a operac¸a˜o torna a a´rvore inteira uma fila va´lida. 0 95 1 88 2 75 3 30 4 45 5 40 6 38 7 15 8 10 9 23 10 90 0 95 1 90 2 75 3 30 4 88 5 40 6 38 7 15 8 10 9 23 10 45 Setas duplas indicam as operac¸o˜es de troca a serem realizadas. Obviamente, o nu´mero de operac¸o˜es de troca executadas e´, no ma´ximo, igual a` altura da a´rvore original (log2 n). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 211 Operac¸a˜o de descida Supondo que, exceto por um u´nico valor que na˜o e´ maior ou igual do que seus descendentes, a a´rvore e´ uma fila de prioridade, a operac¸a˜o torna a a´rvore inteira uma fila va´lida. 0 95 1 13 2 75 3 30 4 88 5 40 6 38 7 15 8 10 9 23 0 95 1 88 2 75 3 30 4 23 5 40 6 38 7 15 8 10 9 13 Setas duplas indicam as operac¸o˜es de troca a serem realizadas. Obviamente, o nu´mero de operac¸o˜es de troca executadas e´ menor do que a altura da a´rvore original (log2 n). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 212 Implementac¸a˜o das operac¸o˜es #d e f i n e TAM MAX 50 typedef s t r u c t { T v e t o r [TAM MAX ] ; i n t tam ; } Heap ; vo id Sobe ( Heap ∗h , i n t m) { i n t j = (m−1)/2; T x = (∗h ) . v e t o r [m] ; whi le ( (m>0) && ( (∗ h ) . v e t o r [ j ]<x ) ) { (∗h ) . v e t o r [m] = (∗h ) . v e t o r [ j ] ; m = j ; j = ( j −1)/2; } (∗h ) . v e t o r [m] = x ; } /∗ Sobe ∗/ Note-se que as operac¸o˜es de troca foram otimizadas com a utilizac¸a˜o da varia´vel tempora´ria x. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 213 Implementac¸a˜o das operac¸o˜es (cont.) vo id Desce ( Heap ∗h , i n t m) { i n t k = 2∗m+1; T x = (∗h ) . v e t o r [m] ; whi le ( k<(∗h ) . tam ) { i f ( ( k<((∗h ) . tam)−1) && ( (∗ h ) . v e t o r [ k ]<(∗h ) . v e t o r [ k +1])) k++; i f ( x<(∗h ) . v e t o r [ k ] ) { (∗h ) . v e t o r [m] = (∗h ) . v e t o r [ k ] ; m = k ; k = 2∗k+1; } e l s e break ; } (∗h ) . v e t o r [m] = x ; } /∗ Desce ∗/ Tambe´m neste caso, as operac¸o˜es de troca foram otimizadas. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 214 Construc¸a˜o inicial Dado um vetor com elementos em ordem arbitra´ria, deve-se transforma´-lo numa fila de prioridade: vo id C on s t r o iH e a p1 ( Heap ∗h ) { i n t i ; f o r ( i =1; i <(∗h ) . tam ; i ++) Sobe ( h , i ) ; } /∗ C on s t r o iH e a p1 ∗/ vo id C on s t r o iH e a p2 ( Heap ∗h ) { i n t i ; f o r ( i =((∗h ) . tam−2)/2; i >=0; i−−) Desce ( h , i ) ; } /∗ C on s t r o iH e a p2 ∗/ Verifica-se facilmente que a eficieˆncia da func¸a˜o ConstroiHeap1 e´ O(n log n). Pode-se demonstrar, tambe´m, que a eficieˆncia de ConstroiHeap2 e´ O(n) (linear). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 215 Inserc¸a˜o e remoc¸a˜o vo id I n s e r e H e a p ( Heap ∗h , T x ) { v e t o r [ ( ∗ h ) . tam ] = x ; ( (∗ h ) . tam)++; Sobe ( h , ( ( ∗ h ) . tam )−1); } /∗ I n s e r e H e a p ∗/ vo id RemoveHeap ( Heap ∗h , T ∗x ) { ∗x = (∗h ) . v e t o r [ 0 ] ; ( (∗ h ) . tam)−−; (∗h ) . v e t o r [ 0 ] = (∗h ) . v e t o r [ ( ∗ h ) . tam ] ; Desce ( h , 0 ) ; } /∗ RemoveHeap ∗/ Note-se que a func¸a˜o RemoveHeap remove e devolve na varia´vel x o elemento ma´ximo da fila. Obviamente, as duas func¸o˜es realizam no ma´ximo O(n log n) operac¸o˜es. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 216 Algoritmo de ordenac¸a˜o Heapsort O algoritmo constro´i um heap inicial. Em seguida, remove um a um o elemento ma´ximo e o coloca na posic¸a˜o final do vetor. vo id HeapSort ( Heap ∗h ) { i n t i , n = (∗h ) . tam ; /∗ c o n s t r o´ i heap ∗/ f o r ( i =(n−2)/2; i >=0; i−−) Desce ( h , i ) ; /∗ ordena ∗/ f o r ( i=n−1; i >0; i−−) { T t = (∗h ) . v e t o r [ 0 ] ; (∗h ) . v e t o r [ 0 ] = (∗h ) . v e t o r [ i ] ; (∗h ) . v e t o r [ i ] = t ; (∗h ) . tam−−; Desce ( h , 0 ) ; } (∗h ) . tam = n ; } /∗ HeapSort ∗/ Nu´mero de operac¸o˜es: O(n log n) (um dos algoritmos o´timos). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Filas de prioridade 217 A´rvores gerais c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 218 Exemplo de a´rvore geral A B F G C H D E I L J K I a´rvores gerais nunca sa˜o vazias I as suba´rvores sa˜o ordenadas: primeira, segunda, etc I o nu´mero de suba´rvores pode ser qualquer, inclusive zero I conceitos naturais: grau, filhos, pai, descendente, altura, etc c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 219 Representac¸a˜o de a´rvores gerais #d e f i n e GRAU MAX 10 typedef s t r u c t NoArvGera l ∗A r v G e r a l ; typedef s t r u c t NoArvGera l { T i n f o ; i n t grau ; A r v G e r a l f i l h o s [GRAU MAX ] ; } NoArvGera l ; . . . p = m a l l o c ( s i z e o f ( NoArvGera l ) ) ; . . . typedef s t r u c t NoArvGera l ∗A r v G e r a l ; typedef s t r u c t NoArvGera l { T i n f o ; i n t grau ; A r v G e r a l f i l h o s [ 1 ] ; } NoArvGera l ; . . . p = m a l l o c ( s i z e o f ( NoArvGera l )+ ( grau −1)∗ s i z e o f ( A r v G e r a l ) ) ; . . . c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 220 Florestas Uma floresta e´ uma sequeˆncia, possivelmente vazia, de a´rvores gerais. Exemplo: A D J E K L F G M B C H I N O Q P Note-se que as suba´rvores de um no´ de uma a´rvore geral constituem uma floresta. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 221 Floresta representada como a´rvore bina´ria A D J E K L F G M B C H I N O Q P I o campo esquerdo aponta para a raiz da primeira suba´rvore original I o campo direito aponta para o no´ irma˜o seguinte I as ra´ızes das a´rvores da floresta sa˜o consideradas irma˜s. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 222 Floresta representada como a´rvore bina´ria (cont.) I A a´rvore bina´ria B(F ) que representa uma floresta F = (T1, T2, . . . , Tm) e´ definida por: I a´rvore bina´ria vazia se F e´ uma floresta vazia (m = 0); I a´rvore bina´ria cuja raiz conte´m a mesma informac¸a˜o da raiz de T1; cuja suba´rvore esquerda e´ dada por B((T11, T12, . . . , T1m1)) onde (T11, T12, . . . , T1m1) e´ a floresta das suba´rvores de T1; e cuja suba´rvore direita e´ dada por B((T2, . . . , Tm)). I Conclui-se facilmente que toda floresta tem uma u´nica representac¸a˜o bina´ria. I A implementac¸a˜o de a´rvores bina´rias e´ mais simples. I Exerc´ıcio: definir a transformac¸a˜o contra´ria F(T ) que obte´m a floresta a partir da a´rvore bina´ria T que a representa. I Exerc´ıcio: verificar se toda a´rvore bina´ria representa uma floresta. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 223 Percursos em profundidade de florestas Os percursos de uma floresta F = (T1, T2, . . . , Tm) sa˜o definidos por: I Pre´-ordem de florestas: Visitar a raiz de T1 Percorrer a floresta F1 em pre´-ordem de florestas Percorrer a floresta (T2, . . . , Tm) em pre´-ordem de florestas I Po´s-ordem de florestas: Percorrer a floresta F1 em po´s-ordem de florestas Percorrer a floresta (T2, . . . , Tm) em po´s-ordem de florestas Visitar a raiz de T1 I Inordem de florestas: Percorrer a floresta F1 em inordem de florestas Visitar a raiz de T1 Percorrer a floresta (T2, . . . , Tm) em inordem de florestas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 224 Percursos em profundidade de florestas (cont.) A D J E K L F G M B C H I N O Q P Pre´-ordem: A,D,J ,E,K,L,F ,G,M ,B,C,H,I,N ,O,Q,P Po´s-ordem: J ,L,K,M ,G,F ,E,D,Q,P ,O,N ,I,H,C,B,A Inordem: J ,D,K,L,E,F ,M ,G,A,B,H,N ,Q,O,P ,I,C c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 225 Percursos em profundidade de florestas (cont.) Propriedades: I percurso de uma floresta F produz o mesmo resultado que o percurso (bina´rio) correspondente da a´rvore B(F ). I pre´-ordem de florestas e´ semelhante a` pre´-ordem de a´rvores bina´rias I inordem de florestas e´ semelhante a` po´s-ordem de a´rvores bina´rias I po´s-ordem de florestas na˜o tem uma interpretac¸a˜o natural Desafio: Elabore um algoritmo para percurso em largura de a´rvores gerais sob representac¸a˜o bina´ria. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores gerais 226 A´rvores digitais (Tries) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 227 Conjuntos de cadeias de caracteres Exemplo: a at from his no an be had i not and but have in of are by he is on as for her it or c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 228 A´rvore digital a at from his no an be had i not and but have in of are by he is on as for her it or a b f h i n o n r s t e u y o r a e i n s t o f n r d e t r o d v r s t m e I Arestas sa˜o rotuladas com as letras das palavras. I No´s cheios indicam o fim de uma cadeia. I Sa˜o fatorados os prefixos comuns das cadeias. I Nu´meros para o exemplo: I 39 no´s I 20 folhas I 19 no´s internos (na˜o folhas) I 25 no´s cheios (25 palavras) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 229 Implementac¸a˜o de a´rvores digitais a b c y z . . . I Algoritmos de busca, inserc¸a˜o e remoc¸a˜o o´bvios (exerc´ıcio). I Uso de memo´ria: I 39× 26 = 1014 campos apontadores I 38 campos sa˜o na˜o nulos I Eliminando apontadores das folhas: I 19× 26 = 494 campos apontadores I 38 campos sa˜o na˜o nulos I Existem alternativas mais econoˆmicas para representar os no´s. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 230 A´rvore digital com subcadeias a at from his no an be had i not and but have in of are by he is on as for her it or d re s s e ut y or rom d ve r is n s t t f n r a b f h i n o n r s t e u y o r a e i n s t o f n r d d v r t I Uso de memo´ria: I 12× 26 = 312 campos apontadores I 31 campos sa˜o na˜o nulos c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 231 Autoˆmato finito minimal ac´ıclico Exemplo: as 15 formas dos verbos ingleses: do, redo e undo do redo undo does redoes undoes did redid undid doing redoing undoing done redone undone r e d o i n g u n i n e d d s e I Sa˜o fatorados tanto os prefixos quanto os sufixos comuns das cadeias. I Algoritmo de busca igual ao de a´rvores digitais. I Algoritmos de inserc¸a˜o e de remoc¸a˜o muito mais complicados. I Uso de memo´ria: I 11× 26 = 286 campos apontadores (no´s internos) I 16 campos sa˜o na˜o nulos I Se fosse a´rvore digital: I 26× 26 = 676 campos apontadores (no´s internos) I 37 campos seriam na˜o nulos I As estruturas para um exemplo ana´logo em portugueˆs seriam maiores (mais de 50 formas verbais) mas resultariam em muito mais economia. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o A´rvores digitais 232 Listas generalizadas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 233 Conceito e exemplos I Um a´tomo e´ um inteiro ou uma cadeia de caracteres. I Uma lista generalizada e´ uma sequeˆncia: (α1, α2, . . . , αn) onde αi denota um a´tomo ou uma lista generalizada (definic¸a˜o recursiva). I Exemplos de listas: A: ((4,7),(4,7,(8))) B: ((1,4),(7,8)) C: (3,B,B) D: (5,8,D) E: () I As listas A, B, C, D e E teˆm, respectivamente, 2, 2, 3, 3 e 0 elementos. I A definic¸a˜o de a´tomo poderia ser estendida para outros tipos de valores. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 234 Expansa˜o de listas A: ((4,7),(4,7,(8))) B: ((1,4),(7,8)) C: (3,B,B) D: (5,8,D) E: () As listas C e D podem ser expandidas com as definic¸o˜es correspondentes: C: (3,((1,4),(7,8)),((1,4),(7,8))) D: (5,8,(5,8,(5,8,(...)))) A lista D tem treˆs elementos, mas inclui um nu´mero infinito de inteiros, por ser recursiva. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 235 Implementac¸a˜o compartilhada A: ((4,7),(4,7,(8))) B: ((1,4),(7,8)) C: (3,B,B) D: (5,8,D) E: () A: 4 7 4 7 8 B: 7 8 1 4 C: 3 D: 5 8 E: NULL c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 236 Implementac¸a˜o com co´pia A: ((4,7),(4,7,(8))) B: ((1,4),(7,8)) C: (3,B,B) D: (5,8,D) E: () B: 7 8 1 4 C: 3 7 8 1 4 7 8 1 4 D: 5 8 5 8 5 8 . . . I Na˜o e´ poss´ıvel completar a expansa˜o da lista D. I As representac¸o˜es das listas A, B e E na˜o mudam. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 237 Representac¸a˜o de listas generalizadas typedef s t r u c t RegLis taGen ∗ L i s t a G e n ; typedef s t r u c t RegLis taGen { L i s t a G e n prox ; Boolean eAtomo ; union { i n t atomo ; /∗ ’ eAtomo ’ v e r d a d e i r o ∗/ L i s t a G e n l i s t a ; /∗ ’ eAtomo ’ f a l s o ∗/ } i n f o ; } RegLis taGen ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 238 Exemplo de manipulac¸a˜o Func¸a˜o de contagem de a´tomos: i n t ContaAtomos ( L i s t a G e n p ) { i n t s = 0 ; whi le ( p!=NULL) { i f ( p−>eAtomo ) s++; e l s e s += ContaAtomos ( p−> i n f o . l i s t a ) ; p = p−>prox ; } r e t u r n s ; } /∗ ContaAtomos ∗/ Problemas com compartilhamento: I contagem repetida (caso da lista C ); pode ser intencional I repetic¸a˜o infinita (caso da lista D) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 239 Representac¸a˜o alternativa typedef s t r u c t RegLis taGen ∗ L i s t a G e n ; typedef s t r u c t RegLis taGen { Boolean v i s i t a d o ; /∗ i n i c i a l m e n t e f a l s o ∗/ L i s t a G e n prox ; Boolean eAtomo ; union { i n t atomo ; /∗ ’ eAtomo ’ v e r d a d e i r o ∗/ L i s t a G e n l i s t a ; /∗ ’ eAtomo ’ f a l s o ∗/ } i n f o ; } RegLis taGen ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 240 Exemplo de manipulac¸a˜o Func¸a˜o geral de contagem de a´tomos: i n t ContaAtomos ( L i s t a G e n p ) { i n t s = 0 ; whi le ( ( p!=NULL) && ! ( p−>v i s i t a d o ) ) { p−>v i s i t a d o = t r u e ; i f ( p−>eAtomo ) s++; e l s e s += ContaAtomos ( p−> i n f o . l i s t a ) ; p = p−>prox ; } r e t u r n s ; } /∗ ContaAtomos ∗/ Problema: restaurac¸a˜o dos valores do campo visitado para o pro´ximo percurso. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 241 Exemplo de aplicac¸a˜o Manipulac¸a˜o de polinoˆmios em mu´ltiplas varia´veis: P (x, y, z) = x10y3z2 + 2x8y3z2 + 3x8y2z2 + x4y4z − 6x3y4z + 2yz Representac¸a˜o poss´ıvel para cada termo: coef x y z I Problema: muito inflex´ıvel, somente para polinoˆmios em treˆs varia´veis. I Alternativa: um polinoˆmio em k≥1 varia´veis pode ser considerado um polinoˆmio em uma varia´vel, com coeficientes que sa˜o polinoˆmios em k−1 varia´veis, etc: P (x, y, z) = ((x10 + 2x8)y3 + 3x8y2)z2 + ((x4 − 6x3)y4 + 2x0y)z c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 242 Representac¸a˜o de polinoˆmios ((x10 + 2x8)y3 + 3x8y2)z2 + ((x4 − 6x3)y4 + 2x0y)z Alternativa 1: representac¸a˜o uniforme em todos os n´ıveis: z 2 1 y 4 1 x 02 x 4 31 −6 y 3 2 x 83 x 10 81 2 Note-se que o termo 2x0y e´ representado de maneira completa. Esta representac¸a˜o torna os algoritmos mais simples. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 243 Representac¸a˜o de polinoˆmios (cont.) ((x10 + 2x8)y3 + 3x8y2)z2 + ((x4 − 6x3)y4 + 2x0y)z Alternativa 2: representac¸a˜o que elimina polinoˆmios “degenerados” z 2 1 y 4 1 x 02 2 x 4 31 −6 y 3 2 x 83 x 10 81 2 Note-se que o termo 2x0y e´ representado como 2y. Esta representac¸a˜o economiza memo´ria (retaˆngulo tracejado). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 244 Declarac¸a˜o de tipo typedef s t r u c t Termo ∗ApTermo ; typedef ApTermo P o l i n o m i o ; typedef s t r u c t Termo { P o l i n o m i o prox ; Boolean eCabeca ; union { char v a r i a v e l ; /∗ s e e´ cabe c¸a ∗/ s t r u c t { /∗ s e e´ termo ∗/ i n t e x p o e n t e ; Boolean c o e f I n t e i r o ; union { i n t c o e f I n t ; P o l i n o m i o c o e f P o l i n ; } c o e f ; } termo ; } no ; } Termo ; Exerc´ıcio: escrever as func¸o˜es de soma e de multiplicac¸a˜o para polinoˆmios em mu´ltiplas varia´veis. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 245 LISP: uma linguagem para processamento de listas I Programas sa˜o expressos como listas. I Dados sa˜o a´tomos e listas. I Aplicac¸o˜es: I inteligeˆncia artificial I scripts para Emacs I scripts para AutoCAD I ... c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 246 LISP (cont.) Exemplo 1: func¸a˜o fatorial ( defun f a t o r i a l ( n ) ( cond ( l e q n 1) 1 ( mult n ( f a t o r i a l ( minus n 1 ) ) ) ) ) I A expressa˜o: (fatorial 5) produz: 120. I Deve-se notar o uso de notac¸a˜o pre´-fixa. I As implementac¸o˜es comuns de LISP permitem o uso de s´ımbolos de operac¸o˜es como <=, + e ∗ em lugar de a´tomos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 247 LISP (cont.) Exemplo 2: concatenac¸a˜o e inversa˜o de listas ( defun c o n c a t ( p q ) ( cond ( n u l l p ) q ( cons ( c a r p ) ( c o n c a t ( c d r p ) q ) ) ) ) ( defun i n v e r t e ( p ) ( cond ( n u l l p ) n i l ( c o n c a t ( i n v e r t e ( c d r p ) ) ( c a r p ) ) ) ) I A expressa˜o: (inverte ’(A B C D)) produz D C B A. I A expressa˜o (car L) devolve o primeiro elemento da lista L. I A expressa˜o (cdr L) devolve a lista L sem o primeiro elemento. I A operac¸a˜o (cons x L) devolve a lista L com o elemento x inserido na frente da lista. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Listas generalizadas 248 Espalhamento (Hashing ou scattering) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 249 Tabelas de espalhamento Exemplo de tabela com b=7 linhas e s=3 colunas: 1 2 3 0 1 2 f(’jo~ao’)→ 3 jo~ao 4 5 6 Supo˜e-se, neste caso, que: I a func¸a˜o de espalhamento f produz resultados entre 0 e 6 I f(’jo~ao’) = 3 I existem no ma´ximo treˆs valores (s) a serem inseridos que produzem o mesmo valor da func¸a˜o f . c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 250 Tabelas de espalhamento (cont.) Exemplo de tabela com b=26 linhas e s=2 colunas: 1 2 0 anto^nio a´tila 1 2 carlos ce´lio 3 douglas 4 ernesto este^v~ao 5 · · · 24 25 zoroastro Foi usada uma func¸a˜o (muito ingeˆnua!) de espalhamento: ı´ndice da primeira letra (a: 0, b: 1, ...). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 251 Virtudes e poblemas I Virtudes I simplicidade I busca muito ra´pida (se a func¸a˜o de espalhamento for eficiente) I Problemas I escolha da func¸a˜o de espalhamento I tratamento de coliso˜es I tratamento de estouro da tabela c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 252 Construc¸a˜o de func¸o˜es de espalhamento I Propriedades deseja´veis: I eficieˆncia de ca´lculo I bom espalhamento I Te´cnicas: I espalhamento m´ınimo perfeito I espalhamento pseudo-aleato´rio: combinac¸a˜o de va´rias te´cnicas c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 253 Construc¸a˜o de func¸o˜es de espalhamento (cont.) Divisa˜o I O nome, tratado como um nu´mero na base 26, e´ dividido por um nu´mero p relativamente primo f(x) = x mod p; p sera´ adotado como o nu´mero de linhas da tabela. I Para p = 51 ter´ıamos: f(carlos) = ( ((((2× 26 + 0)× 26 + 17)× 26 + 11) ×26 + 14)× 26 + 18 ) mod 51 = 24.069.362 mod 51 = 14 I Na realidade, o ca´lculo pode ser simplificado, com a operac¸a˜o mod aplicada a cada passo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 254 Construc¸a˜o de func¸o˜es de espalhamento (cont.) Selec¸a˜o de algarismos e meio-do-quadrado I O nome e´ tratado como uma sequeˆncia de algarismos ou de bytes ou de bits, e uma subsequeˆncia e´ selecionada para representar o ı´ndice. I Por exemplo, suponhamos que todos os nomes sa˜o representados como a sequeˆncia de d´ıgitos x = d0d1 · · · d11 em alguma base conveniente; uma escolha seria f(x) = d3d5d9. I Exemplo: a representac¸a˜o de ‘carlos’ poderia ser 020017111418. Supusemos que cada letra e´ indicada por dois d´ıgitos que indicam a posic¸a˜o no alfabeto, ou seja 00 para ‘a’, 01 para ‘b’, etc. Ter´ıamos enta˜o f(carlos) = 074. I Frequentemente, antes de fazer a selec¸a˜o, e´ calculado o quadrado do identificador (tratado como nu´mero); e´ o me´todo “meio-do-quadrado” (mid-square). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 255 Construc¸a˜o de func¸o˜es de espalhamento (cont.) Dobramento (folding) I O nome e´ tratado como uma sequeˆncia de algarismos ou de bytes ou de bits, e algumas subsequeˆncias sa˜o combinadas por operac¸o˜es convenientes para produzir um ı´ndice. I Por exemplo, suponhamos que todos os nomes sa˜o representados como uma sequeˆncia de bits x = b0b1b2b3b4 · · · ; uma escolha seria: f(x) = b0b1b2b3b4b5 ⊕ b6b7b8b9b10b11 ⊕ · · · onde ⊕ denota a operac¸a˜o de ou exclusivo bit a bit. I Exemplo: a representac¸a˜o de ‘carlos’ usada anteriormente poderia ser (com cinco bits para cada nu´mero): 00010 00000 10001 01011 01110 10010 produzindo a sequencia de bits: 000100000010001010110111010010 e o resultado: f(000100000010001010110111010010) = 000100⊕000010⊕001010⊕110111⊕010010 = 101001 = 4110 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 256 Tratamento de coliso˜es: enderec¸amento aberto I Busca sistema´tica de outras entradas dispon´ıveis na tabela: I reespalhamento linear I reespalhamento quadra´tico I reespalhamento duplo I Em todos os casos, os algoritmos de busca, inserc¸a˜o e remoc¸a˜o devera˜o ser coerentes. I Exemplos usam: anto^nio, carlos, douglas, ce´lio, armando, zoroastro, a´tila, alfredo (nesta ordem). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 257 Reespalhamento linear anto^nio, carlos, douglas, ce´lio, armando, zoroastro, a´tila, alfredo Usando (f(x) + i) mod b, (i = 0, 1, · · · ), procura a primeira posic¸a˜o livre. 0 anto^nio 1 armando 2 carlos 3 douglas 4 ce´lio 5 a´tila 6 alfredo 7 · · · · · · 25 zoroastro c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 258 Reespalhamento quadra´tico anto^nio, carlos, douglas, ce´lio, armando, zoroastro, a´tila, alfredo Usando (f(x) + i2) mod b, (i = 0, 1, · · · ), procura a primeira posic¸a˜o livre. 0 anto^nio 1 armando 2 carlos 3 douglas 4 a´tila 5 6 ce´lio 7 8 9 alfredo · · · · · · 25 zoroastro c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 259 Reespalhamento duplo anto^nio, carlos, douglas, ce´lio, armando, zoroastro, a´tila, alfredo I Usando (f(x) + i× g(x)) mod b, (i = 0, 1, · · · ) procura a primeira posic¸a˜o livre. I g(x) e´ a func¸a˜o de reespalhamento; por exemplo, g(x) = (cmod 3) + 1 onde c e´ a segunda letra. 0 anto^nio 1 2 carlos 3 douglas 4 ce´lio 5 6 armando 7 8 a´tila 9 alfredo · · · · · · 25 zoroastro c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 260 Remoc¸a˜o I La´pides (tombstones): I entradas que indicam posic¸o˜es ocupadas para fins de busca, mas livres para fins de inserc¸a˜o. I podem ser usadas com qualquer esquema de espalhamento I Exemplo: remoc¸a˜o da entrada armando (tabela com reespalhamento linear): 0 anto^nio 1 armando 2 carlos 3 douglas 4 ce´lio 5 a´tila 6 alfredo 7 · · · · · · 25 zoroastro 0 anto^nio 1 ++++++++ 2 carlos 3 douglas 4 ce´lio 5 a´tila 6 alfredo 7 · · · · · · 25 zoroastro c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 261 Eficieˆncia com enderec¸amento aberto I Nu´mero me´dio de comparac¸o˜es para encontrar um elemento: C(n) = (2− α)/(2− 2α) onde: I α = n/b (fator de carga, 0 ≤ α ≤ 1) I n e´ o nu´mero de entradas I b e´ o tamanho da tabela I Exemplo de tabela com 1000 entradas: n C(n) 100 1,06 200 1,13 300 1,21 400 1,33 500 1,50 600 1,75 700 2,17 800 3,00 900 5,50 950 10,5 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 262 Tratamento de coliso˜es: listas ligadas Te´cnica de encadeamento (chaining): utiliza listas ligadas para manter entradas com o mesmo valor da func¸a˜o de espalhamento. Exemplo: anto^nio, carlos, douglas, ce´lio, armando, zoroastro, a´tila, alfredo 0 1 2 3 4 5 25 . . . antoˆnio carlos douglas ce´lio carlos armando antoˆnio zoroastro a´tila armando antoˆnioalfredo a´tila armando antoˆnio As listas poderiam ser ordenadas. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 263 Eficieˆncia com encadeamento I Nu´mero me´dio de comparac¸o˜es para encontrar um elemento: C(n) = 1 + α/2 onde: I α = n/b (fator de carga, α > 0) I n e´ o nu´mero de entradas I b e´ o tamanho da tabela I Exemplo de tabela com 1000 entradas: n C(n) 100 1,05 200 1,10 400 1,20 500 1,25 1000 1,50 2000 2,00 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Espalhamento 264 Compressa˜o de textos (Codificac¸a˜o de Huffman) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 265 Compressa˜o de textos I Objetivos: I economia de espac¸o I velocidade de transmissa˜o I Representac¸a˜o normal: um byte (8 bits) por caractere (alfabetos “comuns”) I Compressa˜o por contagem (run-length encoding) I Codificac¸a˜o de Huffman I Algoritmos de codificac¸a˜o aritme´tica (Lempel-Ziv – zip, gzip, winzip, et.) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 266 Codificac¸a˜o de Huffman I Explora frequeˆncias de ocorreˆncia de caracteres I Exemplo de alfabeto: A = {a, b, c, d, e, f} a b c d e f frequeˆncia de cada letra 45 13 12 16 9 5 codificac¸a˜o usando 3 bits 000 001 010 011 100 101 codificac¸a˜o de tamanho varia´vel 0 101 100 111 1101 1100 I Para um arquivo de 100.000 caracteres: I codificac¸a˜o fixa: 300.000 bits I codificac¸a˜o varia´vel: 224.000 bits (economia de 25%) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 267 A´rvores bina´rias de codificac¸a˜o Codificac¸a˜o fixa a: 000 b: 001 c: 010 d: 011 e: 100 f: 101 100 86 58 a:45 b:13 28 c:12 d:16 14 14 e:9 f:5 0 1 0 1 0 0 1 0 1 0 1 I Os ro´tulos das arestas da raiz ate´ uma folha compo˜em o co´digo da letra correspondente. I Para obter o co´digo de uma letra, e´ necessa´rio percorrer a a´rvore partindo da folha correspondente ate´ a raiz. I Exemplo: abc = 000‖001‖010 = 000001010. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 268 A´rvores bina´rias de codificac¸a˜o (cont.) Codificac¸a˜o varia´vel a: 0 b: 101 c: 100 d: 111 e: 1101 f: 1100 100 a:45 55 25 c:12 b:13 30 14 f:5 e:9 d:16 0 1 0 1 0 1 0 1 0 1 I O co´digo de uma letra na˜o pode constituir um prefixo de uma outra letra. I Exemplo: abc = 0‖101‖100 = 0101100. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 269 Construc¸a˜o da a´rvore de Huffman I Algoritmo (guloso): 1. Construa uma floresta de folhas, cada uma correspondendo a um caractere, com a respectiva frequeˆncia como seu peso. 2. Enquanto a floresta tiver mais de uma a´rvore, repita: I procure na floresta duas a´rvores t1 e t2 de menor peso I construa uma nova a´rvore bina´ria t, com suba´rvores t1 e t2, e com peso que e´ a soma dos pesos das duas suba´rvores I remova t1 e t2 da floresta, e insira t. I A soluc¸a˜o na˜o e´ u´nica (pode haver va´rias escolhas de peso m´ınimo), mas todos os resultados sa˜o equivalentes quanto a` eficieˆncia de compressa˜o. I Se o alfabeto for razoavelmente grande, pode-se utilizar uma fila de prioridade para selecionar, em cada passo, duas a´rvores de menor peso. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 270 Construc¸a˜o da a´rvore de Huffman (cont.) Exemplo: a:45 b:13 c:12 d:16 e:9 f:5 a:45 b:13 c:12 d:16 14 f:5 e:9 a:45 d:16 14 f:5 e:9 25 c:12 b:13 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 271 Construc¸a˜o da a´rvore de Huffman (cont.) a:45 d:16 14 f:5 e:9 25 c:12 b:13 a:45 25 c:12 b:13 30 14 f:5 e:9 d:16 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 272 Construc¸a˜o da a´rvore de Huffman (cont.) a:45 25 c:12 b:13 30 14 f:5 e:9 d:16 a:45 55 25 c:12 b:13 30 14 f:5 e:9 d:16 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 273 Construc¸a˜o da a´rvore de Huffman (cont.) a:45 55 25 c:12 b:13 30 14 f:5 e:9 d:16 100 a:45 55 25 c:12 b:13 30 14 f:5 e:9 d:16 0 1 0 1 0 1 0 1 0 1 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 274 Observac¸o˜es I Adotadas certas hipo´teses, demonstra-se a otimalidade de compressa˜o I Algoritmo de compressa˜o: para cada letra, deve acessar a folha correspondente da a´rvore e reconstruir o caminho a` raiz – pode ser preprocessado I Algoritmo de descompressa˜o: percorre a a´rvore a partir da raiz seguindo o caminho indicado por bits da codificac¸a˜o I Variantes: I a´rvore fixa, por exemplo, uma para cada l´ıngua I a´rvore por texto (acompanha o arquivo) I a´rvores dinaˆmicas (Faller, Gallager e Knuth). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Compressa˜o de textos 275 Gerenciamento de memo´ria c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 276 Gerenciamento de memo´ria Va´rios aspectos: I alocac¸a˜o com e sem disciplina de pilha I caracter´ısticas da linguagem de programac¸a˜o I registros de tamanho fixo ou varia´vel I gerenciamento expl´ıcito (malloc e free) I gerenciamento impl´ıcito (coleta de lixo e contagem de refereˆncias) I gerenciamento misto c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 277 Gerenciamento expl´ıcito Configurac¸a˜o gene´rica da memo´ria: disp mLivre: ? mEm uso: Configurac¸a˜o inicial: M disp I A varia´vel disp (memo´ria dispon´ıvel) e´ global. I A lista das a´reas livres e´ ordenada pelo valor dos apontadores. I M denota o tamanho da a´rea livre inicial; m de uma a´rea livre ou em uso. I A func¸a˜o de alocac¸a˜o devolve o apontador para o primeiro byte livre da a´rea. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 278 Gerenciamento expl´ıcito (cont.) Uma versa˜o muito simples de malloc(n) (f e´ o tamanho da parte fixa de cada a´rea – apontador mais o campo de tamanho): 1. procure na lista disp o primeiro elemento (ou o elemento de tamanho m´ınimo) p com tamanho≥n+f 2. remova p da lista disp 3. quebre a a´rea apontada por p em duas partes: uma p1 de tamanho n+ f e outra p2 com o que sobrar (se houver sobra suficiente) 4. insira p2 na lista disp (se existir) 5. devolva p1 + f c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 279 Gerenciamento expl´ıcito (cont.) Uma versa˜o muito simples de free(p): 1. procure na lista disp o ponto de inserc¸a˜o para p (ordem crescente dos apontadores) 2. verifique se o predecessor e/ou sucessor de p neste ponto sa˜o adjacentes a` a´rea apontada por p 3. se for poss´ıvel, junte a a´rea liberada a` predecessora e/ou a` sucessora, modificando os campos de tamanho 4. atualize a lista c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 280 Gerenciamento expl´ıcito (cont.) Problemas: I O que fazer quando malloc na˜o acha uma a´rea de tamano suficiente – requer outra a´rea ao sistema operacional I Fragmentac¸a˜o – apo´s va´rias alocac¸o˜es e liberac¸o˜es, com tamanhos varia´veis, havera´ tendeˆncia a produzir muitas a´rea livres pequenas I Busca numa lista ligada pode ser ineficiente I Algumas soluc¸o˜es: I blocos com marcas de fronteira (boundary tags) I sistema de blocos conjugados (buddy system) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 281 Marcas de fronteira t tmLivre: f fmEm uso: I As a´reas livres constituem uma lista duplamente ligada. I m denota o tamanho da a´rea. I t e f denotam os valores booleanos que indicam se a a´rea e´ livre. I A func¸a˜o de alocac¸a˜o devolve o apontador para o primeiro byte livre da a´rea. I Na˜o e´ necessa´rio fazer uma busca na lista para encontrar as a´reas vizinhas. I Exerc´ıcio: esboc¸ar a implementac¸a˜o das func¸o˜es malloc e free. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 282 Sistema de blocos conjugados 0-15 0-1 0-3 0-1 2-3 4-7 4-5 6-7 8-15 8-11 8-9 10-11 12-15 12-13 14-15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 k=4 k=3 k=2 k=1 k=0 I Uma a´rvore bina´ria imagina´ria em que cada no´ representa um bloco de alocac¸a˜o. I Cada folha da a´rvore representa um bloco m´ınimo de alocac¸a˜o. I Cada n´ıvel k da a´rvore (a partir das folhas) representa a alocac¸a˜o de uma a´rea constitu´ıda de 2k blocos m´ınimos. I A´reas conjugadas (irma˜s) facilmente reconhecidos pelos ı´ndices sob forma bina´ria. I O exemplo exibe a a´rvore para uma memo´ria de 24=16 blocos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 283 Sistema de blocos conjugados (cont.) I Formato das a´reas: t kLivre: f kEm uso: I t e f denotam os valores booleanos que indicam se a a´rea e´ livre. I k indica que o tamanho da a´rea e´ 2k. I Para cada valor de k, existe uma lista duplamente ligada disp[k] de blocos livres de tamanho 2k. I A func¸a˜o de alocac¸a˜o devolve o apontador para o primeiro byte livre da a´rea. I Dado o nu´mero do bloco inicial de uma a´rea (em bina´rio) de tamanho 2k, o nu´mero da a´rea conjugada e´ determinado complementando o k-e´simo bit (a partir da direita); exemplo de bloco 12 para k=2: 1210=11002 =⇒ 10002=810 Portanto, a a´rea conjugada de quatro blocos tem in´ıcio no bloco 8. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 284 Sistema de blocos conjugados (cont.) Esboc¸o da func¸a˜o malloc(n) (f e´ o tamanho da parte fixa de cada a´rea – marca de uso, tamanho): 1. procure um k tal que 2k ≥ n+ f , e a lista de blocos para k na˜o esta´ vazia; remova desta lista uma a´rea p 2. se 2k−1 ≥ n+ f , quebre a a´rea p em duas (conjugadas), acerte os tamanhos e insira uma delas na lista de a´reas para tamanho k − 1 3. repita o passo anterior para k − 2, k − 3, ..., enquanto poss´ıvel 4. devolva o apontador p+ f Note-se que o desperd´ıcio de memo´ria de uma a´rea pode chegar a quase 50%. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 285 Sistema de blocos conjugados (cont.) Esboc¸o da func¸a˜o free(p): 1. seja k o expoente correspondente ao tamanho de p 2. calcule o enderec¸o da a´rea q conjugada de p 3. se a a´rea q esta´ livre: I remova q da lista disp[k] I junte as a´reas p e q para formar uma nova a´rea livre p I fac¸a k = k+1 I volte ao passo inicial 4. se a a´rea q na˜o esta´ livre (ou na˜o existe – p ja´ e´ a memo´ria inteira), insira p na lista disp[k] c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 286 Sistema de blocos conjugados (cont.) Uma outra alternativa e´ utilizar os nu´meros de Fibonacci: 0-12 0-7 0-4 0-2 0-1 3-4 5-7 5-6 8-12 8-10 8-9 11-12 0 1 2 3 4 5 6 7 8 9 10 11 12 F2=1 F3=2 F4=3 F5=5 F6=8 F7=13 I Esta soluc¸a˜o diminui o desperd´ıcio de memo´ria, mas torna mais complicados os algoritmos. I Exerc´ıcio: esboc¸ar as func¸o˜es malloc e free para esta alternativa. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 287 Gerenciamento impl´ıcito Coleta de lixo (garbage collection) I Caracter´ısticas: I operac¸a˜o de alocac¸a˜o impl´ıcita em algumas operac¸o˜es I na˜o existe operac¸a˜o de liberac¸a˜o expl´ıcita ou e´ opcional I liberac¸a˜o de memo´ria realizada, em geral, quando na˜o ha´ mais espac¸o para alocar I exemplos: Java, LISP, Prolog, Perl, Python, Modula-3, ... I contra-exemplos: C, Pascal, C++, ... I Fases: I marcac¸a˜o I coleta ou compactac¸a˜o I caso haja compactac¸a˜o: ca´lculo de destino; atualizac¸a˜o dos apontadores; co´pia dos blocos c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 288 Marcac¸a˜o e coleta I Hipo´teses I Localizac¸a˜o conhecida das varia´veis apontadoras na pilha de execuc¸a˜o. I Localizac¸a˜o conhecida de apontadores em cada bloco. I Blocos de tamanho fixo ou com campos de comprimento. I Marcas de utilizac¸a˜o em cada bloco, inicialmente falsas. I Algoritmo: I Percurso ana´logo a` pre´-ordem e marcac¸a˜o a partir das varia´veis na pilha. I Percurso linear da memo´ria para coleta de blocos livres e restaurac¸a˜o das marcas. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 289 Marcac¸a˜o e coleta (cont.) Exemplo de situac¸a˜o inicial: I supo˜e blocos iguais I setas mais fortes: apontadores nas varia´veis na pilha de execuc¸a˜o I blocos acess´ıveis a serem marcados marcados em cor cinza f f f f f f f f f f f f Apo´s a marcac¸a˜o: f t t t f t f t t f t t Apo´s a coleta: f f f f f f f f f f f f disp c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 290 Marcac¸a˜o e coleta (cont.) I Hipo´teses simplificadoras: I tamanho fixo de registros I localizac¸a˜o conhecida dos apontadores (um vetor) I Declarac¸o˜es: typedef s t r u c t Bloco ∗ApBloco ; typedef s t r u c t Bloco { Boolean marca ; ApBloco d e s t i n o ; /∗ s e houver compactac¸ a˜o ∗/ . . . i n t numAps ; ApBloco a p o n t s [NUM MAX APONTS ] ; } Bloco ; ApBloco d i s p ; /∗ i n i c i a l m e n t e t o d o s os b l o c o s ∗/ Bloco memoria [ TAM MEM DIN ] ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 291 Marcac¸a˜o e coleta (cont.) Func¸a˜o de marcac¸a˜o: vo id Marcar ( ApBloco p ) { i n t i ; i f ( p!=NULL) { i f ( ! p−>marca ) { p−>marca = t r u e ; f o r ( i =0; i<p−>numAps ; i ++) Marcar ( p−>a p o n t s [ i ] ) ; } } } / ∗ Marcar ∗/ A func¸a˜o Marcar deve ser chamada para cada varia´vel apontadora na pilha de execuc¸a˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 292 Marcac¸a˜o e coleta (cont.) Func¸a˜o de coleta: vo id C o l e t a r ( ) { i n t i ; d i s p = NULL ; f o r ( i =0; i<TAM MEM DIN ; i ++) i f ( memoria [ i ] . marca ) /∗ em uso ∗/ memoria [ i ] . marca = f a l s e ; e l s e { /∗ i n s e r e na l i s t a d i s p o n ı´ v e l ∗/ memoria [ i ] . a p o n t s [ 0 ] = d i s p ; d i s p = &(memoria [ i ] ) ; } } /∗ C o l e t a r ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 293 Marcac¸a˜o e compactac¸a˜o I Hipo´teses I Localizac¸a˜o conhecida das varia´veis apontadoras na pilha de execuc¸a˜o. I Localizac¸a˜o conhecida de apontadores em cada bloco. I Blocos de tamanho fixo ou com campos de comprimento. I Marcas de utilizac¸a˜o em cada bloco, inicialmente falsas. I Algoritmo: I Percurso ana´logo a` pre´-ordem e marcac¸a˜o a partir das varia´veis na pilha. I Ca´lculo dos novos enderec¸os dos blocos. I Atualizac¸a˜o dos campos apontadores. I Compactac¸a˜o (co´pia). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 294 Marcac¸a˜o e compactac¸a˜o (cont.) Exemplo de situac¸a˜o inicial: I supo˜e blocos iguais I setas mais fortes: apontadores nas varia´veis na pilha de execuc¸a˜o I blocos acess´ıveis a serem marcados marcados em cor cinza f f f f f f f f f f f f Apo´s a marcac¸a˜o: f t t t f t f t t f t t Apo´s o ca´lculo dos novos enderec¸os (tracejados): f t t t f t f t t f t t c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 295 Marcac¸a˜o e compactac¸a˜o (cont.) Apo´s o ca´lculo dos novos enderec¸os (tracejados): f t t t f t f t t f t t Apo´s a atualizac¸a˜o dos apontadores, inclusive os da pilha: f t t t f t f t t f t t Apo´s a compactac¸a˜o: f f f f f f f f f f f f disp A varia´vel disp aponta para o in´ıcio da a´rea cont´ıgua liberada pela operac¸a˜o de compactac¸a˜o (na˜o e´ necessa´rio usar uma lista ligada). c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 296 Marcac¸a˜o e compactac¸a˜o (cont.) I Sa˜o adotadas as mesmas hipo´teses do caso de marcac¸a˜o e coleta. I A func¸a˜o marcar e´ a mesma. I Func¸a˜o de ca´lculo dos novos enderec¸os: vo id C a l c u l a r D e s t i n o ( ) { i n t i , j = 0 ; f o r ( i =0; i<TAM MEM DIN ; i ++) i f ( memoria [ i ] . marca ) { memoria [ i ] . d e s t i n o = &(memoria [ j ] ) ; j ++; } d i s p = &(memoria [ j ] ) ; /∗ p r i m e i r o b l o c o l i v r e ∗/ } /∗ C a l c u l a r D e s t i n o ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 297 Marcac¸a˜o e compactac¸a˜o (cont.) Func¸a˜o de atualizac¸a˜o dos apontadores: vo id A t u a l i z a ( ) { i n t i , j = 0 ; f o r ( i =0; i<TAM MEM DIN ; i ++) i f ( memoria [ i ] . marca ) f o r ( j =0; j<memoria [ i ] . numAps ; j ++) { memoria [ i ] . a p o n t s [ j ] = ( memoria [ i ] . a p o n t s [ j ])−> d e s t i n o ; } } /∗ A t u a l i z a ∗/ Devem ser atualizadas tambe´m todas as varia´veis apontadoras na pilha de execuc¸a˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 298 Marcac¸a˜o e compactac¸a˜o (cont.) Func¸a˜o de compactac¸a˜o: vo id Move ( ) { i n t i ; f o r ( i =0; i<TAM MEM DIN ; i ++) i f ( memoria [ i ] . marca ) { memoria [ i ] . marca = f a l s e ; ∗( memoria [ i ] . d e s t i n o ) = memoria [ i ] ; } } /∗ Move ∗/ Adaptac¸a˜o para blocos de tamanho varia´vel: introduzir o campo tamanho em cada bloco e adaptar as func¸o˜es. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 299 Contagem de refereˆncias I As te´cnicas de coleta de lixo (marcac¸a˜o e coleta ou compactac¸a˜o) encontram e liberam toda a memo´ria dispon´ıvel de uma vez. I O processo pode ser bastante demorado, com tempo de execuc¸a˜o proporcional ao tamanho total da memo´ria dinaˆmica. I A execuc¸a˜o da coleta de lixo interrompe o processo em curso; esta interrupc¸a˜o pode demorar mais do que seria aceita´vel am algumas aplicac¸o˜es. I Dependendo da complexidade das estruturas de dados criadas pelo programa, a fase de marcac¸a˜o pode exigir memo´ria adicional aprecia´vel para manter a pilha de execuc¸a˜o. I A te´cnica de contagem de refereˆncias tem a caracter´ıstica de, em geral, distribuir o tempo de gerenciamento de memo´ria ao longo da execuc¸a˜o normal do programa. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 300 Contagem de refereˆncias (cont.) I Cada bloco alocado possui um campo inteiro refs contendo o nu´mero de varia´veis (normais ou dinaˆmicas) que apontam para o bloco. I Durante a alocac¸a˜o de um bloco, o seu campo refs recebe o valor inicial 1. I Toda varia´vel ou campo apontador, antes de ser atribu´ıdo, recebe o valor NULL. I Todo comando de atribuic¸a˜o que envolve apontadores e´ implementado pela func¸a˜o AtrbuiApont(ApBloco *p, ApBloco q): typedef s t r u c t Bloco ∗ApBloco ; typedef s t r u c t Bloco { i n t r e f s ; . . . i n t numAps ; ApBloco a p o n t s [NUM MAX APONTS ] ; } Bloco ; vo id A t r i b u i A p o n t ( ApBloco ∗p , ApBloco q ) { i f ( q!=NULL) ( q−>r e f s )++; i f ( (∗ p )!=NULL) { ( (∗ p)−> r e f s )−−; i f ( ( (∗ p)−> r e f s )==0) D e s a l o c a R e f s (∗p ) ; } ∗p = q ; } c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 301 Contagem de refereˆncias (cont.) I A func¸a˜o DesalocaRefs(p): I desaloca o bloco apontado por p I decrementa os contadores dos blocos referidos em p I caso algum destes contadores torne-se nulo, a func¸a˜o e´ chamada recursivamente I Problemas: I dependendo das estruturas de dados, o tempo de execuc¸a˜o de comando de atribuic¸a˜o entre apontadores e´ imprevis´ıvel devido a` recurisividade da func¸a˜o DesalocaRefs I o me´todo, como exposto, na˜o funciona para estruturas com circularidades; exemplo: p 2 1 1 1 1 apo´s a atribuic¸a˜o p = NULL: p 1 1 1 1 1 Os no´s da lista na˜o seriam liberados. Alguns sistemas utilizam um esquema misto: contagem de refereˆncias e coleta de lixo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Gerenciamento de memo´ria 302 Abstrac¸a˜o de Dados e Objetos c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 303 Tipos abstratos de dados I Um tipo abstrato de dados (TAD) e´ constitu´ıdo por um conjunto de valores e um conjunto de operac¸o˜es sobre estes valores. I Os valores possuem uma representac¸a˜o e podem ser muito simples (inteiros, bytes, ...) ou bastante complexos (pilhas, a´rvores, ...). I Exemplo de especificac¸a˜o de um TAD Figura atrave´s de declarac¸o˜es em C: typedef vo id ∗ F i g u r a ; F i g u r a R e ta n g u l o ( f l o a t a l t , f l o a t l a r g ) ; F i g u r a C i r c u l o ( f l o a t r a i o ) ; F i g u r a Quadrado ( f l o a t l a d o ) ; f l o a t Area ( F i g u r a f i g ) ; vo id T r a n s l a d a r ( F i g u r a f i g , f l o a t dx , f l o a t dy ) ; vo id Desenhar ( F i g u r a f i g ) ; I A espoecificac¸a˜o de um tipo como “void ∗” e´ uma te´cnica comum em C para “esconder” a implementac¸a˜o. I Normalmente, estas declarac¸o˜es, chamadas a`s vezes de interface ou API (Application Programming Interface) estariam num arquivo denominado figuras.h. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 304 Tipos abstratos de dados (cont.) I Usando a especificac¸a˜o, e´ poss´ıvel escrever programas que utilizam o TAD, mesmo sem completar a sua implementac¸a˜o. I Exemplo de utilizac¸a˜o do TAD Figura: #i n c l u d e ” f i g u r a s . h” i n t main ( ) { F i g u r a c = C i r c u l o ( 1 0 . 0 ) ; F i g u r a r = R e t an g u lo ( 1 0 . 0 , 2 0 . 0 ) ; F i g u r a q = Quadrado ( 5 0 . 0 ) ; T r a n s l a d a r ( r , 5 . 0 , 8 . 0 ) ; Desenhar ( q ) ; p r i n t f ( ”%f \n” , Area ( c ) ) ; p r i n t f ( ”%f \n” , Area ( r ) ) ; p r i n t f ( ”%f \n” , Area ( q ) ) ; r e t u r n 0 ; } /∗ main ∗/ I As func¸o˜es Circulo, Retangulo e Quadrado devem construir e devolver as representac¸o˜es dos valores correspondentes (construtores). I A func¸a˜o main poderia estar num arquivo denominado main.c. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 305 Tipos abstratos de dados (cont.) I A implementac¸a˜o de um TAD depende de va´rios fatores, mas deve seguir sempre a sua especificac¸a˜o. I Exemplo de declarac¸o˜es “naturais” para implementar o TAD Figura: typedef enum { RETANGULO, CIRCULO , QUADRADO } FormaFigura ; typedef s t r u c t { FormaFigura forma ; f l o a t posx , posy ; union { s t r u c t { f l o a t a l t , l a r g ; } l a d o s ; f l o a t r a i o ; } dados ; } RegFigura , ∗ F i g u r a ; Figura forma posx posy ? ? Retangulo forma posx posy 0 alt larg lados Circulo forma posx posy 1 raio ? Quadrado forma posx posy 2 alt larg lados I Deve-se notar a diferenc¸a entre os tipos Figura e Figura. I Normalmente, estas declarac¸o˜es (e as seguintes) estariam num arquivo figuras.c. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 306 Tipos abstratos de dados (cont.) Declarac¸o˜es dos construtores: F i g u r a R e ta n g u l o ( f l o a t a l t , f l o a t l a r g ) { F i g u r a f = m a l l o c ( s i z e o f ( R e g F i g u r a ) ) ; f−>forma = RETANGULO; f−>posx = 0 . 0 ; f−>posy = 0 . 0 ; f−>dados . l a d o s . a l t = a l t ; f−>dados . l a d o s . l a r g = l a r g ; r e t u r n f ; } /∗ R et a n gu l o ∗/ F i g u r a C i r c u l o ( f l o a t r a i o ) { F i g u r a f = m a l l o c ( s i z e o f ( R e g F i g u r a ) ) ; f−>forma = CIRCULO ; f−>posx = 0 . 0 ; f−>posy = 0 . 0 ; f−>dados . r a i o = r a i o ; r e t u r n f ; } /∗ C i r c u l o ∗/ F i g u r a Quadrado ( f l o a t l a d o ) { F i g u r a f = R et a n gu l o ( lado , l a d o ) ; f−>forma = QUADRADO; r e t u r n f ; } /∗ Quadrado ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 307 Tipos abstratos de dados (cont.) Declarac¸o˜es das func¸o˜es: f l o a t Area ( F i g u r a f i g ) { F i g u r a f = f i g ; switch ( f−>forma ) { case RETANGULO: case QUADRADO: r e t u r n ( f−>dados . l a d o s . a l t )∗ ( f−>dados . l a d o s . l a r g ) ; case CIRCULO : r e t u r n PI ∗( f−>dados . r a i o )∗ ( f−>dados . r a i o ) ; d e f a u l t : e x i t ( 1 ) ; /∗ I m p o s s ı´ v e l ∗/ } } /∗ Area ∗/ vo id T r a n s l a d a r ( F i g u r a f i g , f l o a t dx , f l o a t dy ) { F i g u r a f = f i g ; f−>posx += dx ; f−>posy += dy ; } /∗ T r a n s l a d a r ∗/ vo id Desenhar ( F i g u r a f ) { /∗ Na˜o f o i implementada ∗/ } /∗ Desenhar ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 308 Tipos abstratos de dados (cont.) I Nesta implementac¸a˜o do TAD Figura, a estrutura de dados que implementa o tipo e as func¸o˜es sa˜o implementadas separadamente. I E´ poss´ıvel mudar a implementac¸a˜o de maneira que as func¸o˜es passem fazer parte da pro´pria estrutura de dados – uma caracter´ıstica de objetos; neste caso sa˜o denominados me´todos. I Nesta nova implementac¸a˜o do exemplo, por simplicidade, a te´cnica sera´ aplicada somente a` func¸a˜o Area, mas poderia ser estendida a`s outras func¸o˜es. I Trata-se de uma nova implementac¸a˜o da mesma interface; consequentemente os arquivos figuras.h (repetido abaixo) e main.c permanecem iguais. typedef vo id ∗ F i g u r a ; F i g u r a R e ta n g u l o ( f l o a t a l t , f l o a t l a r g ) ; F i g u r a C i r c u l o ( f l o a t r a i o ) ; F i g u r a Quadrado ( f l o a t l a d o ) ; f l o a t Area ( F i g u r a f i g ) ; vo id T r a n s l a d a r ( F i g u r a f i g , f l o a t dx , f l o a t dy ) ; vo id Desenhar ( F i g u r a f i g ) ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 309 Tipos abstratos de dados (cont.) Declarac¸a˜o de Figura com um me´todo: typedef f l o a t f u n c A r e a ( F i g u r a ) ; /∗ t i p o f un c¸ a˜ o ∗/ typedef enum { RETANGULO, CIRCULO , QUADRADO } FormaFigura ; typedef s t r u c t { FormaFigura forma ; f l o a t posx , posy ; f u n c A r e a ∗Area ; /∗ apontador para f u n c¸ a˜o ∗/ union { s t r u c t { f l o a t a l t , l a r g ; } l a d o s ; f l o a t r a i o ; } dados ; } RegFigura , ∗ F i g u r a ; c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 310 Tipos abstratos de dados (cont.) Func¸o˜es do tipo funcArea: f l o a t AreaRetangu lo ( F i g u r a f i g ) { F i g u r a f = f i g ; r e t u r n ( f−>dados . l a d o s . a l t )∗ ( f−>dados . l a d o s . l a r g ) ; } /∗ AreaRetangu lo ∗/ f l o a t A r e a C i r c u l o ( F i g u r a f i g ) { F i g u r a f = f i g ; r e t u r n PI ∗( f−>dados . r a i o )∗ ( f−>dados . r a i o ) ; } /∗ A r e a C i r c u l o ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 311 Tipos abstratos de dados (cont.) Declarac¸o˜es dos construtores: F i g u r a R e ta n g u l o ( f l o a t a l t , f l o a t l a r g ) { F i g u r a f = m a l l o c ( s i z e o f ( R e g F i g u r a ) ) ; f−>forma = RETANGULO; f−>posx = 0 . 0 ; f−>posy = 0 . 0 ; f−>Area = AreaRetangu lo ; f−>dados . l a d o s . a l t = a l t ; f−>dados . l a d o s . l a r g = l a r g ; r e t u r n f ; } /∗ R et a n gu l o ∗/ F i g u r a C i r c u l o ( f l o a t r a i o ) { F i g u r a f = m a l l o c ( s i z e o f ( R e g F i g u r a ) ) ; f−>forma = CIRCULO ; f−>posx = 0 . 0 ; f−>posy = 0 . 0 ; f−>Area = A r e a C i r c u l o ; f−>dados . r a i o = r a i o ; r e t u r n f ; } /∗ C i r c u l o ∗/ F i g u r a Quadrado ( f l o a t l a d o ) { F i g u r a f = R e ta n g u l o ( lado , l a d o ) ; f−>forma = QUADRADO; r e t u r n f ; } /∗ Quadrado ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 312 Tipos abstratos de dados (cont.) Declarac¸o˜es das func¸o˜es: f l o a t Area ( F i g u r a f i g ) { r e t u r n ( ( F i g u r a ) f i g )−>Area ( f i g ) ; } vo id T r a n s l a d a r ( F i g u r a f i g , f l o a t dx , f l o a t dy ) { F i g u r a f = f i g ; f−>posx += dx ; f−>posy += dy ; } /∗ T r a n s l a d a r ∗/ vo id Desenhar ( F i g u r a f i g ) { /∗ Na˜o f o i implementada ∗/ } /∗ Desenhar ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 313 Objetos I O exemplo anterior demonstra que e´ poss´ıvel simular, dentro de algumas limitac¸o˜es, a implementac¸a˜o de objetos numa linguagem que na˜o incorpora este conceito. I Ha´ va´rios aspectos que ficam a cargo do pro´prio programador, especialmente a consisteˆncia de tipos, fonte comum de erros. I O exemplo anterior sera´ transformado de maneira a ilustrar a implementac¸a˜o de objetos numa linguagem que possui este conceito. I Sera´ usada uma linguagem fict´ıcia, uma extensa˜o simples de C. I Na˜o sera˜o tratados va´rios aspectos como por exemplo polimorfismo, visibilidade etc. I Exemplo de hierarquia das classes: Figura C´ırculo Retaˆngulo Quadrado c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 314 Objetos (cont.) c l a s s F i g u r a { f l o a t posx , posy ; /∗ na˜o e x i s t e c o n s t r u t o r ∗/ f l o a t Area ( ) { } ; void Desenhar ( ) { } ; f l o a t T r a n s l a d a r ( f l o a t dx , dy ) { t h i s . posx += dx ; t h i s . posy += dy ; } } /∗ F i g u r a ∗/ posx posy 0 1 2 3 (Classe pai) Area (Figura) Desenhar (Figura) Transladar (Figura) Todos os objetos de uma classe apontam para a mesma tabela de me´todos. Pode haver mais informac¸o˜es. Neste exemplo, todas as func¸o˜es foram transformadas em me´todos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 315 Objetos (cont.) c l a s s R et an gu l o e x t e n d s F i g u r a { f l o a t a l t , l a r g ; R et an g u l o ( f l o a t a , f l o a t l ) { t h i s . a l t = a ; t h i s . l a r g = l ; t h i s . posx = 0 . 0 ; t h i s . posy = 0 . 0 ; } f l o a t Area ( ) { return a l t ∗ l a r g ; } void Desenhar ( ) { . . . } ; R et an g u l o G i r a r 9 0 ( ) { return new R e ta ng u l o ( t h i s . l a r g , t h i s . a l t ) ; } } /∗ R et an g u l o ∗/ posx posy alt larg 4 0 1 2 3 Classe Figura Area (Retangulo) Desenhar (Retangulo) Transladar (Figura) Girar90 (Retangulo) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 316 Objetos (cont.) c l a s s Quadrado e x t e n d s R et a ng u l o { Quadrado ( f l o a t l ) { s u p e r ( l , l ) ; } } /∗ R et an g u l o ∗/ posx posy alt larg 4 0 1 2 3 Classe Retaˆngulo Area (Retangulo) Desenhar (Retangulo) Transladar (Figura) Girar90 (Retangulo) Somente o construtor e´ diferente da classe Retangulo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 317 Objetos (cont.) c l a s s C i r c u l o e x t e n d s F i g u r a { f l o a t r a i o ; C i r c u l o ( f l o a t r ) { t h i s . posx = 0 . 0 ; t h i s . posy = 0 . 0 ; t h i s . r a i o = r ; } f l o a t Area ( ) { return PI∗ s q r ( r a i o ) ; } void Desenhar ( ) { . . . } ; void D u p l i c a r ( ) { t h i s . r a i o = 2 . 0∗ t h i s . r a i o ; } } /∗ R et an g u l o ∗/ posx posy raio 4 0 1 2 3 Classe Figura Area (Circulo) Desenhar (Circulo) Transladar (Figura) Duplicar (Circulo) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 318 Objetos (cont.) Representac¸a˜o de todas as classes: 0 1 2 3 (Classe pai) Area (Figura) Desenhar (Figura) Transladar (Figura) 4 0 1 2 3 Area (Retangulo) Desenhar (Retangulo) Transladar (Figura) Girar90 (Retangulo) 4 0 1 2 3 Area (Retangulo) Desenhar (Retangulo) Transladar (Figura) Girar90 (Retangulo) 4 0 1 2 3 Area (Circulo) Desenhar (Circulo) Transladar (Figura) Duplicar (Circulo) Figura Retangulo Quadrado Circulo c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 319 Objetos (cont.) Exemplo de uso dos objetos: i n t main ( ) { F i g u r a f = new C i r c u l o ( 1 0 . 0 ) ; R et a n gu l o r = new R e t a ng u lo ( 1 0 . 0 , 2 0 . 0 ) ; Quadrado q = new Quadrado ( 5 0 . 0 ) ; C i r c u l o c = new C i r c u l o ( 3 0 . 0 ) ; p r i n t f ( ”%f \n” , f . Area ( ) ) ; p r i n t f ( ”%f \n” , r . Area ( ) ) ; c . Desenhar ( ) ; f = q ; f . T r a n s l a d a r ( 5 . 0 , 8 . 0 ) ; f . Desenhar ( ) ; p r i n t f ( ”%f \n” , f . Area ( ) ) ; /∗ comandos i n v a´ l i d o s ∗/ f . D u p l i c a r ( ) ; f . G i r a r 9 0 ( ) ; c . G i r a r 9 0 ( ) ; c = r ; q = f ; } /∗ main ∗/ Os comandos inva´lidos seriam detectados pelo compilador. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Abstrac¸a˜o de Dados e Objetos 320 Algoritmos de ordenac¸a˜o c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 321 Generalidades I Ordenac¸a˜o interna e externa I Ordenac¸a˜o o´tima por comparac¸o˜es: O(n log n) I Algoritmos por comparac¸a˜o: I transposic¸a˜o (bubblesort, quicksort) I inserc¸a˜o (inserc¸a˜o simples, shellsort) I selec¸a˜o (selec¸a˜o simples, heapsort) I intercalac¸a˜o (iterativo, recursivo) I Outros algoritmos: distribuic¸a˜o (radix sort) I Ordenac¸a˜o esta´vel: mante´m a ordem relativa dos registros de com chaves iguais. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 322 Ordenac¸a˜o o´tima por comparac¸o˜es A´rvore de decisa˜o para ordenar treˆs elementos x1, x2 e x3: 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 a´rvore tem 3! = 6 folhas (permutac¸o˜es de 3 elementos). I A altura da a´rvore e´ 3. I Portanto, o nu´mero m´ınimo de comparac¸o˜es, no pior caso, e´ 3. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 323 Ordenac¸a˜o o´tima por comparac¸o˜es (cont.) Caso geral de n elementos: I A a´rvore de decisa˜o devera´ ter n! folhas (nu´mero de permutac¸o˜es de n elementos). I Uma a´rvore de altura h tem no ma´ximo 2h folhas. I Deve-se ter, portanto: 2h ≥ n! =⇒ h ≥ dlog2(n!)e Pela aproximac¸a˜o de Stirling: dlog2(n!)e = n log2 n− n/(ln 2) + log2 n 2 + O(1) Para valores grandes de n, o primeiro termo e´ dominante: dlog2(n!)e ≈ n log2 n I O nu´mero m´ınimo de comparac¸o˜es, no pior caso, e´ O(n log2 n). I Portanto, na˜o existe nenhum algoritmo de ordenac¸a˜o mais eficiente que utiliza apenas comparac¸o˜es de elementos. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 324 Algoritmos: declarac¸o˜es comuns typedef s t r u c t Vetor { i n t n ; i n t dados [ 1 ] ; } Vetor , ∗ApVetor ; vo id t r o c a ( i n t ∗x , i n t ∗y ) { i n t t = ∗x ; ∗x = ∗y ; ∗y = t ; } /∗ t r o c a ∗/ I Os algoritmos de ordenac¸a˜o sera˜o apresentados como func¸o˜es em linguagem C que ordenam um vetor de dados que faz parte de uma estrutura denominada Vetor. I Nesta declarac¸a˜o, n denota o tamanho verdadeiro do vetor dados que dependera´ do paraˆmetro passado a` func¸a˜o malloc quando o vetor for alocado. I Va´rios algoritmos fazem trocas de valores entre elementos do vetor indicadas por chamadas da func¸a˜o troca. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 325 Algoritmo bubble sort d 0 n-1 ⇐= ij =⇒ vo id b u b b l e S o r t ( ApVetor v ) { /∗Exemplo de t r a n s p o s i c¸ a˜ o ∗/ i n t n = v−>n , i , j ; i n t ∗d = ( v−>dados ) ; f o r ( i=n−1; i >0; i−−) f o r ( j =0; j< i ; j ++) i f ( d [ j ]>d [ j +1]) t r o c a (&d [ j ] ,& d [ j + 1 ] ) ; } /∗ b u b b l e S o r t ∗/ I Os elementos entre i+ 1 e n−1 ja´ esta˜o ordenados. I Os elementos d[j] (abaixo de i) sa˜o “empurrados” se necessa´ro; o maior deles acaba em seu lugar final. I Verifica-se facilmente que o nu´mero de comparac¸o˜es executado por este algoritmo e´ sempre (n2−n)/2 (da ordem de O(n2)). I E´ um algoritmo esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 326 Inserc¸a˜o simples d 0 n-1 i =⇒ t vo id i n s e r c a o ( ApVetor v ) { i n t n = v−>n , i , j , t ; i n t ∗d = ( v−>dados ) ; f o r ( i =0; i<n−1; i ++) { t = d [ i +1] ; j = i ; whi le ( ( j>=0)&&(t<d [ j ] ) ) { d [ j +1] = d [ j ] ; j−−; } d [ j +1] = t ; } } /∗ i n s e r c a o ∗/ I Os elementos entre 0 e i ja´ esta˜o ordenados. I Os elementos menores do que d[i+1] sa˜o “empurrados” a` direita e d[i+1] inserido no seu lugar. I No pior caso, O(n2) comparac¸o˜es; no melhor caso, O(n). I Um bom algoritmo se os dados ja´ esta˜o parcialmente ordenados. I E´ um algoritmo esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 327 Selec¸a˜o simples d 0 n-1 i =⇒ p vo id s e l e c a o ( ApVetor v ) { i n t n = v−>n , i , j , p ; i n t ∗d = ( v−>dados ) ; f o r ( i =0; i<n−1; i ++) { p = i ; f o r ( j=i +1; j<n ; j ++) i f ( d [ j ]<d [ p ] ) p = j ; t r o c a (&d [ i ] ,& d [ p ] ) ; } } /∗ s e l e c a o ∗/ I Os elementos entre 0 e i−1 ja´ esta˜o ordenados. I O elemento m´ınimo entre as posic¸o˜es i e n−1 (d[p]) troca de lugar com o elemento d[i]. I O nu´mero de comparac¸o˜es e´ sempre da ordem de O(n2). I E´ um algoritmo esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 328 Algoritmo Quicksort I Quicksort foi idealizado por C. A. R. Hoare em 1962. I E´ um algoritmo recursivo que ordena segmentos do vetor dado. I A ordenac¸a˜o do vetor inteiro e´ realizada atrave´s da chamada de uma func¸a˜o auxiliar com argumentos que cobrem o vetor: vo id q u i c k S o r t ( ApVetor v ) { q u i c k S o r t A u x ( v , 0 , ( v−>n )−1); } /∗ q u i c k S o r t ∗/ I A func¸a˜o auxiliar quickSortAux implementa de fato o algoritmo. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 329 Algoritmo Quicksort (cont.) vo id q u i c k S o r t A u x ( ApVetor v , i n t esq , i n t d i r ) { /∗ supo˜e esq<=d i r ∗/ i n t ∗d = ( v−>dados ) ; i n t i = esq , j = d i r ; i n t p i v o t = d [ ( i n t ) ( ( esq+d i r ) / 2 ) ] ; /∗ p a r t i c i o n a ∗/ do { whi le ( d [ i ]< p i v o t ) i ++; whi le ( d [ j ]> p i v o t ) j−−; i f ( i<=j ) { t r o c a (&d [ i ] ,& d [ j ] ) ; i ++; j−−; } } whi le ( i<=j ) ; /∗ ordena ∗/ i f ( esq<j ) q u i c k S o r t A u x ( v , esq , j ) ; i f ( d i r> i ) q u i c k S o r t A u x ( v , i , d i r ) ; } /∗ q u i c k S o r t A u x ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 330 Algoritmo Quicksort (cont.) do { w h i l e ( d [ i ]<p i v o t ) i ++; w h i l e ( d [ j ]>p i v o t ) j−−; i f ( i<=j ) { t r o c a (&d [ i ] ,& d [ j ] ) ; i ++; j−−; } } w h i l e ( i<=j ) ; i f ( esq<j ) q u i c k S o r t A u x ( v , esq , j ) ; i f ( d i r>i ) q u i c k S o r t A u x ( v , i , d i r ) ; I In´ıcio do particionamento: d 0 n-1esq dir i =⇒ ⇐= j p (pivot) I Situac¸a˜o gene´rica apo´s uma troca: d 0 n-1esq diri j ≤p ≥p≥p ≤p c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 331 Algoritmo Quicksort (cont.) do { w h i l e ( d [ i ]<p i v o t ) i ++; w h i l e ( d [ j ]>p i v o t ) j−−; i f ( i<=j ) { t r o c a (&d [ i ] ,& d [ j ] ) ; i ++; j−−; } } w h i l e ( i<=j ) ; i f ( esq<j ) q u i c k S o r t A u x ( v , esq , j ) ; i f ( d i r>i ) q u i c k S o r t A u x ( v , i , d i r ) ; I Situac¸a˜o apo´s uma troca: d 0 n-1esq diri j ≤p ≥p≥p ≤p I Situac¸a˜o quando termina o particionamento: d 0 n-1esq dirij ≤p ≥p Pode haver apenas um ou nenhum elemento entre j e i. Se houver, ele e´ necessariamente igual ao pivoˆ e esta´ na sua posic¸a˜o final. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 332 Algoritmo Quicksort (cont.) do { w h i l e ( d [ i ]<p i v o t ) i ++; w h i l e ( d [ j ]>p i v o t ) j−−; i f ( i<=j ) { t r o c a (&d [ i ] ,& d [ j ] ) ; i ++; j−−; } } w h i l e ( i<=j ) ; i f ( esq<j ) q u i c k S o r t A u x ( v , esq , j ) ; i f ( d i r>i ) q u i c k S o r t A u x ( v , i , d i r ) ; I Situac¸a˜o quando termina o particionamento: d 0 n-1esq dirij ≤p ≥p I Situac¸a˜o apo´s as chamadas recursivas – o segmento esta´ ordenado: d 0 n-1esq dir c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 333 Algoritmo Quicksort (cont.) I Escolha do pivoˆ: I em princ´ıpio, o algoritmo funciona com qualquer valor do pivoˆ I o ideal seria um pivoˆ que particiona o segmento em duas partes de comprimentos iguais I algumas implementac¸o˜es utilizam a me´dia de alguns poucos elementos I na implementac¸a˜o aqui exibida foi usado o valor do elemento do meio I Eficieˆncia: I no pior caso o algoritmo realiza da ordem de O(n2) operac¸o˜es I em me´dia e no melhor caso sa˜o O(n log n) operac¸o˜es I na pra´tica sa˜o quase sempre O(n log n) operac¸o˜es I e´ o algoritmo de ordenac¸a˜o interna mais utilizado e faz parte das bibliotecas de va´rias linguagens (por exemplo, qsort em C) I Estabilidade: I sob a forma apresentada, o algoritmo na˜o e´ esta´vel I exerc´ıcios: I exibir um exemplo que demonstra a falta de estabilidade I modificar o algoritmo para que seja esta´vel c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 334 Algoritmo Quicksort (cont.) Exemplo de execuc¸a˜o do Quicksort: (< e > delimitam o segmento corrente; ∗ marca o pivoˆ) Vetor original: 07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12 ------------------------------------------------------------------------------------------------------ Pivot: 09 < * > 07 03 73 58 30 72 44 78 23 09 40 65 92 42 87 49 27 29 40 12 i j 07 03 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12 i j 07 03 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12 j i Pivot: 03 < * > 03 07 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12 j i Pivot: 07 <* > 03 07 09 58 30 72 44 78 23 73 40 65 92 42 87 49 27 29 40 12 j i c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 335 Algoritmo Quicksort (cont.) Pivot: 65 < * > 03 07 09 58 30 12 44 78 23 73 40 65 92 42 87 49 27 29 40 72 i j 03 07 09 58 30 12 44 40 23 73 40 65 92 42 87 49 27 29 78 72 i j 03 07 09 58 30 12 44 40 23 29 40 65 92 42 87 49 27 73 78 72 i j 03 07 09 58 30 12 44 40 23 29 40 27 92 42 87 49 65 73 78 72 i j 03 07 09 58 30 12 44 40 23 29 40 27 49 42 87 92 65 73 78 72 i j 03 07 09 58 30 12 44 40 23 29 40 27 49 42 87 92 65 73 78 72 j i Pivot: 23 < * > 03 07 09 23 30 12 44 40 58 29 40 27 49 42 87 92 65 73 78 72 i j 03 07 09 23 12 30 44 40 58 29 40 27 49 42 87 92 65 73 78 72 j i Pivot: 23 <* > 03 07 09 12 23 30 44 40 58 29 40 27 49 42 87 92 65 73 78 72 j i c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 336 Algoritmo Quicksort (cont.) Pivot: 29 < * > 03 07 09 12 23 27 44 40 58 29 40 30 49 42 87 92 65 73 78 72 i j 03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72 i j 03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72 j i Pivot: 27 <* > 03 07 09 12 23 27 29 40 58 44 40 30 49 42 87 92 65 73 78 72 j i Pivot: 40 < * > 03 07 09 12 23 27 29 30 58 44 40 40 49 42 87 92 65 73 78 72 i j 03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72 i=j 03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72 j i Pivot: 30 <* > 03 07 09 12 23 27 29 30 40 44 58 40 49 42 87 92 65 73 78 72 j i c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 337 Algoritmo Quicksort (cont.) Pivot: 40 < * > 03 07 09 12 23 27 29 30 40 40 58 44 49 42 87 92 65 73 78 72 i=j 03 07 09 12 23 27 29 30 40 40 58 44 49 42 87 92 65 73 78 72 j i Pivot: 44 < * > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72 i j 03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72 j i Pivot: 49 <* > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 87 92 65 73 78 72 j i Pivot: 65 < * > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 92 87 73 78 72 i=j 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 92 87 73 78 72 j i c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 338 Algoritmo Quicksort (cont.) Pivot: 73 < * > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 87 73 78 92 i j 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 87 78 92 j i Pivot: 72 <* > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 87 78 92 j i Pivot: 78 < * > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 j i Pivot: 87 <* > 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 j i ------------------------------------------------------------------------------------------------------ Resultado: 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 339 Intercalac¸a˜o iterativa (Mergesort) I O algoritmo de intercalac¸a˜o iterativa foi provavelmente um dos primeiros algoritmos de ordenac¸a˜o interna propostos: John von Neumann (1945). I O algoritmo consiste em va´rias passagens pelo vetor, intercalando segmentos consecutivos de tamanhos 1, 2, 4, 8, ..., ate´ completar o vetor. I Utiliza um vetor auxiliar; os dois vetores sa˜o usados alternadamente para guardar os resultados da intercalac¸a˜o. I Se necessa´rio, ha´ um passo adicional para copiar os resultados do vetor auxiliar para o original. I O nu´mero de comparac¸o˜es deste algoritmo e´ da ordem de O(n log n) (o´timo). I O algoritmo e´ esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 340 Intercalac¸a˜o iterativa (cont.) v→d ... 0 n-1 w→d ... v→d ... w→d ... v→d ... • • • Quando n na˜o e´ uma poteˆncia de 2, os u´ltimos segmentos de cada esta´gio podem ficar mais curtos do que os outros. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 341 Intercalac¸a˜o iterativa (cont.) vo id i n t e r c a l a I t e r a t i v o ( ApVetor v ) { /∗ Ordena de 2 em 2 , de 4 em 4 , . . . , por i n t e r c a l a c¸ a˜ o ∗/ i n t n = v−>n ; i n t td = 1 ; /∗ 1 , 2 , 4 , . . . ∗/ i n t esq , d i r , l d ; i n t tamanho = s i z e o f ( Vetor )+ s i z e o f ( i n t )∗ ( n−1); Boolean par = f a l s e ; ApVetor w = ( ApVetor ) m a l l o c ( tamanho ) ; w−>n = v−>n ; (continua) c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 342 Intercalac¸a˜o iterativa (cont.) whi le ( td<n ) { esq = 0 ; par = ! par ; do { d i r = esq+td ; l d = d i r+td ; i f ( d i r>=n ) { /∗ l a d o d i r e i t o v a z i o ∗/ d i r = n ; l d = n−1; } e l s e i f ( ld>n ) l d = n ; i f ( par ) i n t e r c a l a I t e r a t i v o A u x ( v , w, esq , d i r , l d ) ; e l s e i n t e r c a l a I t e r a t i v o A u x (w, v , esq , d i r , l d ) ; esq = d i r+td ; } whi le ( esq<n ) ; td = 2∗ td ; } i f ( par ) memcpy ( v , w, tamanho ) ; f r e e (w ) ; } /∗ i n t e r c a l a I t e r a t i v o ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 343 Intercalac¸a˜o iterativa (cont.) vo id i n t e r c a l a I t e r a t i v o A u x ( ApVetor v , ApVetor w, i n t esq , i n t d i r , i n t l d ) { /∗ I n t e r c a l a v . dados [ esq : d i r −1] e v . dados [ d i r : ld −1] em w . dados [ esq : ld −1] ∗/ i n t ∗dv = ( v−>dados ) , ∗dw = (w−>dados ) ; i n t i = esq , j = d i r , k= esq ; whi le ( ( i<d i r )&&( j<l d ) ) { i f ( dv [ i ]<=dv [ j ] ) { dw [ k ] = dv [ i ] ; i ++; } e l s e { dw [ k ] = dv [ j ] ; j ++; } k++; } whi le ( i<d i r ) { dw [ k ] = dv [ i ] ; i ++; k++; } whi le ( j<l d ) { dw [ k ] = dv [ j ] ; j ++; k++; } } /∗ i n t e r c a l a I t e r a t i v o A u x ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 344 Intercalac¸a˜o iterativa (cont.) Exemplo de execuc¸a˜o: Vetor original: 07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12 ---------------------------------------------------------------------------------------------------- td=1: | 07 49 | 58 73 | 30 72 | 44 78 | 09 23 | 40 65 | 42 92 | 03 87 | 27 29 | 12 40 | td=2: | 07 49 58 73 | 30 44 72 78 | 09 23 40 65 | 03 42 87 92 | 12 27 29 40 | td=4: | 07 30 44 49 58 72 73 78 | 03 09 23 40 42 65 87 92 | 12 27 29 40 | td=8: | 03 07 09 23 30 40 42 44 49 58 65 72 73 78 87 92 | 12 27 29 40 | td=16: | 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 | ---------------------------------------------------------------------------------------------------- Resultado: 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 345 Intercalac¸a˜o recursiva I Passos do algoritmo: I quebrar o vetor v dado em dois vetores v1 e v2, de tamanhos aproximadamente iguais I se o tamanho de v1 e´ maior que 1, ordena´-lo recursivamente I se o tamanho de v2 e´ maior que 1, ordena´-lo recursivamente I intercalar os vetores v1 e v2, deixando o resultado no vetor v original I E´ fa´cil verificar que o nu´mero de comparac¸o˜es e´ da ordem de O(n log n) (o´timo). I Se implementado corretamente, o algoritmo e´ esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 346 Intercalac¸a˜o recursiva (cont.) v→d 0 n-1 v1→d v2→d q u eb ra v1→d v2→d rec rec v→d c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 347 Intercalac¸a˜o recursiva (cont.) vo id i n t e r c a l a R e c u r s i v o ( ApVetor v ) { i n t n = v−>n ; i f ( n>1) { i n t ∗dv = v−>dados ; ApVetor v1 , v2 ; i n t i , nv1 = ( i n t ) ( n / 2 ) , nv2 = n−nv1 ; v1 = ( ApVetor ) m a l l o c ( s i z e o f ( Vetor )+ s i z e o f ( i n t )∗ ( nv1 −1)) ; v2 = ( ApVetor ) m a l l o c ( s i z e o f ( Vetor )+ s i z e o f ( i n t )∗ ( nv2 −1)) ; v1−>n = nv1 ; v2−>n = nv2 ; f o r ( i =0; i<nv1 ; i ++) ( v1−>dados ) [ i ] = dv [ i ] ; f o r ( i =0; i<nv2 ; i ++) ( v2−>dados ) [ i ] = dv [ i+nv1 ] ; i n t e r c a l a R e c u r s i v o ( v1 ) ; i n t e r c a l a R e c u r s i v o ( v2 ) ; i n t e r c a l a R e c u r s i v o A u x ( v1 , v2 , v ) ; f r e e ( v1 ) ; f r e e ( v2 ) ; } } /∗ i n t e r c a l a R e c u r s i v o ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 348 Intercalac¸a˜o recursiva (cont.) vo id i n t e r c a l a R e c u r s i v o A u x ( ApVetor u , ApVetor v , ApVetor w) { /∗ I n t e r c a l a os v e t o r e s u e v , d e i x a n d o o r e s u l t a d o em w . ∗/ i n t i = 0 , j = 0 , k ; i n t nu = u−>n , nv = v−>n , n = nu+nv ; i n t ∗du = ( u−>dados ) , ∗dv = ( v−>dados ) , ∗dw = (w−>dados ) ; f o r ( k=0; k<n ; k++) { i f ( ( i<nu)&&( j<nv ) ) { i f ( du [ i ]<=dv [ j ] ) { dw [ k ] = du [ i ] ; i ++; } e l s e { dw [ k ] = dv [ j ] ; j ++; } } e l s e { i f ( i<nu ) { dw [ k ] = du [ i ] ; i ++; } e l s e { dw [ k ] = dv [ j ] ; j ++; } } } } /∗ i n t e r c a l a R e c u r s i v o A u x ∗/ c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 349 Comparac¸a˜o dos algoritmos de ordenac¸a˜o interna Tempos em milisegundos: n Bubble Insercao Selecao Heapsort Quicksort Interc. Interc. Interc. iter. recur.1 recur.2 ------------------------------------------------------------------------------------------------- 16 (2^4) 0.005 0.003 0.003 0.004 0.003 0.005 0.005 0.004 32 (2^5) 0.009 0.004 0.007 0.004 0.005 0.005 0.010 0.006 64 (2^6) 0.031 0.009 0.016 0.009 0.009 0.014 0.021 0.010 128 (2^7) 0.106 0.030 0.050 0.017 0.016 0.016 0.053 0.018 256 (2^8) 0.404 0.106 0.179 0.039 0.035 0.033 0.107 0.046 512 (2^9) 1.685 0.450 0.674 0.085 0.074 0.072 0.218 0.083 1024 (2^10) 5.969 1.336 2.079 0.151 0.124 0.130 0.371 0.144 2048 (2^11) 21.301 5.282 8.136 0.322 0.268 0.279 0.805 0.302 4096 (2^12) 84.809 21.273 32.121 0.703 0.573 0.604 1.646 0.654 8192 (2^13) 338.462 84.498 127.803 1.510 1.233 1.290 3.570 1.404 16384 (2^14) 1351.672 340.743 514.325 3.279 2.605 2.721 7.442 2.968 32768 (2^15) 5390.648 1366.402 2054.017 7.133 5.520 5.769 15.563 6.189 65536 (2^16) 21565.843 5450.148 8213.796 15.489 11.546 12.192 32.772 13.167 131072 (2^17) 89281.419 21772.341 32872.943 33.404 24.359 26.042 68.350 27.769 I A u´ltima coluna corresponde a uma implementac¸a˜o otimizada do algoritmo de intercalac¸a˜o recursivo que evita alocac¸a˜o e liberac¸a˜o de espac¸o em cada chamada. I Desafio: programar esta versa˜o. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 350 Ordenac¸a˜o externa: intercalac¸a˜o balanceada mu´ltipla Passos do algoritmo, dado um arquivo f : I i = 1 I Enquanto ha´ dados em f : I Leia o ma´ximo nu´mero de registros de f que cabem na memo´ria num vetor v. I Ordene v usando um dos algoritmos de ordenac¸a˜o internos (por exemplo, quicksort). I Escreva o conteu´do de v em arquivo fi. I i = i+ 1 I Fac¸a a intercalac¸a˜o mu´ltipla dos arquivos f1, f2, f3, ... . Obs.: Se o nu´mero nf de arquivos fi e´ razoavelmente grande (mais que 5 a 10), pode ser usada uma fila de prioridades de tamanho nf . c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 351 Ordenac¸a˜o digital ou por distribuic¸a˜o (radix sort) I O algoritmo baseia-se em procedimentos que eram utilizados para ordenar carto˜es perfurados com ma´quinas classificadoras. I A chave de cada registro de informac¸a˜o e´ tratada como uma cadeia de caracteres (ou um nu´mero numa base conveniente b) de comprimento m. I Os registros sa˜o distribu´ıdos em b sequeˆncias, conforme o u´ltimo caractere da chave (mantendo a ordem relativa original). I As b sequeˆncias sa˜o (conceitualmente) concatenadas em ordem crescente do caractere usado na distribuic¸a˜o. I Os dois passos anteriores sa˜o repetidos para o penu´ltimo, o antepenu´ltimo, etc, caractere da chave. I Apo´s m distribuic¸o˜es, o vetor estara´ ordenado. I O nu´mero de operac¸o˜es e´ no m´ınimo da ordem de O(nm), dependendo da implementac¸a˜o. I O algoritmo e´ esta´vel. c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 352 Ordenac¸a˜o digital (cont.) Exemplo (m=2): Vetor original: 07 49 73 58 30 72 44 78 23 09 40 65 92 42 87 03 27 29 40 12 Distribuic¸~ao pelo u´ltimo dı´gito: 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 30 40 40 | | 72 92 42 12 | 73 23 03 | 44 | 65 | | 07 87 27 | 58 78 | 49 09 29 Distribuic¸~ao pelo penu´ltimo dı´gito: 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 03 07 09 | 12 | 23 27 29 | 30 | 40 40 42 44 49 | 58 | 65 | 72 73 78 | 87 | 92 Resultado: 03 07 09 12 23 27 29 30 40 40 42 44 49 58 65 72 73 78 87 92 c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o Algoritmos de ordenac¸a˜o 353 FIM c©2011 T. Kowaltowski Estruturas de Dados e Te´cnicas de Programac¸a˜o FIM 354 Introdução Bibliografia Noções de Análise de Algoritmos Execução de programas Estruturas ligadas Estruturas lineares Aplicações de pilhas Exemplos de recursão Exemplos de retrocesso Eliminação da recursão Recursão mútua: Análise sintática Árvores binárias Árvores binárias de busca Árvores do tipo B Filas de prioridade Árvores gerais Árvores digitais Listas generalizadas Espalhamento Compressão de textos Gerenciamento de memória Abstração de Dados e Objetos Algoritmos de ordenação FIM