Algoritmos e Estrutura de Dados III
Árvore AVL
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
5
6
7
URI - DECC - Ciência da Computação
3
5
7
Árvores AVL
• Nome com origem em seus inventores:
– Georgii Adelson-Velsky e Yevgeniy Landis;
– Publicaram um documento chamado: "Algoritmos para
organização da informação“, em 1962;
• Uma árvore binária de pesquisa T é denominada AVL
se:
– Para todos nós de T, as alturas de suas duas subárvores diferem no máximo de uma unidade.
• Para cada inserção ou exclusão no pior caso é de O(log
n).
URI - DECC - Ciência da Computação
Como reconhecer uma árvore
desbalanceada?
• Como saber se a árvore está desbalanceada ?
– Verificando se existe algum nodo “desregulado”.
• Como saber se um nodo está desregulado ?
– Subtraindo-se as alturas das suas sub-árvores.
– Fator de Balanceamento
• 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.
URI - DECC - Ciência da Computação
Fator de Balanceamento
• Fator de Balanceamento de um nó:
– dado pelo seu peso em relação a sua sub-árvore
fb = altura árvore direita – altura árvore esquerda
– O fator de balanceamento de uma folha é sempre 0
– Um nó com fator balanceado pode conter 1, 0, ou -1 em seu fator;
–
–
–
Fatbal = -1, quando a sub-árvore da esquerda é um nível mais alto que a direita.
Fatbal = 0, quando as duas sub-árvores tem a mesma altura.
Fatbal = 1, quando a sub-árvore da direita é um nível mais alto que a esquerda.
– Um nó com fator de balanceamento -2 ou 2 é considerada um árvore
não-AVL
•
requer um balanceamento por rotação ou dupla-rotação.
URI - DECC - Ciência da Computação
Propriedade da AVL
• Procurar manter todas as folhas mais ou
menos na mesma altura de forma a
respeitar o FB < 2
• Ou seja,
Para todo nó
| altura(dir) - altura(esq) | < 2
URI - DECC - Ciência da Computação
Relembrando as definições...
• Altura de uma árvore (também denominada profundidade) é a
distância entre x e o seu descendente mais afastado. Mais
precisamente, a altura de x é o número de passos do mais longo
caminho que leva de x até uma folha somando um.
– Por definição a altura de uma árvore vazia é -1
E
/
\
D
I
/
Altura de I é 2
/
B
\
G
/ \
A
Altura dessa árvore é 3
/
C
F
K
\
H
Altura de K é 1
/
J
Altura de J é 0
URI - DECC - Ciência da Computação
Exemplos de cálculos de FB
0
+6
4
Inserção: 1, 2, 3, 4, 5, 6 e 7
1
+5
2
+4
3
+3
4
1
+2
5
Inserção: 4, 2, 3, 6, 5, 1 e 7
0
0
2
6
0
0
0
0
3
5
7
+1
6
0
-1 Inserção: 4, 1, 3, 6, 5, 2 e 7
7
4
0
+2
6
1
-1
3
0
0
5
0
2
URI - DECC - Ciência da Computação
7
Operação: Inserção
Inserção: 4, 6, 1, 7, 5, 3 e 2.
-1
0
4
+2
3
0
1
2
6
-1
3
0
Op. de balanceamento
1
0
0
1
5
7
0
0
0
2
0
1
2
0
Altura
Fb
URI - DECC - Ciência da Computação
4
0
0 0
3
5
6
0
7
Operação: Remoção
Inserção: 4, 6, 2 e 7.
+1
4
Remover nó 2
0
+1
2
6
2
0
1
0
7
4
+2
Op. de balanceamento
6
6
+1
0
4
7
0
0
0
Altura
Fb
URI - DECC - Ciência da Computação
7
0
Operações
– Adição e exclusão requerem que a árvore
esteja balanceada, se a árvore não estiver
balanceada é necessário seu balanceamento
• através da rotação ou dupla-rotação.
URI - DECC - Ciência da Computação
Rotação
• A operação básica em uma árvore AVL geralmente
envolve os mesmos algoritmos de uma árvore de busca
binária desbalanceada.
• A rotação na árvore AVL ocorre devido ao seu
desbalanceamento
– uma rotação simples ocorre quando um nó está
desbalanceado e seu filho estiver no mesmo sentido da
inclinação.
– Uma rotação-dupla ocorre quando um nó estiver
desbalanceado e seu filho estiver inclinado no sentido inverso
ao pai
URI - DECC - Ciência da Computação
Tipos de Rotações
• Rotação Simples:
– Rotação a Esquerda
– Rotação a Direita
• Rotação Dupla:
– Rotação a Esquerda
– Rotação a Direita
URI - DECC - Ciência da Computação
Dicas
a) Para identificar quando uma rotação é simples
ou dupla deve-se observar os sinais dos FBs do
nodo desbalanceado e do filho que gerou o
desbalanceamento:
• Sinal for igual, a rotação é simples
• Sinal for diferente a rotação é dupla
b) Se Fb for positivo (+) a rotação para à esquerda
c) Se Fb for negativa (-) a rotação para à direita
URI - DECC - Ciência da Computação
Rotação Simples à Direita
Inserção à esquerda de árvore
desbalanceada à esquerda (bal = -1)
Promover o elemento do meio através
de um giro no sentido horário.
URI - DECC - Ciência da Computação
Rotação Simples à Esquerda
Inserção à direita de árvore
desbalanceada à direita (bal = +1)
Promover o elemento do meio através
de um giro no sentido anti-horário.
URI - DECC - Ciência da Computação
Exemplo 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
4
0 Rotação a direita (nó 8) +1
10
6
2
0
0 0
3
6
8
0
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.
URI - DECC - Ciência da Computação
Rotação Dupla à Esquerda
- Inserção do elemento 20
(rotação simples à direita + rotação simples à esquerda)
URI - DECC - Ciência da Computação
Rotação Dupla à Direita
- Inserção do elemento 20
(rotação simples à esquerda + rotação simples à direita)
URI - DECC - Ciência da Computação
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
(a)
-2
10
6
0
5
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.
URI - DECC - Ciência da Computação
Exemplo de Rotação Dupla (2/2)
-2
-2
0
0
2
4
6
8
0
(b)
6
0
4
0
8
0
5
0
10
2
+1
10
0
0
5
Logo após da rotação a esquerda: (b) rotaciona-se o nó 8 (FB = -2) na
direção oposta (direita neste caso).
URI - DECC - Ciência da Computação
Caso I: Rotação Simples
• Suponha que inserimos os números 50, 40 e 30 em uma
árvore. Obteremos então:
•
A inserção novamente produziu um desbalanceamento.
•
Neste caso, como os sinais dos FB são os mesmos, significa que precisamos fazer apenas
uma ROTAÇÃO SIMPLES à direita no nodo com FB -2.
•
No caso simétrico (nodo com FB 2) faríamos uma rotação simples à esquerda.
URI - DECC - Ciência da Computação
Caso I: Rotação Simples
•
Após a rotação simples teremos:
• A árvore está balanceada dentro das propriedades de AVL.
URI - DECC - Ciência da Computação
Exemplo:
• Considerando a árvore abaixo:
•
•
A árvore está balanceada, como podemos observar pelos Fb de cada nodo.
São dois os possíveis casos de desbalancemento
URI - DECC - Ciência da Computação
Caso II: Rotação Dupla
• Ao inserir o número 5 na árvore teremos a seguinte
árvore:
•
•
O nodo 8 fica com o FB -2 e tem um filho com FB +1. Neste caso para manter o
balanceamento devemos aplicar duas rotações, também denominada ROTAÇÃO DUPLA.
Primeiro rotaciona-se o nodo com FB 1 para a esquerda.
URI - DECC - Ciência da Computação
Caso II: Rotação Dupla
• Logo rotaciona-se o nodo que possuía FB -2 na direção
oposta, nesse caso a direita.
URI - DECC - Ciência da Computação
Caso II: Rotação Dupla
•
Os FB dos nodos voltaram a ficar dentro do esperado das árvores AVL.
•
O caso simétrico ao explicado acima acontece com os sinais de FB
trocados, ou seja, um nodo com FB +2 com um filho com FB -1. Também
utilizariamos uma rotação dupla, mas nos sentidos contrários, ou seja, o
nodo com FB -1 seria rotacionado para a direita e o nodo com FB +2 seria
rotacionado para a esquerda.
URI - DECC - Ciência da Computação
• A descrição do algoritmo em pseudo-código para
a construção de uma árvore AVL seria:
– Inserir o novo nodo normalmente
– Iniciando com o nodo pai do nodo recém-inserido, testar se a propriedade
AVL é violada no novo nodo. Temos aqui 2 possibilidades:
– A condição AVL foi violada
• Execute as operações de rotação conforme for o caso (Caso I ou Caso
II).
• Volte ao passo de Inserção.
– A condição AVL não foi violada.
– Se o nodo recém-testado não tem pai, ou seja, é o nodo raiz da árvore,
volte para inserir novo nodo.
URI - DECC - Ciência da Computação
Download

rotação simples