ESTRUTURA DE DADOS E ALGORITMOS ÁRVORES BALANCEADASboeres/slides_ed/ed10.pdf · 2016. 11. 3. ·...
Transcript of ESTRUTURA DE DADOS E ALGORITMOS ÁRVORES BALANCEADASboeres/slides_ed/ed10.pdf · 2016. 11. 3. ·...
ESTRUTURA DE DADOS E ALGORITMOS
ÁRVORES BALANCEADAS
Cristina Boeres
Árvore Binária - altura máxima
Seja a árvore A formada com as seguintes inserções ! 1, 2, 3, 4, 5, 6 e 7
! Pior caso: O(n)
1
2
3
4
5
6
7
Árvore Binária - altura máxima
No entanto, seja A formada com as seguintes inserções ! Inserção de 4, 2, 6, 1, 3, 5 e 7, nesta ordem
! Pior caso: O(log n) 1
2
3
4
5
6
7
Árvore Binária de altura máxima
! Para árvores com n nós: ! altura máxima: cada nó não folha só
possui um filho " Ziguezague " linha
! sua altura é n-1
Árvore Binária - altura mínima
Sabemos que, em uma árvore binária de busca:
● nível 0 – (somente a raiz) contém um nó ● nível 1 – contém no máximo 2 nós
.....
● no nível L - pode conter no máximo 2L nós
● árvore binária cheia de altura d tem exatamente 2L nós em cada nível 0 ≤ L ≤ d
Árvore Binária
! O total de nós n em uma árvore binária cheia (que seria o máximo) de altura d é a soma do número de nós a cada nível
n = 20 + 21 + 22 + ..... + 2d
n = 2d+1 -1
d = log (n+1) –1
! O número de folhas de uma árvore cheia com n nós
2d = 2log(n+1)-1 = 2log(n+1) = n+1 2 2
Árvore Binária Cheia
Árvore Binária - altura mínima
! As árvores completas tem a menor altura ● Melhor para buscar vértices
! Mas como manter uma árvore completa, considerando um conjunto de inserções e remoções?
1
2
3
4
5
6
Insere 0
1
2
3
4
5
6
0
Solução: árvores balanceadas
! importante manter balanceadas árvores binária de busca
! Árvore Balanceada ou AVL (Adelson, Velsky e Landis (1962))
! a altura de uma árvore binária é o maior nível de suas folhas
! A altura de uma árvore vazia é definida como -1
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.
Árvores AVL - definição
! árvore AVL é uma árvore binária de busca onde: ● para cada vértice, a altura das duas sub-árvores não difere por
mais de um
! se a inequação acima acontece para um vértice v • v é dito regulado
! senão, • desregulado
|altura (subdir (v)) - altura (subesq(v))| <= 1
Árvores AVL - definição
! toda árvore completa é AVL e toda AVL é completa?
Árvores AVL - definição
! Qual a altura da árvore AVL? ● tem altura mínima? ● Quer dizer, a altura da árvore, h, é O(log n)
● Podemos formular esse problema da seguinte forma: " Dada uma árvore AVL de altura h, qual seria o menor
número de nós n?
Árvores AVL de altura h
! Vamos trabalhar com o número mínimo de nós ! Sem perda de generalidade, por definição:
subarv de altura h-2
subarv de altura h-1
v
Árvores AVL de altura h
! Suponha altura(subesq(v)) = h-1 ! Qual o número mínimo de nós?
! Como queremos analizar o número mínimo de nós, então altura(subd(v)) = h-2
! árvore AVL construída recursivamente, sendo | Th | o número de nós da AVL de altura h
h = 0 Th tem 0 nós: | Th | = 0 h = 1 | Th | = 1 h = 2 | Th | = 1 + | Th-1 | + | Th-2 |
Árvores AVL de altura h
! Qual o número mínimo de nós?
Árvores AVL de altura h
! Qual o número mínimo de nós? ! Por observação:
! o h-ésimo elemento da sequência de Fibonacci é: ! Fh = 0 se h = 0 ! Fh = 1 se h = 1 ! Fh = Fh-1 + Fh-2 se h > 1
! análogo a |Th|, mas diferindo de 1: |Th| = Fh + 1 ! pode-se provar que (exercício 5.3) ! Fh = 1/ √5 [( (1+ √5)h/2) - ((1- √5)h/2 )]
|Th| = Fh + 1
termo < 1 se h>0
Árvores AVL de altura h
! Como |Th| = Fh + 1 e Fh = 1/ √5 [( (1+ √5)h/2) - ((1- √5)h/2 )]
! |Th| > 1/ √5 [( (1+ √5)h/2) - ((1- √5)h/2 )] – 1
fazendo a = ( (1+ √5)/2) temos
! |Th| > 1/ √5 ah – 1
! |Th|+ 1 > 1/ √5 ah
! loga (|Th| + 1) > loga (ah/ √5)
! loga (|Th| + 1) > h loga √5 (mudando para base 2) ���
! log2 (|Th| + 1)/ log2 a > h √5
# h = O (log n)
Inclusões na árvore AVL
! A cada inclusão, é preciso verificar se a árvore A continua sendo AVL
● Tem algum nó desregulado?
● Se sim, aplicar uma transformação para que regule
" Rotações para igualar as alturas
Inclusões na árvore AVL
! Como saber se um nó está desregulado?
! Manter a informação balanço de um nó ( balanço(v) )
● Altura da subárvore direita MENOS a altura da subárvore esquerda
! Sejam
● he(p) - altura das subarvores esquerda
● hd(p) - altura das subarvores direita
! Então:
● balanço(v) = hd(v) – he(v)
Inclusões na árvore AVL
! cada vértice de árvore binária AVL balanceada
● balanço(v) é : -1, 0 ou 1
! A cada inserção de um nó q em T
● Identificar se algum nó se tornou desregulado
● cuidado: manter a ordenação entre as chaves
Inclusões na árvore AVL
! Se T não continua AVL depois da inclusão de um vértice q
! Procure o nó mais próximo da folha q que se tornou desregulado
● Onde está esse nó?
● Seja p esse nó # está entre a raíz e a folha q
! Então
| he(p) – hd(p) | > 1 (na verdade =2)
Inclusões na árvore AVL
a 1
b 1
c 0
d 0
e 0
f -1
g 1
h 0
i 0
j 0
k 0
l 0
m 0
n 0
o 0
p 0
q 0
Inclusões na árvore AVL
a 1
b -2
c 0
d -1
e 0
f -1
g 1
h -1
i 0
j 0
k 0
l 0
m 0
n 0
o 0
p 0
q 0
0 q
Inclusões na árvore AVL
a 1
b -2
c 0
d 1
e 0
f -1
g 1
h -1
i 0
j 0
k 0
l 0
m 0
n 0
o 0
p 0
q 0
0 q
Desregulado – é o nó p
Inclusões na árvore AVL
! Então temos os seguintes casos:
| he(p) – hd(p) | = 2
Caso I: he(p) > hd (p)
! Logo he(p) = hd (p) + 2
! Existe um filho esquerdo de p, chamado de u tal que u≠q e ainda
● he (u) ≠ hd (u)
Inclusões na árvore AVL
Caso I: he(p) > hd(p)
! he(u) ≠ hd(u)
Caso I.1) he(u) > hd(u)
! Então he(u) = hd(u) + 1
! Mas (i) he(u) + 1 = he(p)
! Como he(p) = hd(p) + 2, então em (i)
! he(u) +1 = hd(p) +2 ● he(u) = hd(p) +1
● hd(u) + 1 = hd(p) + 1
" hd(u) = hd(p)
p
u
q
Inclusões na árvore AVL
Caso I.1) he(u) > hd(u)
! Solução: rotação a direita
p
u p
u
T1 T2
T3
T1 T2 T3
Inclusões na árvore AVL
Caso I: he(p) > hd(p)
Caso I.2) he(u) < hd(u)
! Então he(u) + 1 = hd(u)
! Seja v, o filho direto de u
● Raiz da subárvore mais pesada
● As subárvores de v podem ter o mesmo tamanho ou podem diferir de uma unidade
● Então, como he(u) + 1 = hd (u)
" he(u) + 1 = max { he(v), hd(v)} +1
" he(u) = max { he(v), hd(v)} (i)
p
u
v
T1
T2 T3
T4
Inclusões na árvore AVL
Caso I.2) he(u) < hd(u)
! Temos ainda que he(p) = hd(p) + 2
! E como he(u)+ 2 = he(p)
! Então he(u)+ 2= hd(p) + 2
! Ou seja he(u) = hd(p) (ii)
! Como visto anteriormente em (i)
● he(u) = max { he(v), hd(v)}
! (i) em (ii) temos que max { he(v), hd(v)} = hd(p)
p
u
v
T1
T2 T3
T4
Inclusões na árvore AVL
Caso I.2) he(u) < hd(u)
! Solução: rotação dupla p
u
v
T1
T2 T3
T4
p
u
v
T1 T2 T3
T4 p
u
v
T1 T2 T3 T4
Inclusões na árvore AVL
Caso II: he(p) < hd(p)
! Caso análogo. Então, um nó z filho de p é identificado, tal que
! he(z) ≠ hd(z)
! z está regulado
Caso II.1) he(z) < hd(z)
! O lado direito pesa mais
! Por cálculos análogos
" he(z) = he(p)
p
z
q
Inclusões na árvore AVL
Caso II.1) he(z) < hd(z)
! he(z) = he(p)
! Solução: rotação a esquerda
p
z
q
p
z
q
Inclusões na árvore AVL
Caso II: he(p) < hd(p)
Caso II.2) he(z) > hd(z)
! Por motivos análogos
" hd(z) = max { he(y), hd(y)} = he(p)
p
z
y
Inclusões na árvore AVL
Caso II.2) he(z) > hd(z): Solução: rotação dupla
p
z
y
p
z
y
Inclusões na árvore AVL
Caso II.2) he(z) > hd(z): Solução: rotação dupla
p
z
y p z
y
Inclusões na árvore AVL
! Após rotação apropriada, p se torna regulado
! Sua altura diminui de uma unidade
! Então, todos os nós desregulados, ancestrais de p, que estão no caminho da raiz até o nó q (incluído), se tornam regulados
Implementação da Inclusão na AVL
! É uma árvore binária de busca – mas balanceada
! Inclusão de um nó dado q um valor ainda não existente
! Como já visto
! Agora, no caminho (inverso) da raiz até o nó q, verificar se o nó se tornou desregulado
! Se positivo, identificar o caso, e realizar rotações
Implementação da Inclusão na AVL
! Qual a informação que deve ser mantida para cada nó, para que seja identificado eficientemente se ele está ou não regulado
balanço(v) = hd(v) – he(v)
! Inicialmente, balanço(v) = 0 para o nó incluído
Implementação da Inclusão na AVL
balanço(v) = hd(v) – he(v)
! Antes da inserção balanço(v) = 1
! Inserção na subárvore esquerda de v
! Após a inserção balanço(v) = 0
Implementação da Inclusão na AVL
balanço(v) = hd(v) – he(v)
! Antes da inserção balanço(v) = 0
! Inserção na subárvore esquerda de v
! Após a inserção balanço(v) = -1
Implementação da Inclusão na AVL
balanço(v) = hd(v) – he(v)
! Antes da inserção balanço(v) = -1
! Inserção na subárvore esquerda de v
! Após a inserção balanço(v) = -2 # NÓ DESREGULADO
● Empregar a rotação necessária
Implementação da Inclusão na AVL
balanço(v) = hd(v) – he(v)
! Inserção na subárvore direita de v
● Casos análogos (simétrico)
! Como fica o algoritmo de INSERÇÃO em ABB AVL?
! Como fica o algoritmo de REMOÇÃO em ABB AVL?
Árvores AVL - exemplos
44
17 78
32 50 88
62 48 0 0
0
2
3
1
0
Em cada vértice v, altura(v) é calculada
Árvores AVL – fator de balanceamento
44
17 78
32 50 88
62 48 0 0
0 0
-1
1
1
0
Balanço(v)
Árvores AVL – inserções
1
0
0 -1
-1 0 1 0
0 0 0 0 0 0
0 0 0
Árvores AVL – inserções - balanceada
1
0
0 -1
-1 0 1 0
0 0 0 0 0 0
0 0 0
Árvores AVL – inserções - desbalanceada
1
0
0 -1
-1 0 1 0
0 0 0 0 0 0
0 0 0