Árvores binárias de busca...
TRANSCRIPT
Árvores Binárias de Busca Balanceadas
04/04/2018 1
2
1 3
6
5 7
10
9 11
13
14 15
4
8
12
10
9
8
7
6
5
4
3
2
1
O(n)O(log(n))
Número mínimo de nós numa árvore cheia de altura h
04/04/2018 © 2011 DI, PUC-Rio • Estruturas de Dados Avançadas • 2011.2 2
2
1 3
6
5 7
10
9 11
13
14 15
4
8
12
1 3 5 7
2
4
6
1 3
2
1
!" ℎ = !" ℎ − 1 + 2)
!" ℎ = 1 + 2* + 2+ + 2, + ⋯+ 2) = 2).* − 1
ℎ = 0
ℎ = 1
ℎ = 2
ℎ = 3
Balanceamento de Árvores Binárias de Busca
motivação:fazer busca em O(log(n))
objetivo:• diminuir a altura da árvore mantendo o número de
nós.
• diminuir a diferença de altura entre a sub-árvore à esquerda (he) e a sub-árvore à direita (hd)
|hd – he| = pequeno
04/04/2018 3
nó
sae sad
Árvores Rubronegras
1. Todo nó é vermelho ou preto2. A raiz é preta3. As folhas são os nós NULL e são pretas4. Nós vermelhos só tem filhos pretos5. Todos os caminhos a partir da raiz da árvore até
suas folhas passa pelo mesmo número de nóspretos
São árvores auto-ajustáveis, que procuram manter o balanceamento de forma automáticamediante as seguintes restrições:
Árvores Rubronegras
Estas restrições garantem que o maior caminho entre a raiz e as folhas é no máximo o dobro do menor caminho.
Elas garantem um balanceamento razoável
Árvore Red-Black - definição
Altura negra (rank) de um nó:número de arestas pretas de qualquer caminho
desde o nó até um nó externo
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 6
80
70
65
60
62
50
10
5
0
1
1
2
2
1
1
0
0
1
1
0
0 0
0
0
0
Árvore Red-Black - conceitos
r = rank da raiz (2)h = altura da árvore sem nós externos (3 = 2r-1)
n = número de nós (8)
h £ 2r
n ³ 2r – 1
h £ 2 log2(n+1)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 7
80
70
65
60
62
50
10
5
0
1
1
2
2
1
1
0
0
1
1
0
0 0
0
0
0
Árvore Red-Black - conceitos
Sejam P e Q dois caminhos da raiz até nós externos:
comprimento(P) £ 2´comprimento(Q)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 8
80
70
65
60
62
50
10
5
0
1
1
2
2
1
1
0
0
1
1
0
0 0
0
0
0
Formas de representação
h(11)=4
bh(11)=2
Formas de representação
h(11)=4
bh(11)=2
Árvore Red-Black - busca
igual à busca numa árvore binária de busca
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 11
Notação
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 12
x // nó correntep = x->pai // paia = p–>pai // avôb = a->pai // bisavôt = a–>esq ou a->dir // tiofe = x–>esq // filho à esquerdafd = x–>dir // filho à direitai = p–>esq ou p->dir // irmãose = i–>esq // sobrinho a esquerdasd = i–>dir //sobrinho a direita
x
p
a
t
fe fd
i
se sd
b
Inserção
Ideia geral da inserção é seguir o processo de
uma ABB colorindo o novo nó vermelho, assim
se o pai for preto a inserção não viola as regras
da Red Black.
Possíveis violações:
[RB2] a raiz é preta
[RB4] p é vermelho
Vamos “consertar” a árvore de baixo para cima.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 13
violação de RB4
c
p
a
Correção da inserção
Duas maneiras de corrigir a violação das
regras RB: re-colorir os nós envolvidos
e/ou fazer rotações dos nós.
• Correção 1: Se o nó vermelho for a raiz,
simplesmente troque a cor. A raiz vira
preta e altura preta da árvore aumenta
de uma unidade. [recolorir]
04/04/2018 © 2018 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 14
Correção 2: tio vermelho
Se o pai e o tio forem vermelhos, troque a cor de
ambos para preto. Como isso aumenta a altura negra
da sub-árvore em questão, isso pode violar a RB4, por
isso mude a cor do avo para vermelho. Continue a
correção a partir do avo. A correção vai de baixo para
cima.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 15
notação XY: p é filho X {L,R} de ax é filho Y {L,R} de p
Tratamento por mudança de cor
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 16
tratamento: muda cor e continua com c’= a
x
p
a
tratamento: muda cor e continua com c’= a
x
p
a
ttrocacores
x’= a
x’
reavalia ancestrais
x
p
a
t
x
p
a
ttrocacores
x’=ax’
reavalia ancestrais
Note que, neste caso, não importa se c é um filho a esquerda ou a direita
Correção 3: tio preto
Se o tio for preto, precisamos saber se x e p são filhos
à direita ou à esquerda. Cada um dos quatro sub-casos
tem um tratamento diferente.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 17
x
p
a
LL LR
x
p
a
x
p
a
RR
x
p
a
RL
Tratamento LL rotação e troca de cor
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 18
tratamento: rotação e troca de cores
x
p
a
t
i
LL
x
p
a
ti
troca cores
x
p
a
ti
p->pai = b;if (b!=nil) {
if (a==b->esq) b->esq = p;
elseb->dir = p;
}
p->dir = a; a->pai = p;a->esq = i; i->pai = a;
p = x->pai;a = p->pai;b = a->paii = p->dir;
p->cor = BLACK;a->cor = RED;
Tratamento LR rotação dupla e troca de cor
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 19
LR
x
p
a
t
de
i
x
p a
tdei
x
p a
tdei
troca cores
c->pai = b;if (b!=nil) {
if (a==b->esq) b->esq = p;
elseb->dir =p;
}
c->esq = p; p->pai = c;c->dir = a; a->pai = c;p->dir = e; e->pai = p;a->esq = d; d->pai = a;
p = x->pai;a = p->pai;b = a->pai;i = p->esq;t = a->dir;e = x->esq;d = x->dir;
c->cor = BLACK;a->cor = RED;
Tratamento LR rotação dupla e troca de cor
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 20
RL
x
t
a
p
de
i
Exercício: Faça os casos simétricos
i
pt
x
RR
a
Exemplo (1/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 21
80
90
50
10
insere 70
80
90
50
10
70
Exemplo (2/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 22
80
90
50
10
70
insere 60
80
90
50
10
70
60
tratamento: muda cor e continua com c’= a
x
p
a
Exemplo (3/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 23
mudança de cor
80
90
50
10
70
60x
p
a
80
90
50
10
70
60
x
p
Exemplo (4/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 24
80
90
50
10
70
60
insere 65
60
80
90
50
10
70
65
Exemplo (5/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 25
60
80
90
50
10
70
65LR
65
80
90
50
10
7060
x
p
a
t
de
i
Exemplo (6/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 26
65
80
90
50
10
7060
insere 62
65
80
90
50
10
7060
62
Exemplo (7/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 27
65
80
90
50
10
7060
62
LR mudança
de corx
p
a
65
80
90
50
10
7060
62
x
p
a
Exemplo (8/8)
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 28
65
80
90
50
10
7060
62RLrotação
65
80
90
50
10 7060
62
Árvore Red-Black – remoção
Como na inserção o processo segue o mesmos passos da árvore binária de busca convencional. Temos apenas que cuidar para manter as 4 regras RB.
Na remoção a esperança é que o nó x, que vai ser retirado seja vermelho para não alterarmos as alturas pretas. Quando o nó retirado for preto isso reduz o número de nós pretos nos caminhos da raiz para as folhas que ele participa. Caso isso ocorra, precisamos corrigir a árvore com mudanças de cor e/ou estrutura (rotações), como no caso das inserções.
04/04/2018© 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1
29
Árvore Red-Black – remoção
Como a remoção segue o processo de uma ABB, existem 3 casos para o nó x, que vai ser removido:
1. é nó folha
2. é um nó que possui uma sub-árvore
3. é um nó que possui duas sub-árvores
O caso 3 é tratado substituindo o nó que vai ser removido pelo seu sucessor na árvore. E isso não muda a estrutura nesse nó. A mudança ocorre no no nó onde estava esse sucessor que necessariamente está nos casos 1 ou 2. O sucessor é o nó mais a esquerda da sub-árvore da direita.
Casos 1 e 2 são os que temos que tratar na correção da remoção.
04/04/2018© 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1
30
Remoção com no máximo um filho
Seja f o filho do nó x que deve ser
removido (pode ser esquerdo ou direito).
1. Se f ou x for vermelho, f substitui x e é
marcado como preto.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 31
x
…
a
p
f
i
rem xf
…
a
p
i
Remoção com x e p pretos: duplo-preto
2. Se f e x forem ambos pretos, f substitui x e émarcado como duplo-preto para indicar umproblema que precisa ser corrigido. Essa correçãodeve acontecer com um nó vermelho absorvendoesse preto ou quando chegamos na raiz.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 32
x
Caso 0: o nó duplo-preto, x, é raiz
x
Solução do caso 0: torne o nó duplo-pretoapenas preto. A altura preta da árvore éreduzida de um, mas as 4 propriedades RB sãopreservadas.
Laço de correção de um duplo-preto
Enquanto o nó x é duplo-preto faça:
Caso 2.0: raiz
Caso 2.1: tem um irmão vermelho.
Caso 2.2: irmão preto e dois sobrinhos pretos.
Caso 2.3: irmão preto e sobrinho a esquerda é
vermelho e o a direita é preto.
Caso 2.4: irmão preto e sobrinho a direita é
vermelho (o a esquerda pode ser preto ou
vermelho).
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 33
Duplo preto
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 34
Caso 2.1: Irmão vermelho
Solução: rode através do pai e troque a cor do pai com o irmão. Não é um caso terminal.
Exercício: Faça o caso em que x é o filho a direita.
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em p recolore p i
Duplo preto
Caso 2.2: Irmão i e seus dois filhos também são pretos.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 35
Torne o irmão vermelho, x vira um preto normal e seu pai ganha um nível de preto. Se p for vermelho, vira preto e o algoritmo termina. Se p for preto ele vira duplo-preto e o algoritmo continua.
se sd
x
p
i
se sd
x
p
i
se sd
x
p
i
recolore p i
e
x
d
continua
se sd
x
p
i
recolore p i
Duplo preto
Caso 2.3: Irmão i é preto. O filho “zig”é vermelho.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 36
Rode em p, troque a cor de p com i, pinte de preto sd e passe x de duplo-preto para preto.
Caso terminal.
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em p troca cor (i,p)
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em p recolore i, sd
sd vira preto
sd vira preto
Duplo preto
Caso 2.4: Irmão i é preto. O filho “zag”é vermelho.
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 37
Rode em i, troque a cor de i com se.
Não terminou. Continue no caso 2.3
se sd
x
p
i
roda em i troca cor (i,se)
i
sd
x
p
se se
sd
x
p
i
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 38
04/04/2018 39
x
p
a
t
x
p
a
ttrocacores
x’= a
x’
reavalia ancestrais
x
p
a
t
i
LL
x
p
a
ti
trocacoresx
p
a
ti
x
p
a
t
de
i
x
p a
tdei
x
p a
tdei
trocacores
R
B
RR
R R
B
B B
RR
R
B B
R
R B
B
R
R
BB
B
R
B B
LR B
B
BB
BR
R
R
R
B B B B
RR
B B B B
B
roda
roda
i1
i2a
i3a
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 40
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em p recolore p i
se sd
x
p
i
se sd
x
p
i
recolore p i xcontinua
se sd
x
p
i
se sd
x
p
i
recolore p i
B
RBB
B BB
B B
BB
BB B
B
BR
BB
B
B
B BB B
R
BB
B B
B B
R
BB
BB
R
B
B B
B
B
B
B
R
r1a
r2a
04/04/2018 © 2010 DI, PUC-Rio • Estruturas de Dados Avançadas • 2010.1 41
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em i troca cor (i,p)
se sd
x
p
i
se
sd
x
p
i
se
sd
x
p
iroda em i recolore i, sd
sd vira preto
sd vira preto
se sd
x
p
i
roda em i troca cor (i,se)
i
sd
x
p
se se
sd
x
p
i
BB
RR|B
B
B B
B
R|B
R
R|B
B
BB
B
R|B
R|B R|B R|B
R|BR|B
R
R
R RR
B
B
B
B
BBB
BB
R
R
R
B
B B
BB
BBBBB BB
r3a
r4a