Carregar apresentação
A apresentação está carregando. Por favor, espere
1
INE5408 Estruturas de Dados
6.3.2.Árvores Rubro- Características Algoritmos Negras
2
Oque são Árvores Rubro-
Negras Árvores de pesquisa binária com um bit de informação adicional: a sua cor. Pode ser rubra ou Limitação da coloração dos nodos da raiz às folhas Garante que nenhum caminho é mais que duas vezes mais longo que qualquer outro Árvore semibalanceada Propriedades comuns a Árvores-B de ordem 4 negra
3
Histórico Árvores Red-Black foram inventadas em 1972 por Rudolf Bayer:
Estudou matemática em Munique e fez doutorado também em Matemática na Universidade de Illinois, em 1966. Foi pesquisador nos Boeing Research Labs, onde inventou em 1970 a árvore-B Publicação Original: Symmetric binary B-trees: Data structures and maintenance algorithms, Acta Informatica, 1 (1972)
4
Propriedades Rubro- Negras Todo nodo ou é rubro ou é negro
A raiz é negra Toda folha é negra Folhas são somente os nodos vazios (ponteiros nulos). Se um nodo for rubro, então ambos os filhos são negros. Para todo nodo, todos os caminhos até uma folha contém o mesmo número de nodos negros.
5
Implementação Rubro- Negra Nodo possui dois campos a mais: pai e cor
Classe nodoRB { info : tipo_info; esq : *nodoRB; dir : *nodoRB; pai : *nodoRB; cor : {rubro, negro}; }; Folhas nulas obrigatórias (“toda folha é negra”) Pode-se empregar um único nodo sentinela para representar todas as folhas Para fins de visualização em nossos algoritmos vamos ignorar as folhas.
6
Ponteiro nulo representando folha negra Visualização “tradicional”
26 17 41 14 21 30 47 10 16 19 23 28 38 7 12 15 20 35 39 3 nil Ponteiro nulo representando folha negra Visualização “tradicional” 26 17 41 14 21 30 47 10 16 19 23 28 38 7 12 15 20 35 39 3
7
Rotações Rubro- Negras
Árvores Rubro-Negras também realizam rotações para efetuar ajustes O Procedimento é quase idêntico à rotação simples das árvores AVL Mudam os nomes dos algoritmos Rotação simples à esquerda passa a se chamar rotação para a direita Rotação simples à direita passa a se chamar rotação para a esquerda
8
Devolvo y como a nova raiz desta subárvore
Rotação para a direita RB Corresponde a uma rotação entre os nodos x e seu filho da esquerda, y, envolvendo as subárvores A, B e C Devolvo y como a nova raiz desta subárvore x A y B C
9
Rotação para a esquerda
RB nodoRB *roda_esq(x *nodoRB) variáveis locais y, pai : *nodoRB; lado : {esq, dir}; início pai <- x->pai; //guardo o pai da subárvore que vou rodar SE pai->esq = x ENTÃO //x está pendurado de qual lado do pai? lado <- esq; SENÃO lado <- dir; FIMSE y <- x->dir; y->pai <- pai //roda & ajusta pais x->dir <- y->esq; x->dir->pai <- x; y->esq <- x; y->esq->pai <- y; SE lado = esq ENTÃO pai->esq <- y; pai->dir <- y; retorne y; fim roda_esq
10
Rotação para a esquerda
RB nodoRB *roda_esq(x *nodoRB) variáveis locais y, pai : *nodoRB; lado : {esq, dir}; início pai <- x->pai; //guardo o pai da subárvore que vou rodar SE pai->esq = x ENTÃO //x está pendurado de qual lado do pai? lado <- esq; SENÃO lado <- dir; FIMSE y <- x->dir; y->pai <- pai //roda x->dir <- y->esq; x->dir->pai <- x; y->esq <- x; y->esq->pai <- y; SE lado = esq ENTÃO // Ajusta pais. pai->esq <- y; ENTÃO // Evita ter que passar SENÃO // pai como parâmetro. pai->dir <- y; retorne y; fim roda_esq
11
Rotação para a direita RB nodoRB *roda_dir(x *nodoRB) variáveis locais
y, pai : *nodoRB; lado : {esq, dir}; início pai <- x->pai; //guardo o pai da subárvore que vou rodar SE pai->esq = x ENTÃO //x está pendurado de qual lado do pai? lado <- esq; SENÃO lado <- dir; FIMSE y <- x->esq; y->pai <- pai //roda & ajusta pais x->esq <- y->dir; x->esq->pai <- x; y->dir <- x; y->dir->pai <- y; SE lado = esq ENTÃO pai->esq <- y; pai->dir <- y; retorne y; fim roda_dir
12
Inserções Rubro- Negras
A inclusão é sempre executada utilizando-se o algoritmo de inserção em árvore de busca Modificado para manter os ponteiros para o pai. Todo novo nodo é colorido rubro. Sempre ganha duas folhas nulas negras Se o pai do novo nodo for negro Está pronto, trata-se de uma árvore- Se o pai for rubro A propriedade 4 está ferida Até duas rotações devem ser realizadas RB
13
Ajustes Rubro- Negros Para todo nodo v definimos uma vizinhança- RB
v, seu pai, seu avô e seu tio (RB é binária, haverá no máximo 1 tio) Um passo-CE de correção-ou-elevação envolve recolorir e (eventualmente) rotacionar a vizinhança-RB Um passo-CE provoca a restituição da propriedade 4 ou a elevação do erro para um nível acima na árvore-RB Para todo passo-CE existem 6 possíveis casos 3 para a direita e 3 para a esquerda RB
14
Relembrando: Propriedades Rubro-
Negras Todo nodo ou é rubro ou é negro A raiz é negra Toda folha é negra Folhas são somente os nodos vazios (ponteiros nulos). Se um nodo for rubro, então ambos os filhos são negros. Para todo nodo, todos os caminhos até uma folha contém o mesmo número de nodos negros.
15
RB Caso 1e (esquerda) v possui um tio rubro e seu pai é um filho rubro da esquerda não importa se v é filho da esquerda ou direita recolorimos o pai, avô e tio de v se o bisavô de v for negro está feito caso contrário a violação de 4 foi elevada 2 níveis v é elevado dois níveis executamos um passo-CE para o novo v (avô de v)
16
RB Caso 1e (esquerda)
17
Caso 1e (inserção do 14 - esquerda)
RB Caso 1e (inserção do 14 - esquerda)
18
Caso 2de (direita-esquerda)
RB Caso 2de (direita-esquerda) v é um filho da direita, cujo pai é um filho rubro da esquerda e cujo tio é negro rotacionamos para a esquerda v e seu pai atualizamos o nodo corrente caímos no caso 3 O caso 2 (inserção) sempre é sucedido pelo caso 3 Podemos ter o caso 3 acontecendo sozinho!
19
Caso 2de (inserção do 15 - direita-esquerda)
RB Caso 2de (inserção do 15 - direita-esquerda) E o tio negro? Folha nula é sempre negra... Rotacionamos para a esquerda. Geramos caso 3e...
20
RB Caso 3e (esquerda) v é um filho da esquerda, cujo pai é um filho rubro da esquerda e cujo tio é negro rotacionamos para a direita entre o avô e o pai recolorimos o pai e o avô pai fica negro avô fica rubro
21
RB Caso 3e
22
RB Caso 3e
23
Deleção do 32 RB É deletado como na árvore de busca não balanceada.
Caso simples: basta apagar o nodo. Fizemos aqui apenas para usar a árvore resultante para ver mais exemplos de inserção. Veremos deleção mais adiante
24
Caso 2ed (esquerda-direita)
RB Caso 2ed (esquerda-direita) v é um filho da esquerda, cujo pai é um filho rubro da direita e cujo tio é negro rotacionamos para a direita v e seu pai atualizamos o nodo corrente caímos no caso 3
25
Caso 2ed (inserção do 42 – esquerda-direita)
RB Caso 2ed (inserção do 42 – esquerda-direita) E o tio negro? Folha nula é sempre negra... Rotacionamos para a direita. Geramos caso 3d...
26
RB Caso 3d (direita) v é um filho da direita, cujo pai é um filho rubro da direita e cujo tio é negro rotacionamos para a esquerda entre o avô e o pai recorimos o pai e o avô pai fica negro avô fica rubro
27
RB Caso 3d
28
RB Caso 3d
29
RB Inserção- RB InsereRB (nodoRB *raiz, tipoInfo info, nodoRB *nodo) nodoRB *atual, *pai, *avô; início InsereArvBusca(raiz,info,nodo); //mod.p/atualizar ref.p/pai nodo->cor <- rubro; atual <- nodo; ENQUANTO (atual ≠ raiz E atual->pai->cor = rubro) FAÇA pai <- atual->pai; avô <- pai->pai; SE avo->esq = pai ENTÃO PassoCE_esq(atual, pai, avô); SENÃO PassoCE_dir(atual, pai, avô); FIMSE FIM ENQUANTO raiz->cor <- negro; //caso zero, por via das dúvidas fim.
30
RB RB Passo-CE- PassoCE_esq (nodoRB *atual, *pai, *avô) nodoRB *tio; início tio <- avô->dir; SE tio->cor = rubro ENTÃO //caso 1 pai->cor <- negro; avô->cor <- rubro; tio->cor <- negro; atual <- avô; //sobe 2 níveis SENÃO SE pai->dir = atual ENTÃO //caso 2 roda_esq(pai); atual <- atual->esq; //reseta atual FIMSE pai->cor <- negro; //caso3 roda_dir(avô); fim PassoCE-esq
31
RB RB Passo-CE- PassoCE_dir (nodoRB *atual, *pai, *avô) nodoRB *tio; início tio <- avô->esq; SE tio->cor = rubro ENTÃO //caso 1 pai->cor <- negro; avô->cor <- rubro; tio->cor <- negro; atual <- avô; //sobe 2 níveis SENÃO SE pai->esq = atual ENTÃO //caso 2 roda_dir(pai); atual <- atual->dir; //reseta atual FIMSE pai->cor <- negro; //caso3 roda_esq(avô); fim PassoCE-dir
32
Negras Deleções Rubro-
RB Negras Deleções Rubro- Deleção do nodo v é executada utilizando-se o algoritmo de deleção em árvore de busca Modificado para manter os ponteiros para o pai Subimos w, o predecessor inordem de v Maior elemento da subárvore esquerda Na falta: menor elemento da subárvore direita Ao subir w nunca subimos junto a cor de w o nodo cujo valor foi “retirado” mantém a cor original, associada à chave v
33
RB Negras Deleções Rubro- Ex.: deleção do 17: v w
34
16 copia para v. Com w faço o quê?
RB Negras Deleções Rubro- O problema em RB será sempre tratar w: v 16 copia para v. Com w faço o quê? w
35
Negras Deleções Rubro- 10 Casos: Caso 0 Casos 1 a 4 para: rubro e
RB Negras Deleções Rubro- 10 Casos: Caso 0 rubro e negro Casos 1 a 4 para: (e) filhos da esquerda (d) filhos da direita
36
Negras Deleções Rubro- Caso 0.R: Caso 0. : N
RB Negras Deleções Rubro- Caso 0.R: Se w for rubro, a árvore-RB continua válida Caso 0. : Se w for negro e possuir um filho rubro N → recolorimos
37
9 copia para v. Nodo rubro é simplesmente eliminado.
RB Negras Deleções Rubro- Caso 0.R: deleção do 8 v w 9 copia para v. Nodo rubro é simplesmente eliminado.
38
Árvore RB resultante é equilibrada.
Negras Deleções Rubro- Caso 0.R: deleção do 8 Árvore RB resultante é equilibrada.
39
11 copia para w. Nodo rubro é eliminado.
RB Negras Deleções Rubro- Caso 0. : deleção do 13 N v w 12 copia para v. 11 copia para w. Nodo rubro é eliminado.
40
11 copia para w. Nodo rubro é eliminado.
RB Negras Deleções Rubro- Caso 0. : deleção do 13 N OK! w 12 copia para v. 11 copia para w. Nodo rubro é eliminado.
41
RB Negras Deleções Rubro- Caso 0. : deleção do 13 N 11 muda de cor
42
RB Negras Deleções Rubro- Caso 0. : deleção do 13 N FEITO!
43
Negras Deleções Rubro-
RB Negras Deleções Rubro- Problema ocorre quando w e seus filhos são todos negros deleção de w fere propriedade 5 haverá um caminho com um nodo negro a menos Realizaremos recolorações e rotações para restaurar propriedades-RB vizinhança-RB consistirá do nodo atual, seu pai, seu irmão e os sobrinhos (filhos do irmão) recoloração e rotação ou restituirão a propriedade 5 ou elevarão a violação 1 nível na árvore: passo-CED (correção-ou-elevação-em- deleção) Para todo passo-CED haverá 8 casos 4 para a esquerda e 4 para a direita
44
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Casos 2, 3 e 4: irmão y de w é negro Distingüem-se dependendo dos filhos de y Caso 2 - ambos os filhos de y são negros Recolorimos (violação pode ser elevada um nível) Caso 3 - y->esq é rubro e y->dir é negro Recolorimos e rodamos É transformado no caso 4 Caso 4 - y->dir é rubro Ajuste termina aqui
45
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Ex.: Deleção do 16 v y w
46
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Ex.: Deleção do 16 v vizinhança-RB y w
47
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Sobe 11 v y w
48
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Rotacionamos para esquerda y w
49
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 1 - Irmão y de w é rubro Rotação transforma-o no caso 2, 3 ou 4 Recolorimos (como parte da rotação) y w
50
Resumo: deleção - Caso 1e (esquerda)
RB Resumo: deleção - Caso 1e (esquerda) Se Irmão y de w é rubro rotacione para a esquerda entre pai e y troque cor de pai e y
51
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 2 - ambos os filhos de y são negros Recolorimos (violação pode ser elevada 1 nível) w y
52
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 2 - ambos os filhos de y são negros Recolorimos (violação pode ser elevada de nível) w y vizinhança-RB
53
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 2 - ambos os filhos de y são negros Recolorimos (violação pode ser elevada 1 nível)
54
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 2 - ambos os filhos de y são negros Recolorimos (violação pode ser elevada 1 nível)
55
Resumo: deleção - Caso 2e (esquerda)
RB Resumo: deleção - Caso 2e (esquerda) Se filhos de y são ambos negros troque cor de y para rubro mova w um nível acima
56
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 3 – sobrinho y->esq é rubro (sobrinho próximo) e y->dir é negro Recolorimos e rodamos É transformado no caso 4 Ex.: Deleção do 28 v y w
57
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 3 – sobrinho y->esq é rubro e y->dir é negro Recolorimos e rodamos É transformado no caso 4 Subimos 25 e preparamos para rodar v y w
58
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 3 – sobrinho y->esq é rubro e y->dir é negro Rodamos e recolorimos É transformado no caso 4 Rotacionamos v y w
59
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 3 – sobrinho y->esq é rubro e y->dir é negro Rodamos e recolorimos É transformado no caso 4 Recolorimos v y w
60
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 3 – sobrinho y->esq é rubro e y->dir é negro Rodamos e recolorimos É transformado no caso 4 Transformou-se no caso 4 v y w
61
Resumo: deleção - Caso 3e (esquerda)
RB Resumo: deleção - Caso 3e (esquerda) y->esq é rubro e y->dir é negro troque cor de y para rubro e de y->esq para negro rotacione para direita entre y e y->esq
62
O caso 3 (deleção) sempre é sucedido pelo caso 4
Podemos ter o caso 4 acontecendo sozinho!
63
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 4 - y->dir é rubro (sobrinho distante) Recolorimos e rodamos Ajuste termina aqui v y w
64
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 4 - y->dir é rubro (sobrinho distante) Rodamos e recolorimos Ajuste termina aqui v y w
65
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 4 - y->dir é rubro (sobrinho distante) Rodamos e recolorimos Ajuste termina aqui
66
Deleções Rubro- (esquerda)
RB Deleções Rubro (esquerda) Negras Caso 4 - y->dir é rubro (sobrinho distante) Rodamos e recolorimos Ajuste termina aqui
67
Resumo: deleção - Caso 4e (esquerda)
RB Resumo: deleção - Caso 4e (esquerda) y->dir (sobrinho distante) é rubro nodos c1 e c2 podem ser rubros ou negros e não mudam mude cor de y->dir e de pai para negro mude cor de y para c1->cor rotacione para a esquerda entre pai e y faça a raiz da árvore ser w condição de término
68
Deleção - Caso 4e (esquerda)
RB Deleção - Caso 4e (esquerda)
69
Correção-ou-elevação- (deleção) alto nível RB
nodoRB *passoCED(nodoRB *w, *raiz) início ENQUANTO w ≠ raiz FAÇA // Cond. de término SE w = w->pai->esq ENTÃO w ← passoCED_esq(w, raiz); // Esquerda SENÃO w ← passoCED_dir(w, raiz); // Direita FIM ENQUANTO retorne w; FIM passoCED Observe que aqui não foi contemplada uma rotina de alto nível que deleta e sobe w, onde são tratadas as duas situações (Caso 0) onde um passo- CED é desnecessário e que invoca passoCED(). Esta fica por conta do aluno. RB
70
RB nodoRB *passoCED_esq(nodoRB *w, *raiz) variáveis nodoRB *y; início
y ← w->pai->dir; // Irmão da direita SE y->cor = RUBRO ENTÃO y->cor ← NEGRO; // Caso 1 w->pai->cor ← RUBRO; // Caso 1 roda_esq(w->pai); // Caso 1 y ← w->pai->direita; // Reseta Caso 1 FIMSE SE y->esq->cor = NEGRO E y->dir->cor = NEGRO ENTÃO y->cor ← RUBRO; // Caso 2 w ← w->pai; // Sobe Caso 2 SENÃO SE y->dir->cor = NEGRO ENTÃO y->esq->cor ← NEGRO; // Caso 3 y->cor ← RUBRO; // Caso 3 roda_dir(y); // Caso 3 y ← w->pai->dir; // Caso 3 y->cor ← w->pai->cor; // Caso 4 w->pai-cor ← NEGRO; // Caso 4 y->dir->cor ← NEGRO; // Caso 4 roda_esq(w->pai); // Caso 4 w ← raiz; // Caso 4 FIMSE FIMSE retorne w; FIM passoCED_esq
71
Trabalho Implemente uma classe ÁrvoreRB com todas as operações vistas
Implementação no VPL Implemente a árvore usando Templates Fornecidos Implemente a árvore com um número de elementos variável definido na instanciação Use as melhores práticas de orientação a objetos Documente todas as classes, métodos e atributos. Aplique os testes unitários disponíveis no Moodle da disciplina para validar sua estrutura de dados.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.