Buscar

12_Arvore Balanceada AVL

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1
Árvore Balanceada AVL
1
Estrutura de Dados e 
Algoritmos
Prof. Cláudio Campelo, PhD
Departamento de Sistemas & Computação / UFCG
Árvore Binária
2
� Qual o tempo das operações de inserção e busca
em uma BST?
� O que acontece quando uma BST possui uma
topologia que “pesa” muito para um dos lados?
� Seria possível uma árvore se reorganizar
dinamicamente para garantir operações em tempo 
O(log n)?
8
7
6
2
1
8
7
6
2
1
2
Árvore Binária Balanceada (AVL)
3
� Origem:
� Adelson-Velskii, G.; E. M. Landis (1962). 
� "An algorithm for the organization of information". 
Proceedings of the USSR Academy of Sciences 146: 
263–266. (Russian) English translation by Myron J. 
Ricci in Soviet Math. Doklady, 3:1259–1263, 1962. 
� AVL (Adelson-Velskii e Landis)
Árvore Binária Balanceada (AVL)
4
� É uma árvore binária de busca (BST) cujo 
objetivo é remover o problema do pior caso onde 
a altura é O(n).
� Uso de invariante:
� Balanceamento: a altura das sub-árvores diferem no 
máximo em 1. 
3
Exemplo
5
Altura 
(considerando as 
folhas)
Exercício 
6
� Quais destas árvores são AVL?
42
8815
946 63
7157
27
20
42
8815
63
7157
27
20
42
8828
946 6327
4
Exercício 
7
� Quais destas árvores são AVL?
42
8815
946 63
7157
27
20
Árvore AVL
42
8815
63
7157
27
20
Não é árvore AVL!
42
8828
946 6327
Não é árvore AVL!
Árvore Binária Balanceada (AVL)
8
� Buscas, inserções e remoções possuem 
complexidade O(log n).
� Inserções e remoções podem requerer o 
rebalanceamento da árvore.
� Operações de rotação reajustam a árvore.
5
Árvore Binária Balanceada (AVL)
9
� O fator de balanceamento (FB) é dado pela 
diferença: 
FB = height(left) - height(right)
� O FB indica para onde a árvore pesa: 
� -1: a árvore pesa para a direita
� 0: não pesa pra nenhum lado
� 1 a árvore pesa para a esquerda
Exemplo
10
Fator de 
balanceamento
6
Árvore Binária Balanceada (AVL)
11
� A busca realizada em uma árvore AVL é igual a 
realizada em uma BST
Altura: Teorema
12
� A altura de uma árvore AVL com N nós internos 
sempre está entre:
log N ≤ h < 1.44.log(N + 2) – 1.328
7
Árvore Binária Balanceada (AVL)
13
� Inserções
� As inserções funcionam exatamente como na BST
� Entretanto…
� Inserções podem desbalancear a árvore!
� Como resolver?
� Usando operações de rotação
� O fator de balanceamento diz quando aplicar rotação
Árvore Binária Balanceada (AVL)
14
� Rotação
� Operação sobre árvores binarias que muda as estruturas 
sem interferir na ordem dos elementos. 
� Move um nó pra cima e um nó para baixo
� Quais os efeitos imediatos de uma rotação?
8
Árvore Binária Balanceada (AVL)
15
� Rotação
� Operação sobre árvores binárias que muda as estruturas 
sem interferir na ordem dos elementos. 
� Move um nó pra cima e um nó para baixo
� Quais os efeitos imediatos de uma rotação?
� A altura de uma sub-árvore diminui enquanto a altura da 
outra aumenta.
� Garante uma árvore próxima do preenchimento completo 
(melhor caso).
� Operações de inserção e busca em O(log n).
Árvore Binária Balanceada (AVL)
16
� Rotação
� Simples: ocorre quando um nó está desbalanceado e 
seu filho estiver inclinado no mesmo sentido (ou sem 
inclinação).
� Dupla: ocorre quando um nó estiver desbalanceado e 
seu filho estiver inclinado no sentido inverso. 
9
Rotação simples
17
Rotação simples
18
10
Rotação
19
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
Rotação
20
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
root
Q
P C
A B
11
Rotação
21
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
Pivot = Root.OS
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
root
Q
P C
A B
Rotação
22
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
12
Rotação
23
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
Rotação
24
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS
Pivot.RS = Root 
Root = Pivot 
13
Rotação
25
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
Rotação
26
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
14
Rotação
27
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
pivot
Q
P C
A B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
Rotação
28
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
Q
P
C
A
B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
pivot
15
Rotação
29
� Generalização da rotação:
� Root – nó pai das subárvores a serem rotacionadas
� Pivot – o nó que será o novo pai
� RS – filho do mesmo lado da rotação (rotation side) 
� OS – filho do lado oposto da rotação (opposite side)
� Pseudo-código:
root
Q
P
C
A
B
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
pivot
Qual a ordem de complexidade da rotação?
Rotação: análise de casos
30
� Representação
� Casos: Left-Left e Right-Right
� Resolvidos com rotação SIMPLES no sentido contrário
da inclinação
� Left-Left:raiz pesa pra esquerda e filho esquerdo pesa 
pra esquerda ou está balanceado (FB=0): rotação pra 
direita na raiz
� Right-Right: raiz pesa pra direita e filho pesa pra direita 
ou está balanceado (FB=0): rotação pra esquerda na raiz
1
0
2 -2
-1
0
0
0
2
0
-2
0
00
LL RR
16
Rotação: analise de casos
31
� Representação
� Casos: Left-Right e Right-Left
� Resolvidos rotação DUPLA seguindo o mesmo sentido do 
caso aplicando primeiro no filho e depois no pai
� Left-Right: raiz pesa pra esquerda e filho esquerdo pesa
pra direita: rotação esquerda no filho e direita no pai
� Right-Left: raiz pesa pra direita e filho direito pesa pra 
esquerda: rotação direita no filho e esquerda no pai
-1
0
2 -2
1
0
LR RL
Rotações Duplas
32
17
Operações sobre árvore AVL
33
� Inserções:
� Insere normalmente e depois reajusta a árvore (se 
necessário) para deixá-la balanceada novamente
� Remoções:
� Remove o nó normalmente como na BST depois reajusta a 
árvore (se necessário) para deixá-la balanceada novamente
� Fazem uso de rotações convenientes em nós 
desbalanceados: simples (LL,RR) ou dupla (RL, LR)
� Abordagem recursiva é mais simples para ambas as 
operações
Árvore AVL
34
� Questões de implementação
� Como seria implementada uma árvore AVL em Java?
� É possível usar herança na implementação de AVL?
18
Árvore AVL
35
� Questões de implementação
� Como seria implementada uma árvore AVL em Java?
� É possível usar herança na implementação de AVL?
public interface AVLTree<T extends Comparable<T>> 
extends BST<T>{
}
Árvore AVL
36
� Que métodos precisam ser redefinidos?
public interface AVLTreeImpl<T extends Comparable<T>> 
extends BSTImpl<T>{
public boolean isEmpty();
public int height();
public boolean search(T element);
public void insert(T element);
public T maximum();
public T minimum();
public void remove(T element);
public T[] preOrder();
public T[] order();
public T[] postOrder();
public int size();
}
19
Árvore AVL
37
� Que métodos precisam ser redefinidos?
public interface AVLTreeImpl<T extends Comparable<T>> 
extends BSTImpl<T>{
public boolean isEmpty();
public int height();
public boolean search(T element);
public void insert(T element);
public T maximum();
public T minimum();
public void remove(T element);
public T[] preOrder();
public T[] order();
public T[] postOrder();
public int size();
}
Árvore AVL
38
� Como seria a redefinição da inserção?
Insert (T element){
Insert-recursive(root,element);
}
Insert-recursive(BSTNode node, T element){
...
}
20
Árvore AVL
39
� Como seria a redefinição da inserção?
Insert-recursive(BSTNode node, T element){
if(node=NIL){
node.data = element
node.left = NIL
node.right = NIL
}else{
if(element < node.data){
Insert-recursive (node.left, element)
}else if (element > node.data){
Insert-recursive (node.right, element)
}
rebalance(node)
}
}
Árvore AVL
40
� Como seria a redefinição da remoção?
remove (T element){
BSTNode<T> found = search(element); 
remove-recursive(found);
}
Remove-recursive(BSTNode node){
...
}
21
Árvore AVL
41
� Como seria a redefinição da remoção?
Remove-recursive(BSTNode node) {
if(node != NIL){
if(node is leaf){
node = NIL
rebalanceUp(node)
}else if (node has one child){
if node != root
if(node is left child){
if(node.left != NIL)
node.left is left child of node.parent
else
node.right is left child of node.parent
else //node is right child
if(node.left != NIL)
node.left is right child of parent
else
node.right is right child of parent 
else
root is a not NIL child
rebalanceUp(node)
}else{
BSTNode sucessor = sucessor(node);
node.data = sucessor.data
Remove-recursive (sucessor);
}
}
}
Árvore AVL
42
� Como seria a redefinição da remoção?
Remove-recursive(BSTNode node) {
if(node != NIL){
if(node is leaf){
node = NIL
rebalanceUp(node)
}else if (node has one child){
if node != root 
if(node is left child){
if(node.left != NIL)
node.left is left child of node.parent
else
node.right is left child of node.parent
else //node is right child
if(node.left != NIL)
node.left is right child of parent
else
node.right is right child of parent 
else
root = not NIL child
rebalanceUp(node)
}else{
BSTNode sucessor = sucessor(node);
node.data = sucessor.data;
Remove-recursive (sucessor);
}
}
}
rebalanceUp(BSTNode<T> node) {
BSTNode parent = node.parent
while (parent != null) {
rebalance(parent);
parent = parent.parent;
}
}
22
Árvore AVL
43
� Que métodos auxilares a AVL precisa ter?
public interface AVLTreeImpl<T extends Comparable<T>> 
extends BSTImpl<T>{
public void insert(T element);
public void remove(T element);
}
Árvore AVL
44
� Que métodos auxilares a AVL precisa ter?
public interface AVLTreeImpl<T extends Comparable<T>> 
extends BSTImpl<T>{
public void insert(T element);
public void remove(T element);
private int calculateBalance(BSTNode<T> node)
private void rebalance(BSTNode<T> node)
private void rebalanceUp(BSTNode<T> node)
private void leftRotation(BSTNode<T> node)
private void rightRotation(BSTNode<T> node)
}
23
Árvore AVL
45
� Como seria o método calcular o balance de uma
árvore AVL?
int calculateBalance(BSTNode<T> node) {
if ( node != NIL )
return height (node.left) – height (node.right)
}
Árvore AVL
46
� Como seria o rebalanceamento de uma árvore?
void rebalance(BSTNode<K,V> node) {
balance = calculateBalance(node)
IF ( |balance| > 1 )
determina o caso de balanceamento
aplica a rotação adequada (LL,RR,LR,RL)
}
24
Árvore AVL
47
� Como seriam os métodos de rotação a esquerda e a 
direita?
� É só implementar o algoritmo genérico
� Uma implementação é o espelho (inverso) da outra
Pivot = Root.OS 
Root.OS = Pivot.RS 
Pivot.RS = Root 
Root = Pivot 
Referências
48
� Seção 7.4
� 1a edição

Outros materiais