mc-202 — unidade 10 Árvores balanceadaslehilton/mc202ef/handout-unidade10.pdf · mc-202 —...
TRANSCRIPT
MC-202 — Unidade 10Árvores Balanceadas
Lehilton Pedrosa
Instituto de Computação – Unicamp
Segundo Semestre de 2016
Roteiro
1 Introdução
2 Árvores AVL
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 2 / 20
IntroduçãoVamos inserir alguns número em uma Árvore de Busca:
1
12
12
3
12
34
12
34
5
12
34
56
12
34
56
7
A árvore virou uma lista!Problema: A busca pelo 7 tem que percorrer todos elementos!
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 3 / 20
Solução
Como diminuir o tempo de busca?Cada subárvore divida o número de elementos tanto quanto possível!Modificamos a árvore sempre que um novo elemento é inserido
Solução 1:Ao inserir um nó, calcular a árvorede altura mínima!
Busca: no máximo a altura daárvore mínima: ⌈log2(n + 1)⌉
Inserção: criar uma árvore dealtura mínima: Θ(n)
Solução 2:Árvore de altura quase mínima!
Busca: no máximo a altura daárvore: O(log2 n)
Inserção: “consertar” obalanceamento: O(log2 n)
Exemplos de árvores aproximadas: Árvore AVL, árvore rubro-negra
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 4 / 20
Árvore AVLintroduzida por Adelson-Velsky and Evgenii Landis (1962)tenta diminuir a diferença entre as alturas das subárvores
Dado um nó, o fator de balanceamento é definido como:
fb = altura da subárvore direita − altura da subárvore esquerda
DefiniçãoUma árvore de busca é chamada Árvore AVL se:
ela é vazia; ouo fator de balanceamento é −1, 0 ou 1.
Note que fb é na verdade uma diferença!
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 5 / 20
Especificação do nó
Nó de árvore AVLtypedef struct NoArv{
int chave;struct NoArv *esq, *dir;
enum { MENOS, ZERO, MAIS } fb;} *NoArv;
Em uma árvore AVL, fb só pode assumir 3 valores distintos!
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 6 / 20
Exmplos de árvores AVL
8
3 13
1 7 10
4
-
+ -
- 00
0
“quase” mínima
8
3
131
7
10
40
árvore mínima
0 0 0
0 0
0
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 7 / 20
Preliminares
12
34
56
7
12
34
56
7
fb = 6
12
34
56
7
fb = 6
1 23
45
67
fb = 6
12
34
56
7
fb = 6
12
34
56
7
fb = 4
12
34
56
7
fb = 2
12
34
56
7
fb = 0
Qual o FB do nó raiz? Como diminuí-lo?Imaginamos um eixo“Rodamos” a árvore para a esquerdaE alteramos o fb!
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 8 / 20
Rotações
A
B
α βαγ
raiz
A
Bα
β
α
γ
raiz
direita
esquerda
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 9 / 20
Implementando rotação
Rotação para a direitavoid rodar_direita(NoArv **raiz) {
NoArv *a, *b;
// obtém partesb = *raiz;a = b->esq;
// troca ponteiros*raiz = a;b->esq = a->dir;a->dir = b;
}
Exercício: Implementar rotação para a esquerda.
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 10 / 20
Revendo inserção
Inserção recursivavoid inserir(NoArv **r, int x) {
// caso baseif (*r == NULL) {
*r = malloc(sizeof(NoArv));(*r)->chave = x; (*r)->esq = (*r)->dir = NULL;return ;
}
// caso geralif ((*r)->chave < x)
inserir(&((*r)->dir), x);else
inserir(&((*r)->esq), x);}
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 11 / 20
Corrigindo o balanceamentoQuando uma inserção altera fb? Quando a subárvore aumenta de tamanho!
A
βαh1 h2
fb = 1
r
A
βαh1 h2
fb = 1
r
A
αh1
fb = 1
r
β
x
insere x
h2
A
βαh1 h2
fb = 1
r
A
αh1
fb = 2
r
β
x
insere x
h2+1
A
βαh1 h2
fb = 1
r
A
αh1
fb = 2
r
β
x
insere x
h2+1
Estratégiaredefinimos: int inserir(NoArv **r, int x): devolve 1 se aumenta
nesse caso, ajustamos a árvore usando rotações
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 12 / 20
Caso 1: árvore é vaziar
NULLh = 0
insere x
r
x
r
NULLh = 0
insere x
r
xfb = 0
r
NULLh = 0
insere x
r
xh+1
fb = 0
r
NULLh = 0
Procedimento: Inserimos o item
Fator de balanceamento: fb = 0
Altura: aumentou
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 13 / 20
Caso 2: insere em subárvore menor
A
βα
h
fb = -1
r
A
βα
h
fb = -1
r
A
βα
r
insere x
x
A
βα
h
fb = -1
r
A
βα
fb = 0
r
insere x
x
A
βα
h
fb = -1
r
A
βα
h
fb = 0
r
insere x
x
Procedimento: Inserimos o item
Fator de balanceamento: fb = 0
Altura: não aumentou
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 14 / 20
Caso 3: subárvore da mesma altura
A
βαh
fb = 0
r
A
βαh
fb = 0
r
A
βα
r
insere x
x
A
βαh
fb = 0
r
A
βα
fb = +1
r
insere x
x
A
βαh
fb = 0
r
A
βαh+1
fb = +1
r
insere x
x
Procedimento: Inserimos o item
Fator de balanceamento: fb = +1
Altura: aumentou
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 15 / 20
Caso 4: insere em subárvore maior
A
βαh
fb = +1
r
A
βαh
fb = +1
r
insere x A
β
α
r
x
A
βαh
fb = +1
r
insere x A
β
αh-2
r
xh
A
βαh
fb = +1
r
insere x A
β
αh-2
fb = +2
r
xh
Procedimento: Inserimos o item
Árvore não é mais AVL:⇒ temos que ajustar a árvore!
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 16 / 20
Caso 4: i) subárvore desbalanceada positivamente
γ2
A
αh+1
+1
r
B
γ1
+1
γ2
roda A paraesquerdaA
αh+1
+1
r
B
γ1
+1
γ2
A
α
r
B
γ1
γ2
roda A paraesquerdaA
αh+1
+1
r
B
γ1
+1
γ2
A
α
0
r
B
γ1
0
γ2
roda A paraesquerdaA
αh+1
+1
r
B
γ1
+1
γ2
A
αh
0
r
B
γ1
0
Procedimento: rotação para esquerda
Fator de balanceamento: fb = 0 (ajusta filho)
Altura: não aumentou
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 17 / 20
Caso 4: ii) subárvore desbalanceada negativamente
γ3
A
α
h+1
B-1
γ2
C
γ1
r+1
γ3
roda B para direita
A
α
h+1
B-1
γ2
C
γ1
r
γ3
A
αB
γ2
C
γ1
r+1
γ3
roda B para direita
A
α
h+1
B-1
γ2
C
γ1
r
γ3
A
αB
γ2
C
γ1
r
γ3
A
α
B
γ2
C
γ1
r
roda A para esquerda
+1
γ3
roda B para direita
A
α
h+1
0
B-1
γ2
C
γ1
r
γ3
A
αB
γ2
C
γ1
r
γ3
A
α
B
γ2
C
γ1
r
roda A para esquerda
+1
0 ou +10 ou -1
γ3
roda B para direita
A
α
h+1
0
B-1
γ2
C
γ1
r
γ3
A
αB
γ2
C
γ1
r
γ3
A
α
B
γ2
C
γ1
r
roda A para esquerda
h
+1
0 ou +10 ou -1
Procedimento: rotação para direita e para esquerda
Fator de balanceamento: fb = 0 (também ajusta filhos)
Altura: não aumentou
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 18 / 20
Inserção em AVLvoid inserir(NoArv **r, int x) {
int aumentou;// árvore vaziaif (*r == NULL) {
*r = malloc(sizeof(NoArv));(*r)->chave = x;return 1; // aumentou
}// insere na direitaif ((*r)->chave < x) {
aumentou = inserir(&((*r)->dir), x);if (aumentou) {
// analisa casos...
} elsereturn 0;
// inserção na esquerda é simétrica} else {
...}
}Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 19 / 20
Exercício
1 Desenhe uma árvore AVL após a inserção de 9,1,5,6,7.2 Pesquise sobre as árvores de Fibonacci e descubra qual é a maior altura de
uma árvore AVL com n nós.3 Remover um item de uma árvore AVL é tão (ou mais) problemático quanto
inserir. Esboce um algoritmo para remoção de um nó de uma árvore AVL.Quais são todos os casos que você deve considerar? Tente fazer um desenhono papel de cada caso
4 Crie uma função que verifique se uma dada árvore binária arbitrária é umaárvore AVL.
5 Crie uma função que receba um vetor ordenado e cria uma árvore de alturamínima.
Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 20 / 20