arquitetura de computadores - marcio buenoestrutura de dados ii - márcio bueno 5 introdução...
TRANSCRIPT
Algoritmos e Estrutura de Dados II
Árvore AVL
Prof Márcio [email protected] / [email protected]
Material da Profa Ana Eliza
Estrutura de Dados II - Márcio Bueno 2
• Árvores Binárias de Busca– Objetivo da Utilização
• Minimizar o número de comparaçõesefetuadas, no pior caso, para uma buscacom chaves de probabilidades deocorrência idênticas.
– Restrições• Aplicações estáticas Ideal
• Aplicações dinâmicas Desaconselhável
Introdução
Estrutura de Dados II - Márcio Bueno 3
Introdução
• Árvores Binárias de Busca– Problema
• Sucessivas inserções e remoções de nósem uma ABB fazem com que existamdiferenças sensíveis entre os níveis dassuas folhas, o que acarreta grandesdiferenças de desempenho no acesso àsinformações.
• Pior caso: Árvores assimétricas.
Estrutura de Dados II - Márcio Bueno 4
8
4
2
1
Introdução
• Árvores Binárias de Busca– Problema
• Pior caso: Árvores assimétricas (semelhante a uma lista linear).
Estrutura de Dados II - Márcio Bueno 5
Introdução
• Árvores Binárias de Busca– Alternativa
• Tornar a árvore novamente completa, tãologo tal característica seja perdida apósuma inserção ou remoção.
– Problema• Alto custo de reestruturação da árvore.
• Solução pouco eficiente e, às vezes, impossível.
Estrutura de Dados II - Márcio Bueno 6
Introdução
• Árvores Binárias de Busca Completa
– Inserir 0
8
4
1
2
3 5
6
7
12
9
10
11 13
14
Estrutura de Dados II - Márcio Bueno 7
Introdução
• Árvores Binárias de Busca Completa
– Não é mais completa!
0
8
4
1
2
3 5
6
7
12
9
10
11 13
14
Estrutura de Dados II - Márcio Bueno 8
Introdução
• Árvores Binárias de Busca Completa (e Cheia)
7
3
0
1
2 4
5
6
11
8
9
10 12
13
14
Estrutura de Dados II - Márcio Bueno 9
Árvores Balanceadas
• Definição (Rigorosa)
– Uma árvore é dita balanceada quando,para qualquer nó, as suas subárvores àesquerda e à direita possuem a mesmaaltura.
– Isso equivale a dizer que todas as suasfolhas estão no mesmo nível.
– Ou seja, que a árvore está cheia.
Estrutura de Dados II - Márcio Bueno 10
Árvores Balanceadas
• Definição (Menos Rigorosa)
– Uma árvore é considerada balanceadaquando, para cada nó n, as alturas dassubárvores à esquerda e à direitadiferem, no máximo, de um.
– Essa diferença é chamada de “fatorde balanceamento” do nó n
• FatBal (n)
Estrutura de Dados II - Márcio Bueno 11
Árvores Balanceadas
• Definição (Menos Rigorosa)
– Conceito introduzido em 1962 pelosmatemáticos russos Adelson-Velskii eLandis.
– Conhecidas como árvores AVL.
Estrutura de Dados II - Márcio Bueno 12
Árvores AVL
• Características Básicas– O fator de balanceamento deve constar em
cada nó de uma árvore AVL.
• FatBal(n) = Negativo subárvore à esquerda mais alta.
• FatBal(n) = Positivo subárvore à direita mais alta.
• FatBal(n) = Zero subárvores à esquerda e à direita com mesma altura.
Estrutura de Dados II - Márcio Bueno 13
Árvores AVL
• Exemplos de árvores balanceadas
25
10
20
30
28
0
+1 -1
0 0
25
10
5 20
30
28
0
0 -1
0 00
Estrutura de Dados II - Márcio Bueno 14
Árvores AVL
• Exemplos de árvores não balanceadas
10
5 20
30
+2
0 +2
0
25
-1
25
10
5 20
0
0 0
30
28
27
-2
-1
0
+1
Estrutura de Dados II - Márcio Bueno 15
Árvores AVL
• Operações Críticas– Inserção
– Remoção
Estrutura de Dados II - Márcio Bueno 16
Inserção em Árvores AVL
• Sempre ocorre nas folhas;
• Pode ocasionar:
– O aumento da altura da subárvore onde o nó foi inserido;
– A alteração dos fatores de balanceamento dos nós daquela subárvore.
Estrutura de Dados II - Márcio Bueno 17
Inserção em Árvores AVL
• Algoritmo de Inserção
– Efetuar a inserção;
– Ajustar os fatores de balanceamento;
– Verificar a quebra do equilíbrio;
– Se a árvore não estiver balanceada,corrigir a estrutura através demovimentações dos nós (Rotações).
Estrutura de Dados II - Márcio Bueno 18
Inserção em Árvores AVL• Rotação
– Tipos de Rotação• Simples• Dupla
– Principais nós envolvidos:• Nó A: Nó ancestral mais próximo do nó
inserido que possuía fator debalanceamento diferente de zero antes dainserção.
• Nó B: Filho de A na subárvore ondeocorreu a inserção.
Estrutura de Dados II - Márcio Bueno 19
Inserção em Árvores AVL
• Rotação Simples– Utilizada quando a inserção ocorre do “lado
de fora”.
– Dado um nó A, podemos ter:
• Caso 1: Inserção na subárvore à esquerda do filho à esquerda de A Rotação simples à direita.
• Caso 2: Inserção na subárvore à direita do filho à direita de A Rotação simples à esquerda
Estrutura de Dados II - Márcio Bueno 20
Inserção em Árvores AVL
• Rotação Simples à Direita
B
A
T2 T3T1
A
B
T2
T3
T1
OBS: O nó foi inserido na subárvore T1
Estrutura de Dados II - Márcio Bueno 21
Inserção em Árvores AVL
• Rotação Simples à Direita – Exemplo:
25
10
5 20
30
28
0
0 -1
0 00B
25
10
5 20
0
0 0
30
28
27
A-2
-1
0
+1
Estrutura de Dados II - Márcio Bueno 22
Inserção em Árvores AVL
• Rotação Simples à Direita – Exemplo:
B
25
10
5 20
0
0 0
30
28
27
A-2
-1
0
+1
25
10
5 20
0
0 0
28
27 30
0
0
00
ANTES DEPOIS
Estrutura de Dados II - Márcio Bueno 23
Inserção em Árvores AVL
• Rotação Simples à Esquerda
OBS: O nó foi inserido na subárvore T3
A
BT1
T2
T3
B
T1
A
T2T3
Estrutura de Dados II - Márcio Bueno 24
Inserção em Árvores AVL
• Rotação Simples à Esquerda – Exemplo:
25
10
20
30
28
0
+1 -1
0 0 B
25
10
20
+2
+1
30
28
22
A
-1
-1
0
0
Estrutura de Dados II - Márcio Bueno 25
Inserção em Árvores AVL
• Rotação Simples à Esquerda – Exemplo:
25
20
22
30
28
0
0 -1
0 0100
B
25
10
20
+2
+1
30
28
22
A
-1
-1
0
0
ANTES DEPOIS
Estrutura de Dados II - Márcio Bueno 26
Inserção em Árvores AVL
• Rotação Dupla– Utilizada quando a inserção ocorre do “lado
de dentro” .
– Dado um nó A, podemos ter:
• Caso 3: Inserção na subárvore à direita do filho à esquerda de A Rotação dupla à direita.
• Caso 4: Inserção na subárvore à esquerda do filho à direita de A Rotação dupla à esquerda.
Estrutura de Dados II - Márcio Bueno 27
Inserção em Árvores AVL
• Rotação Dupla
– Principais nós envolvidos:• Nó A: Nó ancestral mais próximo do nó
inserido que possuía fator debalanceamento diferente de zero antesda inserção.
• Nó B: Filho de A na subárvore ondeocorreu a inserção.
• Nó C: Filho de B na subárvore ondeocorreu a inserção.
Estrutura de Dados II - Márcio Bueno 28
Inserção em Árvores AVL
• Rotação Dupla à Direita
OBS: O nó foi inserido na subárvore de raiz C (T2 ou T3)
A
B
T1
T2 T3
C
T4
C
T1
A
T3 T4
B
T2
Estrutura de Dados II - Márcio Bueno 29
Inserção em Árvores AVL
• Rotação Dupla à Direita - Exemplo
25
10
5 20
30
27
0
0 -1
0 0 0
25
10
5 20
30
27
+1
0 -2
0 0 +1
28
A
B
0
Estrutura de Dados II - Márcio Bueno 30
Inserção em Árvores AVL
• Rotação Dupla à Direita - Exemplo
25
10
5 20
30
27
+1
0 -2
0 0 +1
28
A
B
0
0
0 0
0 0 0 0
25
10
5 20
28
27 30
Estrutura de Dados II - Márcio Bueno 31
Inserção em Árvores AVL• Rotação Dupla à Direita – Observações
– Uma rotação dupla à direita é equivalente à:1) Uma rotação simples à esquerda;
2) Uma rotação simples à direita.
25
10
5 20
30
27
+1
0 -2
0 0 +1
28
A
B
0
0
0 0
0 0 0 0
25
10
5 20
28
27 30
(1)
(2)
ANTES DEPOIS
Estrutura de Dados II - Márcio Bueno 32
Inserção em Árvores AVL
• Rotação Dupla à Esquerda
OBS: O nó foi inserido na subárvore de raiz C (T2 ou T3)
A
BT1
T2 T3
CT4
C
T1
A
T2 T3
B
T4
Estrutura de Dados II - Márcio Bueno 33
Inserção em Árvores AVL
• Rotação Dupla à Esquerda - Exemplo
10
5 20
30
+1
0 +1
0
10
5 20
30
+2
0 +2
0
25
-1
A
B
Estrutura de Dados II - Márcio Bueno 34
Inserção em Árvores AVL
• Rotação Dupla à Esquerda - Exemplo
10
5 20
30
+2
0 +2
0
25
-1
A
B
10
5 25
30
+1
0 0
0
200
ANTES DEPOIS
35
Inserção em Árvores AVL• Rotação Dupla à Esquerda – Observações
– Uma rotação dupla à esquerda é equivalente à:1) Uma rotação simples à direita;
2) Uma rotação simples à esquerda.
10
5 25
30
+1
0 0
0
200
10
5 20
30
+2
0 +2
0
25
-1
A
B
(1)
(2)
Estrutura de Dados II - Márcio Bueno
Estrutura de Dados II - Márcio Bueno 36
• Estrutura do nó de uma árvore AVLstruct avlNo{
int info;
avlNo *esq;
avlNo *dir;
int fatBal;
};
//Declaradas dentro do mainavlNo * raiz = NULL;
bool status = false;
Implementação de Árvores AVL
Estrutura de Dados II - Márcio Bueno 37
Implementação de Árvores AVL
• Criação de um nó
void createNode (avlNo * &raiz, int elem)
{
raiz = new avlNo;
raiz->info = elem;
raiz->esq = NULL;
raiz->dir = NULL;
raiz->fatBal = 0;
}
38
void insereAvl (avlNo * &raiz, int elem, bool &status) {if (raiz == NULL) {
createNode(raiz,elem);status = true;
}else if (elem == raiz->info){printf ("Elemento repetido. \n");return;
}else if (elem < raiz->info){insereAvl(raiz->esq,elem,status);if (status == true)
switch (raiz->fatBal) { case 1 : raiz->fatBal = 0; status = false; break;case 0 : raiz->fatBal = -1; break;case -1 : rotacionarDir(raiz,status); break;
}} else {
insereAvl(raiz->dir,elem,status);if (status == true)
switch (raiz->fatBal) { case -1 : raiz->fatBal = 0; status = false; break;case 0 : raiz->fatBal = 1; break;case 1 : rotacionarEsq(raiz,status); break;
}}
}
Estrutura de Dados II - Márcio Bueno
39
void rotacionarDir (avlNo * &a, bool &status) {avlNo *b, *c;b = a->esq;if (b->fatBal == -1) { // rotação simples
a->esq = b->dir;b->dir = a;a->fatBal = 0;a = b;
}else { // rotação dupla
c = b->dir;b->dir = c->esq;c->esq = b;a->esq = c->dir;c->dir = a; if (c->fatBal == -1)
a->fatBal = 1;else a->fatBal = 0;if (c->fatBal == 1)
b->fatBal = -1;else b->fatBal = 0;a = c;
}a->fatBal = 0;status = false;
}Estrutura de Dados II - Márcio Bueno
40
void rotacionarEsq (avlNo * &a, bool &status) {avlNo *b, *c;b = a->dir;if (b->fatBal == 1) { // rotação simples
a->dir = b->esq;b->esq = a;a->fatBal = 0;a = b;
}else { // rotação dupla
c = b->esq;b->esq = c->dir;c->dir = b;a->dir = c->esq;c->esq = a; if (c->fatBal == 1)
a->fatBal = -1;else a->fatBal = 0;if (c->fatBal == -1)
b->fatBal = 1;else b->fatBal = 0;a = c;
}a->fatBal = 0;status = false;
}Estrutura de Dados II - Márcio Bueno
Remoção em Árvore AVL
Parte II
Estrutura de Dados II - Márcio Bueno 42
Remoção em Árvores AVL
• Considere que o elemento a ser removido encontra-se na raiz de uma árvore T:
1) A raiz não possui filhos: remover a raiz e anular T;
2) A raiz possui um único filho: remover a raiz e substituí-la por seu filho;
3) A raiz possui dois filhos: escolher o nó que armazena o menor elemento na subárvore direita e substituir a raiz por ele.
Estrutura de Dados II - Márcio Bueno 43
Remoção em Árvores AVL
• Pode ocasionar:
– A diminuição da altura da árvore, e/ou;
– A alteração dos fatores de balanceamento de seus nós.
Estrutura de Dados II - Márcio Bueno 44
Remoção em Árvores AVL
• Algoritmo de Remoção
– Efetuar a remoção;
– Ajustar os fatores de balanceamento;
– Verificar a quebra do equilíbrio;
– Se a árvore não estiver balanceada,corrigir a estrutura através demovimentações dos nós (Rotações).
Estrutura de Dados II - Márcio Bueno 45
Remoção em Árvores AVL• Rotação
– Tipos de Rotação• Simples• Dupla
– Principais nós envolvidos:• Nó A: Nó ancestral mais próximo do ponto de
remoção que possuía fator de balanceamentodiferente de zero antes da remoção serefetuada.
• Nó B: Filho de A na subárvore de maior altura.• Nó C: Filho de B na subárvore de maior altura
(utilizado apenas em rotações duplas).
Estrutura de Dados II - Márcio Bueno 46
Remoção em Árvores AVL
• Exemplo:
5
3
1
2 4
8
6
7
119
10
0
-1 0
-1
0 00
0
0
0
-1
Remover 4
Estrutura de Dados II - Márcio Bueno 47
Rebalancear Rotação Simples à Direita
Remoção em Árvores AVL
• Exemplo:5
3
1
2
8
6
7
119
10
0
-1
-2
0 00
0
0
0
-1
A
B
5
2
31
8
6
7
119
100
0
0 00
0
0
+1
-10
Estrutura de Dados II - Márcio Bueno 48
5
2
31
8
6
7
119
100
0
0 00
0
0
+1
-10
Remover 6
Remoção em Árvores AVL
• Exemplo:
ANTES DEPOIS
5
2
31
8
7
119
100
0
0 0
0
+1
+1
00
Estrutura de Dados II - Márcio Bueno 49
Remover 7
Remoção em Árvores AVL
• Exemplo:
ANTES DEPOIS
5
2
31
8
7
119
100
0
0 0
0
+1
+1
00
5
2
31
8
119
100
0
0 0
0
+2
+1
0
Estrutura de Dados II - Márcio Bueno 50
Rebalancear Rotação Simples à Esquerda
Remoção em Árvores AVL
• Exemplo:
5
2
31
8
119
100
0
0 0
0
+2
+1
00
A
B
5
2
31
10
8
9
110
0
0
+1 0
-1
+1
0
Estrutura de Dados II - Márcio Bueno 51
Remoção em Árvores AVL
• Exemplo:Remover 3
5
2
31
10
8
9
110
0
0
+1 0
-1
+1
0
5
2
1
10
8
9
110
-1
0
+1 0
-1
+1
ANTES DEPOIS
Estrutura de Dados II - Márcio Bueno 52
Remoção em Árvores AVL
• Exemplo:Remover 2
5
2
1
10
8
9
110
-1
0
+1 0
-1
+1
ANTES DEPOIS
5
10
8
9
11
0
0
+1 0
-1
+2
1
Estrutura de Dados II - Márcio Bueno 53
Remoção em Árvores AVL
• Exemplo:
5
10
8
9
11
0
0
+1 0
-1
+2
1
A
B
C
Rebalancear Rotação Dupla à Esquerda
8
5 10
9 110 0 0
0
0
1
-1
Estrutura de Dados II - Márcio Bueno 54
Remoção em Árvores AVL
• Exemplo:
8
5 10
9 110 0 0
0
0
1
-1
Remover 1
ANTES DEPOIS
8
5 10
9 110 0
0
+1
0
Estrutura de Dados II - Márcio Bueno 55
Remoção em Árvores AVL
• Exemplo:Remover 5
ANTES DEPOIS
8
10
9 110 0
0
+28
5 10
9 110 0
0
+1
0
Estrutura de Dados II - Márcio Bueno 56
Remoção em Árvores AVL
• Exemplo:
Rebalancear Rotação Simples à Esquerda
8
10
9 110 0
0
+2 A
B8
10
9
110
0
-1
+1
Estrutura de Dados II - Márcio Bueno 57
Remoção em Árvores AVL
• Observação:
– Enquanto a inserção de uma única chave pode resultar em uma rotação de dois ou três nós no máximo, a remoção pode exigir uma rotação em cada um dos nós ao longo de toda a trajetória de busca.
– Ver exercício a seguir.
Estrutura de Dados II - Márcio Bueno 58
Remoção em Árvores AVL
• Exercício: Remover 4
5
3
2
1 4
10
8
129
11
0
+1 0
-1
0 0-1
+1
-1
+1
-1
0
7
6
Exercício
• Dada uma árvore AVL inicialmente vazia:– Insira: 50, 70, 90, 30, 10, 40, 80, 60, 75,
35, 100, 73
– Remova: 10, 70, e depois as raízes das árvores resultantes até obter novamente uma árvore vazia
Estrutura de Dados II - Márcio Bueno 59
Estrutura de Dados II - Márcio Bueno 60
Bibliografia Recomendada
• SZWARCFITER, Jayme Luiz; MARKENZON, Lilian. Estruturas de Dados e seus Algoritmos. 2. ed. rev. Rio de Janeiro: LTC, 1994.
• WIRTH, Niklaus. Algoritmos e estruturas de dados. 1. ed. Rio de janeiro: LTC, 1999.