Árvores Balanceadas (AVL) Prof. Luiz José Hoffmann Filho [email protected] 1 Roteiro • Contextualização • Árvores Balanceadas (AVL) • Operações de Balanceamento 2 Roteiro • Contextualização • Árvores Balanceadas (AVL) • Operações de Balanceamento 3 Contextualização • As ABP estudadas têm uma séria desvantagem que pode afetar o tempo necessário para recuperar um item armazenado. • A desvantagem é que o desempenho da ABP depende da ordem em que os elementos são inseridos. 1, 2, 3, 4, 5, 6, 7 4, 6, 2, 5, 1, 7, 3 1 4 2 6 2 3 4 1 3 5 7 5 6 7 4 Contextualização • Idealmente, deseja-se que a árvore esteja balanceada, para qualquer nó p da árvore. • Como saber se a árvore está balanceada ? • Para cada nó p da árvore a altura da sua sae é aproximadamente igual à altura da sua sad. 5 Roteiro • Contextualização • Árvores Balanceadas (AVL) • Operações de Balanceamento 6 Árvores Balanceadas (AVL) • O nome AVL vem de seus criadores Adelson Velsky e Landis (1962). • Uma árvore binária de pesquisa T é denominada AVL se: o Para todos nós de T, as alturas de suas duas subárvores diferem no máximo de uma unidade. • Operações de consulta, inserção e remoção de nós tem custo O(log2n). 130 100 80 110 120 120 150 130 100 200 80 110 200 150 7 Como reconhecer uma árvore desbalanceada? (1/2) • Como saber se a árvore está desbalanceada ? o Verificando se existe algum nodo “desregulado”. • Como saber se um nodo está desregulado ? o Subtraindo-se as alturas das suas sub-árvores. • Por questões de eficiência, estas diferenças são pré-calculadas e armazenadas nos nós correspondentes, sendo atualizadas durante as operações. 8 Como reconhecer uma árvore desbalanceada? (2/2) • Possíveis valores de diferença para cada nó em uma árvore balanceada: -1, 0, 1. • Fator de Balanceamento (FB) de cada nó da árvore o FB(p) = h(sad(p)) – h(sae(p)) 9 Exemplos de cálculos de FB +6 Inserção: 1, 2, 3, 4, 5, 6 e 7 1 0 Inserção: 4, 2, 3, 6, 5, 1 e 7 +5 2 4 0 +4 3 +3 4 2 0 +2 5 6 6 0 0 1 +1 0 5 3 0 7 0 7 -1 Inserção: 4, 1, 3, 6, 5, 2 e 7 4 0 +2 1 6 -1 3 0 0 5 7 0 2 10 Operação: Inserção Inserção: 4, 6, 1, 7, 5, 3 e 2. -1 0 4 0 +2 1 6 -1 3 0 Op. de balanceamento 0 0 5 7 0 2 0 1 4 0 0 0 3 5 6 0 7 2 11 Operação: Remoção Inserção: 4, 6, 2 e 7. +1 4 Remover nó 2 0 +1 2 6 0 +2 0 4 Op. de balanceamento +1 6 0 6 0 0 4 7 7 7 12 Roteiro • Contextualização • Árvores Balanceadas (AVL) • Operações de Balanceamento 13 Operações de Inserção e Remoção • A inserção ou remoção de um nó em uma árvore AVL pode ou não provocar seu desbalanceamento. • Se a árvore AVL ficar desbalanceada, a restauração do seu balanceamento é realizado através de ROTAÇÕES. 14 Tipos de Rotações • Rotação Simples: o Rotação a Esquerda o Rotação a Direita • Rotação Dupla: o Rotação a Esquerda o Rotação a Direita 15 Exemplos de Rotação Simples • Suponha que nós queiramos inserir o nó 3 na árvore inicial abaixo -1 0 0 4 2 8 0 6 3 -2 0 10 8 -1 +1 2 0 4 0 0 6 4 0 Rotação a direita (nó 8) +1 10 2 0 0 0 3 8 0 6 10 3 A inserção do nó 3 produziu um desbalanço no nó 8 verificado pelo FB = -2 neste nó. Neste caso, como os sinais dos FB são os mesmos (nó 8 com FB = -2 e nó 4 com FB = -1) significa que precisamos fazer apenas uma ROTAÇÃO SIMPLES. 16 Exemplo de Rotação Dupla (1/2) • Suponha que queiramos inserir o nó 5 na árvore abaixo -2 -1 0 0 2 4 8 0 6 8 0 10 -2 +1 0 0 4 -1 2 6 0 5 (a) -2 10 0 0 2 4 6 8 0 10 0 5 Observe que o nó 8 tem FB = -2 e tem um filho com FB = +1 (sinais opostos). Neste caso, o balanceamento é alcançado com duas rotações. Primeiro: (a) rotação simples sobre o nó 4 (com FB = +1) para a esquerda. 17 Exemplo de Rotação Dupla (2/2) -2 -2 0 0 2 4 6 8 0 0 (b) 0 10 0 0 2 4 6 0 5 +1 8 0 10 5 Logo após da rotação a esquerda: (b) rotaciona-se o nó 8 (FB = -2) na direção oposta (direita neste caso). 18 Pseudo-Código: Rotações Simples • Rotação Simples a Esquerda p aponta para o nó desbalanceado q = right(p); hold = left(q); left(q) = p; right(p) = hold; p = q; 10 15 12 7 21 30 +2 10 0 +1 7 15 0 +1 12 21 0 30 • Rotação Simples a Direita p aponta para o nó desbalanceado q = left(p); hold = right(q); right(q) = p; left(p) = hold; p = q; -2 10 15 4 2 1 7 10 -1 0 4 15 -1 2 0 7 0 1 19 Pseudo-Código: Busca e Inserção • Busca e Inserção o Procurar pseudo-código no livro do Tenembaum “Estrutura de Dados Usando C”. pags: 531, 532, 533 e 534. 20 Conclusões • Balanceamento de árvores busca minimizar o número médio de comparações necessárias para localizar qualquer dado. • Operações de inserção e remoção de nós tendem a tornar as árvores desbalanceadas. • Há um custo extra de processamento. • Compensado quando os dados armazenados precisam ser recuperados muitas vezes. 21 AVL Tree Applet • http://www.qmatica.com/DataStructures/Trees/AV L/AVLTree.html • http://people.ksp.sk/~kuko/bak/ 22 Exercícios • Insira em uma árvore AVL, itens com as chaves apresentadas nos itens a seguir (na ordem em que aparecem). Desenhe a árvore resultante da inserção, sendo que uma nova árvore deve ser desenhada quando houver uma rotação. Indique qual a rotação que foi executada. a)30, 40, 24, 58, 48, 26, 11, 13, 14 b)20, 15, 25, 10, 30, 24, 17, 12, 5, 3 c) 40, 30, 50, 45, 55, 52 d)20, 15, 25, 12, 17, 24, 30, 10, 14, 13 e) 20, 15, 25, 12, 17, 30, 26 f) 35, 39, 51, 20, 13, 28, 22, 32, 25, 33 23 Exercícios • Dadas as seguintes chaves M, G, B, H, S, P, F, C como entrada (nesta ordem), desenhe a respectiva árvore AVL (balanceando-a quando for necessário). 24 Exercícios Nesta questão, você deverá executar duas inserções e duas remoções na árvore AVL acima, desenhe cada uma das operações necessárias. Insira 105 Insira 20 Remova 99 Remova 36 25