Árvores VL Árvores Splay Árvores Árvores de pesquisa Árvores Vermelho-Preto Árvores e Árvores Multidimensionais quaternárias k-d [Árvores para Pesquisa Lexicográfica tries multivia tries binárias PTRII] VL-1 Árvores de pesquisa equilibradas Árvore de pesquisa binária não garante acesso logarítmico Inserção e eliminação simples podem criar árvores desequilibradas Pior caso é linear: árvore degenera em lista ligada Pior caso ocorre tipicamente para inserções ordenadas Árvores equilibradas Evitam casos degenerados Garantem O(log N) para operações de inserção, remoção e pesquisa Requerem algoritmos mais elaborados para inserção e remoção ondição adicional na árvore condição de equilíbrio, garante que nenhum nó está demasiado profundo VL-2
delson-velskii e Landis, 1962 Árvores VL ondição de equilíbrio: na altura das sub-árvores de cada nó diferença de alturas não pode exceder 1 garante altura logarítmica para a árvore é simples de manter Definição Uma árvore VL é uma árvore de pesquisa binária que respeita a seguinte condição de equilíbrio: para qualquer nó da árvore, as alturas das sub-árvores esquerda e direita diferem no máximo de 1 unidade. ltura de uma árvore 1 + altura da sua sub-árvore mais alta 0 para árvore só com 1 nó -1 para árvore vazia VL-3 Número de nós na árvore VL Uma árvore VL de altura H tem pelo menos F H+3-1 nós, em que F i é o número de Fibonacci de ordem i S H : tamanho (nºde nós) da menor árvore VL de altura H (S 0 = 1, S 1 = 2) árvore mais pequena de altura H tem sub-árvores de alturas H-1 e H-2 ada sub-árvore terá, por sua vez, o número mínimo de nós para a sua altura Então será S H = S H-1 + S H-2 +1 S H = F H+3-1, por indução: S 0 =1, é F 3-1 S 1 =2, é F 4-1 Se S H-1 = F H+2-1 e S H-2 = F H+1-1, (lembrar que F 0 = 0, F 1 = 1, F i =F i-1 +F i-2 para i>1) então S H = S H-1 + S H -2 +1 = F H+2-1 + F H+1-1 +1= F H+2 + F H+1-1 = F H+3-1 (H>1) F i φ i / 5, com φ= (1+ 5)/2 1.618 (número de ouro) árvore de altura H tem no mínimo (aproximadamente) φ H+3 / 5 nós H < 1.44 log (N+2) -1.328 (não mais de arox. 44% acima da mínima, i.e., logn) VL-4
Árvores VL 8 add(5) 8 4 10 14 4 10 14 2 6 2 6 Inserção com violação da condição em 2 nós 5 Inserções e remoções podem destruir o equilíbrio de alguns dos nós da árvore Necessário verificar condição e reequilibrar se tiver sido destruída VL-5 Inserção em Árvores VL pós uma inserção, só os nós no caminho da raiz ao ponto de inserção podem ter a condição de equilíbrio alterada condição só depende das alturas das sub-árvores de um nó Para reequilibrar: subir no caminho até à raiz reequilibrar o nó mais profundo onde surge desequilíbrio toda a árvore resulta equilibrada X: nó a reequilibrar devido a inserção em 1- árvore esquerda do filho esquerdo de X 2- árvore direita do filho esquerdo de X 3- árvore esquerda do filho direito de X 4- árvore direita do filho direito de X asos 1 e 4 simétricos; casos 2 e 3 simétricos VL-6
Rotação simples aso 1 é nó mais profundo onde falha o equilíbrio sub-árvore esquerda está 2 níveis abaixo da direita não está no mesmo nível de, ou estaria desequilibrado antes da inserção não está no mesmo nível que, ou seria nó desequilibrado mais fundo VL-7 Rotação simples 8 4 10 14 2 6 4 2 8 14 1 6 10 1 Árvore resultante da rotação é VL e passam a ter sub-árvores da mesma altura nova altura da árvore resultante é igual á da árvore anterior à inserção problema fica resolvido com uma só operação VL-8
Rotação simples com filho esquerdo /** * Rotate binary tree node with left child. * For VL trees, this is a single rotation * for case 1. */ static inarynode withlefthild( inarynode ) { inarynode =.left;.left =.right;.right = ; return ; VL-9 Rotação simples com filho direito /** * Rotate binary tree node with right child. * For VL trees, this is a single rotation * for case 4. */ static inarynode withrighthild( inarynode ) { inarynode =.right;.right =.left;.left = ; return ; VL-10
Rotação simples no caso 2 aso 2 R P P Q Q R Rotação simples não resolve o desequilíbrio! sub-árvore Q está a 2 níveis de diferença de R sub-árvore Q passa a estar a 2 níveis de diferença de P VL-11 Rotação dupla no caso 2 k3 aso 2 k3 D D Uma das subárvores ou está 2 níveis abaixo de D (e só uma), a chave intermédia, fica na raiz posições de, k3 e subárvores completamente determinadas pela ordenação VL-
Rotação dupla k3 8 D 4 10 14 6 k3 4 8 14 2 6 2 5 10 D 5 Rotação dupla pode ser vista como sequência de 2 rotações simples rotação entre o filho (K1) e o neto (K2) de X (K3) rotação entre X (K3) e o seu novo filho (K2) VL-13 Rotação dupla com filho esquerdo /** * Double rotate binary tree node: first left child * with its right child; then node k3 with new * left child. * For VL trees, this is a double rotation for * case 2. */ static inarynode doublewithlefthild( inarynode k3) { k3.left = withrighthild( k3.left ); return withlefthild( k3 ); VL-14
Rotação dupla com filho direito /** * Double rotate binary tree node: first right child * with its left child; then node with new * right child. * For VL trees, this is a double rotation for * case 3. */ static inarynode doublewithrighthild(inarynode ) {.right = withlefthild(.right ); return withrighthild( ); VL-15 lgoritmo recursivo Inserção em árvore VL Inserir nó com chave X numa árvore recursivamente, inserir na subárvore conveniente de, S se a altura de S não se modifica: terminar se a altura de S é modificada: se ocorre desequilíbrio em, fazer as rotações necessárias para reequilibrar omparação de alturas para evitar o cálculo repetido de alturas de sub-árvores, pode-se manter em cada nó o resultado da comparação das alturas das sub-árvores(?) lgoritmo iterativo Especificar paragem logo que uma rotação é realizada Na prática, são usadas outras árvores binárias equilibradas (como as árvores vermelho-preto) em que a inserção ou remoção e a correspondente reposição do equilíbrio se podem fazer mais eficientemente numa única passagem VL-