Classificação e Pesquisa Árvores Prof. Rodrigo Rocha prof.rodrigorocha@yahoo.com http://www.bolinhabolinha.com Onde Estamos Ementa Pesquisa de Dados Seqüencial Binária Métodos de ordenação seleção e troca distribuição inserção Intercalação Árvores Pesquisa Binária AVL Patrícia B-Tree Tabelas hash Estática e Dinâmica 1
É uma estrutura de dados hierárquica Exemplo chave de times em um campeonato árvore genealógica organograma funcional Componentes Árvores raiz (root) nó superior aresta linha que liga os nós folhas nós filhos floresta conjunto de árvores grau do nó - número de nós filhos grau da árvore - é o máximo entre os graus de seus nós Operações Árvores procura, predecessor, antecessor, mínimo, máximo, inserir e deletar Idealmente, temos Árvore balanceada» Red black, avl, b tree Altura: log n para n nós armazenamento Muito grande para RAM Parte em RAM, parte em méio magnético» Meio magnético + lento 2
Estrutura de dados: árvore cada nó tem no máximo duas sub árvores Operações procura, predecessor, antecessor, mínimo, máximo, inserir e deletar Tempo é proporcional a altura da árvore Estrututa Campo chave Campo esquerdo Campo direito P = pai Se algum filho ou pai estiver ausente, o campo conterá nulo O nó raiz é o único que contém o campo pai nulo Implementando em um vetor Array com 7 posições: Armazenamento por nível: posição do nó posição dos filhos do nó 1 2,3 2 4,5 3 6,7 i (2i,2i+1) 3
Implementando em uma estrutura campo do valor 2 ponteiros : para o filho da esquerda e direita Estrutura (exemplo) typedef struct sttno { tipo inf; struct sttno *esq, *dir; } tno; Procedimento para imprimir todos os elementos de uma árvore binária INORDER-TREE-WALK(x) if x NIL then INORDER-TREE-WALK(left[x]) print key[x] INORDER-TREE-WALK(right[x]) Complexidade ɵ(n) Pois, após a chamada ao procedimento inicial, o procedimento é chamado de forma recursiva duas vezes (filho da direita e filho da esquerda) 4
Árvore binária de pesquisa Árvore Binária de Pesquisa nós são distribuídos de forma a facilitar a pesquisa Para qualquer nó x elementos a esquerda são menores que o elemento pai elementos a direita são maiores que o elemento pai Pesquisando TREE-SEARCH(x, k) if x = NIL or k = key[x] then return x if k < key[x] then return TREE-SEARCH(left[x], k) else return TREE-SEARCH(right[x], k) Chamada inicial: TREE-SEARCH(root[T ], k). Para procurar a chave 13 15-6-7-13 5
Versão não recursiva do algoritmo ITERATIVE-TREE-SEARCH(x, k) 1 while x NIL and k key[x] 2 do if k < key[x] 3 then x left[x] 4 else x right[x] 5 return x Complexidade Relativa a altura da árvore O(altura) Se a árvore estiver balanceada para 1000 elementos, 10 comparações O (log n) Senão O (n) Máximo e mínimo valor TREE-MINIMUM(x) while left[x] = NIL do x left[x] return x TREE-MAXIMUM(x) while right[x] = NIL do x right[x] return x Complexidade O(h), onde h é a altura da árvore 6
Sucessor e Predecessor TREE-SUCCESSOR(x) if right[x] = NIL then return TREE-MINIMUM(right[x]) ( g [ else y p[x] while y = NIL and x = right[y] do x y y p[y] return y Atenção: Os algoritmos de sucessor, mínimo, máximo e predecessor não procuram pelos valores Inserção ache a folha que será inserido o nó conecte o nó ao pai da folha Algortimo TREE-INSERT (T, z) y NIL x root [T] while x NIL do y x if key [z] < key[x] then x left[x] else x right[x] p[z] y if y = NIL then root [T] z else if key [z] < key [y] then left [y] z else right [y] z Complexidade relativa a altura O(h) h=altura 7
Remoção nó sem filhos somente ajustamos o ponteiro do nó pai Remoção nó com um único filho mover o filho para a posição do nó pai 8
Remoção nó com dois filhos procuramos o sucessor (ou predecessor), que deverá ocupar o seu lugar nó mais a esquerda da sub-árvore da direita como ele não tem filhos a esquerda, a sua sub-árvore a direita pode ser movida Remoção Algoritmo TREE-DELETE (T, z) if left [z] = NIL.OR. right[z] = NIL then y z else y TREE-SUCCESSOR (z) if left [y] NIL then x left[y] else x right [y] if x NIL then p[x] p[y] if p[y] = NIL then root [T] x else if y = left [p[y]] then left [p[y]][ x else right [p[y]] x if y z then key [z] key [y] if y has other field, copy them, too return y Complexidade relativa a altura O(h) h=altura 9
Exercício Para a árvore abaixo representada, responda as seguintes questões: Número de elementos Altura Elemento Root (Pai) Elementos folhas - exercícios 1-) Desenhe a árvore de pesquisa binária, com os itens S,U,P,E,R,F,A,C,I,L. Onde cada nó tenha somente uma letra. 2-) )(1211C (12.1.1 Cormen): Trace as árvores de pesquisa binária ái de altura 2,3,4,5 e 6 sobre o conjunto de chaves {1,4,5,10,16,17,21} 3-) Para a árvore binária abaixo, mostre os elementos que serão mostrados, utilizando o algoritmo INORDER-TREE- WALK(x) 10
Exercícios 4-) Escreva o algortimo tree-predecessor. 5-) )Qual a complexidade d dos algortimos de sucessor e predecessor? Explique como você chegou nesta complexidade. Exercícios 6-) Para a seguinte árvore binária, responda as questões a-) Mostre os nós que são percorridos para achar o nó com valor 9. O que o algoritmo retornou? ) q p p q g b-) Mostre os nós que são percorridos para achar o nó com valor 8. O que o algoritmo retornou? c-) Ache o sucessor de 15. (Mostre os nós que o algoritmo percorreu) d-) Ache o sucessor de 6. (Mostre os nós que o algoritmo percorreu) e-) Ache o sucessor de 4. (Mostre os nós que o algoritmo percorreu) f-) Ache o predecessor de 6. (Mostre os nós que o algoritmo percorreu) g-) Insira o valor 19. (Mostre os nós que o algoritmo percorreu) h-) Insira o valor 1. (Mostre os nós que o algoritmo percorreu) i-) Remova o nó com valor 13. Desenhe o novo layout da árvore j-) Remova o nó com valor 6. Desenhe o novo layout da árvore 11
Exercícios 7-) (12.2.1 Cormen) Suponha que você tenha os números de 1 a 1000 em uma árvore binária de busca, e quer localizar o número 363. Qual seqüência abaixo não pode ser a seqüência de nós examinados? a-) 2, 252, 401, 398, 330, 344, 397, 363. b-) 924, 220, 911, 244, 898, 258, 362, 363. c-) 925, 202, 911, 240, 912, 245, 363. d-) 2, 399, 387, 219, 266, 382, 381, 278, 363. e-) 935, 278, 347, 621, 299, 392, 358, 363. 8-) Escreva um algoritmo que traga a soma de todos os valores de uma árvore. Qual a sua complexidade? Justifique. Animações na web Demo http://www.engin.umd.umich.edu/cis/course.des/ cis350/treetool/ http://www.cosc.canterbury.ac.nz/mukundan/dsal/ BSTNew.html htt // t b / k d /d l/ http://www.cosc.canterbury.ac.nz/mukundan/dsal/ BST.html 12
Árvore binária de pesquisa Balanceadas pela altura Árvores Balanceadas (AVL) Para cada nó na árvore, a altura das sub-árvores da direita e esquerda diferem em no máximo 1 Animações na WEB http://webpages.ull.es/users/jriera/docencia/a VL/AVL%20tree%20applet.htm http://www strille net/works/media technology http://www.strille.net/works/media_technology _projects/avl-tree_2001/ 13
B-Tree Árvores balanceadas trabalham com dispositivos secundários de armazenamento (ex. disco rígido) quando o acesso é feito em meio físico a velocidade é prejudicada devemos tentar minimizar estes acessos Cada nó tem um número variável de chaves e filhos As chaves são armazenadas em ordem crescente Cada chave tem um filho associado que é o root da sub-árvore contendo todos os nós com chave menor ou igual a chave,mas maior que a chave predecessora Um nó também tem o filho mais a direita sendo o root da subárvore contendo todas as chaves maiores que qualquer chave no nó B-Tree Fator de minimização Uma b-tree tem um número mínimo de filhos para cada nó, conhecido como fator de minimização. Se t é o fator de mínimização, cada nó deve ter pelo menos t-1 chaves Em algumas circustâncias, o nó root poderá violar esta propriedade tendo menos que t-1 chaves Cada nó pode ter no máximo 2t-1 chaves, ou, 2t filhos Quando cada nó tem um alto fator de crescimento (muitos filhos), e necessário atravessar vários nós antes de localizar a chave procurada Se o acesso ao nó requer acesso ao disco, a b-tree deverá minimizar i i estes acessos O fator de minimização é normalmente escolhido de forma que o tamanho total de cada nó corresponda a um múltiplo do tamanho do bloco no dispositivo de armazenamento Esta escolha simplifica e otimiza o acesso a disco 14
B-Tree Exemplo B-tree com fator de minimização 3 (t=3) mínimo de chaves (t-1) = 2 máximo de chaves (2t-1) = 5 máximo de filhos (2t) = 6 B-Tree B-Tree é uma estrutura de dados ideal: Situações onde todos os dados não podem residir em um único meio de armazenamento, e acessa um segundo meio de armazenamento, que são mais custosos (ou consomem mais tempo) 15
Criação A operação de criação, cria uma árvore B alocando um nó root sem valores e sendo também folha Complexidade O(1) B-Tree-Create(T) x <- Allocate-Node() leaf[x] <- TRUE n[x] <- 0 Disk-Write(x) root[t] <- x B-Tree B-Tree Pesquisa Semelhante a pesquisa em árvore binária. O filho correto é escolhido realizando uma busca linear nos valores do nó. (esquerda os menores, a direita os maiores) Depois de achado o valor maior ou igual ao valor desejado, seguimos o filho a esquerda e realizamos novamente a pesquisa Se todos os valores são menores que o procurado, o maior filho a direita e seguido Complexidade depende do tamanho da árvore. logo O(log n) B-Tree-Search(x, k) i <- 1 while i <= n[x] and k > keyi[x] do i <- i + 1 if i <= n[x] and k = keyi[x] then return (x, i) if leaf[x] then return NIL else Disk-Read(ci[x]) return B-Tree-Search(ci[x], k) Supomos que no segundo estágio, todos os nós estão armazenados em disco 16
Exemplo Pesquisando o valor 21 B-Tree B-Tree Inserção O nó apropriado para a inserção é localizado (algoritmo similar ao B- Tree-Search) A chave é inserida no nó Se o nó não está cheio, a chave é inserida sem nenhuma outra operação caso contrário, o nó deverá ser dividido para acomodar a nova chave a operação de divisão consistem em mover uma das chaves para o nó PAI, este não pode estar cheio também, caso isso ocorra, outra operação de divisão deverá ser realizada. Se cada acesso ao nó pode custar um acesso ao disco, e recomendado que o pai nunca esteja cheio. Para satisfazer essa situação, o algoritmo divide qualquer nó que estiver er cheio quando estiver er percorrendo a árvore para efetuar a inserção. As operações de divisão aumentam, mas você garante que o Pai nunca estará lotado Complexidade, desde que a operação de divisão rode em O(n), a inserção rodará em O(t log n) 17
B-Tree B-Tree-Insert(T, k) r< <- root[t] if n[r] = 2t - 1 then s <- Allocate-Node() root[t] <- s leaf[s] <- FALSE n[s] <- 0 c1 <- r B-Tree-Split-Child(s, 1, r) B-Tree-Insert-Nonfull(s, k) else B-Tree-Insert-Nonfull(r, k) B-Tree-Insert-Nonfull(x, k) i<- n[x] if leaf[x] then while i >= 1 and k < keyi[x] do keyi+1[x] <- keyi[x] i <- i - 1 keyi+1[x] <- k n[x] <- n[x] + 1 Disk-Write(x) else while i >= and k < keyi[x] do i <- i - 1 i <- i + 1 Disk-Read(ci[x]) if n[ci[x]] = 2t - 1 then B-Tree-Split-Child(x, i, ci[x]) if k > keyi[x] then i <- i + 1 B-Tree-Insert-Nonfull(ci[x], k) Divisão do nó (split) Se o nó está cheio, é necessário dividí-lo. Movemos a chave média do nó x para seu pai y Um novo nó z, torná-se o filho imediatamente a direita da chave média x que foi deslocada para o pai y e o nó original x, torná-se o filho imediatamente a esquerda da chave média que foi deslocada para y Esta operação transforma o nó com 2t-1 chaves em dois nós com t-1 chaves cada. Atenção: Somente uma chave foi movida para o pai. Complexidade d O(t), onde t é constante t B-Tree-Split-Child(x, i, y) z <- Allocate-Node() leaf[z] <- leaf[y] n[z] <- t - 1 for j <- 1 to t - 1 do keyj[z] <- keyj+t[y] if not leaf[y] then for j <- 1 to t do cj[z] <- cj+t[y] n[y] <- t - 1 for j <- n[x] + 1 downto i + 1 do cj+1[x] <- cj[x] ci+1 <- z for j <- n[x] downto i do keyj+1[x] <- keyj[x] keyi[x] <- keyt[y] n[x] <- n[x] + 1 Disk-Write(y) Disk-Write(z) Disk-Write(x) B-Tree 18
Exemplo Inserindo o valor 33, em uma árvore de faor de minimização t=3 B-Tree B-Tree Remoção 1. Se a chave não estiver numa folha, troque-a com seu sucessor imediato. 2. Elimine a chave da folha. 3. Se a folha continuar com o número mínimo de chaves, fim. 4. A folha tem uma chave a menos que o mínimo. Verifique as páginas irmãs da esquerda e direita: 4.1.se uma delas tiver mais que o número mínimo de chaves, aplique redistribuição. 4.2.senão concatene a página com uma das irmãs e a chave pai. 5. Se ocorreu concatenação, aplique passos de 3 a 6 para a página pai. 6. Se a última chave da raiz for removida, a altura da árvore diminui. Fonte: usp (http://www.icmc.sc.usp.br/manuals/sce183/btree4.html) 19
Exercícios 1-) Onde b-trees são utilizadas? Dê exemplo de aplicações que façam uso delas. 2-) (usp) Explique a seguinte sentença: "B-Trees são construídas de baixo para cima, enquanto árvores binárias são construídas de cima para baixo". 3-) Pesquise e descreva o processo de remoção. 4-) Crie uma árvore B de grau 2, com os seguintes valores {1, 2, 3, 4, 5} 5-) Para quais valores de t, a árvore B abaixo é válida.. Exercícios 6-) Para a árvore B abaixo,com t=2, responda as seguintes questões: Qual o número mínimo de itens? Qual o número máximo de itens? Quando o nó é dividido? Insira os valores 42, 8, 14 Desenhe a árvore depois da inserção 7-) Construa a b-tree com os seguintes valores. (inseridos nesta ordem) Escolha um grau para a árvore B e informe-o antes da sua construção a-) 1 12 8 2 25 5 14 28 17 7 52 16 48 68 3 26 29 53 55 45 b-) 3, 7, 9, 23, 45, 1, 5, 14, 25, 24, 13, 11, 8, 19, 4, 31, 35, 56 8-) Utilizando a árvore B criada no exercício 7a: Adicione as chaves : 2, 6,12 Remova as chaves: 4, 5, 7, 3, 14 20
Animações na web Demonstração http://slady.net/java/bt/view.php?w=600&h=450 Livro texto Bibliografia ZIVIANI, Nivio. Projeto de Algoritmos : com implementação em Pascal e C.. 2ª ed. São Paulo: Pioneira Thomson Learning, 2004. VELOSO, Paulo A. S.. Estrutura de Dados. 1ª ed. São Paulo: Campus, 1983. CORMEN, Thomas H. Algoritmos : teoria e prática. 1ª ed. Rio de Janeiro: CAMPUS, 2002. Complementar SCHILDT, Herbert. C Completo e Total. 3ª ed. São Paulo: Pearson Education, 2005. Education, 2005. CELES, Waldemar; CERQUEIRA, Renato. Introdução a Estruturas de Dados : com técnicas de programação em C. 4ª ed. Rio de Janeiro: Elsevier, 2004 WIRTH, Niklaus. Algoritmos e Estruturas de Dados. 1ª ed. Rio de Janeiro: LTC, 1989 TENENBAUM, Aaron M; SOUZA, Tereza Cristina Félix de. Estruturas de Dados usando C. 1ª ed. São Paulo: Makron Books,1995. 21