algoritmos e estrutura de dados ii -...
TRANSCRIPT
Algoritmos e Estrutura de Dados II - Karina Oliveira 2
• Árvores Binárias de Busca– Objetivo da Utilização
• Minimizar o número de comparações efetuadas, no pior caso, para uma busca com chaves de probabilidades de ocorrência idênticas.
– Restrições• Aplicações estáticas ⇒ Ideal• Aplicações dinâmicas ⇒ Desaconselhável
Introdução
Algoritmos e Estrutura de Dados II - Karina Oliveira 3
Introdução• Árvores Binárias de Busca– Problema
• Sucessivas inserções e remoções de nós em uma ABB fazem com que existam diferenças sensíveis entre os níveis das suas folhas, o que acarreta grandes diferenças de desempenho no acesso às informações.
• Pior caso: Árvores assimétricas.
Algoritmos e Estrutura de Dados II - Karina Oliveira 4
8
4
2
1
Introdução• Árvores Binárias de Busca– Problema
• Pior caso: Árvores assimétricas (semelhante a uma lista linear).
Algoritmos e Estrutura de Dados II - Karina Oliveira 5
Introdução• Árvores Binárias de Busca– Alternativa
• Tornar a árvore novamente completa, tão logo tal característica seja perdida após uma inserção ou remoção.
– Problema• Alto custo de reestruturação da árvore.• Solução pouco eficiente e, às vezes, impossível.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 9
Árvores Balanceadas• Definição (Rigorosa)– Uma árvore é dita balanceada quando, para qualquer nó, as suas subárvores àesquerda e à direita possuem a mesma altura.
– Isso equivale a dizer que todas as suas folhas estão no mesmo nível.
– Ou seja, que a árvore está cheia.
Algoritmos e Estrutura de Dados II - Karina Oliveira 10
Árvores Balanceadas• Definição (Menos Rigorosa)– Uma árvore é considerada balanceada quando, para cada nó n, as alturas das subárvores à esquerda e à direita diferem, no máximo, de um.
– Essa diferença é chamada de “fator de balanceamento” do nó n• FatBal (n)
Algoritmos e Estrutura de Dados II - Karina Oliveira 11
Árvores Balanceadas• Definição (Menos Rigorosa)– Conceito introduzido em 1962 pelos matemáticos russos Adelson-Velskii e Landis.
– Conhecidas como árvores AVL.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 15
Árvores AVL• Operações Críticas– Inserção– Remoção
Algoritmos e Estrutura de Dados II - Karina Oliveira 16
Inserção em Árvores AVL• Sempre ocorre nas folhas;• Pode ocasionar: – O aumento da altura da subárvoreonde o nó foi inserido;
– A alteração dos fatores de balanceamento dos nós daquela subárvore.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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 de movimentações dos nós (Rotações).
Algoritmos e Estrutura de Dados II - Karina Oliveira 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 de balanceamento diferente de zero antes da inserção.
• Nó B: Filho de A na subárvore onde ocorreu a inserção.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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 de balanceamento diferente de zero antes da inserção.
• Nó B: Filho de A na subárvore onde ocorreu a inserção.
• Nó C: Filho de B na subárvore onde ocorreu a inserção.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
C T4
C
T1
A
T2 T3
B
T4
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 35
Inserção em Árvores AVL• Rotação Dupla à Esquerda – Observações
– Uma rotação dupla à direita é 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)
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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;
}}
}
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;
}
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 duplac = 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;
}
Algoritmos e Estrutura de Dados II - Karina Oliveira 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árvoredireita e substituir a raiz por ele.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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 de movimentações dos nós (Rotações).
Algoritmos e Estrutura de Dados II - Karina Oliveira 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 balanceamento diferente de zero antes da remoção ser efetuada.
• 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).
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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
Algoritmos e Estrutura de Dados II - Karina Oliveira 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.
Algoritmos e Estrutura de Dados II - Karina Oliveira 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