Escolar Documentos
Profissional Documentos
Cultura Documentos
rvores AVL
rvore balanceada tipo AVL:
para todos os seus ns, a diferena de altura entre as sub-rvores esquerda e direita no mximo 1. (Adel'son-Vel'Skii e E. M. Landis)
h-2
h-2
ou
K I F N
h-2
H
ou
Insero Esquerda
if(insereAVL(&((*p)->esq),k)){ switch ((*p)->fb){ case 1: (*p)->fb = 0; return false; case 0: (*p)->fb = -1; return true; case -1: /*** rebalancear ***/ if(((*p)->esq)->fb == -1) *p = LL(*p); else { LR(*p); (*p)->fb = 0; << ajustar fb >> } return false; } }
Insero Direita
if(insereAVL(&((*p)->dir),k)){ switch ((*p)->fb){ case -1: (*p)->fb = 0; return false; case 0: (*p)->fb = 1; return true; case 1: /*** rebalancear ***/ if(((*p)->dir)->fb == 1) *p = RR(*p); else { (*p)->fb = 0; << ajustar fb >> } return false; } }
Referncias na WEB
AVL Tree algorithm Wikipedia AlgorithmDesign.net Animao de rvores AVL Animao de rvores AVL (2)
Chaves < K1
rvores 2-3-4
rvore de busca de ordem 4
Cada n interno pode ter 2, 3 ou 4 filhos (1, 2 ou 3 campos chave). Todas as folhas tm a mesma altura. animao
rvores Rubro-Negras
As rvores 2-3-4 tm algumas desvantagens em conseqncia do nmero de filhos por n:
Nas inseres e retiradas, a complexidade dos rearranjos do tipo quebra e juno. Mais comparaes na horizontal
Arvores rubro-negras:
Implementam a mesma idia das rvores 2-3-4 usando a representao de rvores binrias.
rvores Rubro-Negras
A idia original baseada nas rvores 2-3-4
ou
rvores rubro-negras
Propriedades:
1. 2. 3.
4.
Todo n vermelho ou preto e a raiz preta. Toda folha preta. Se um n vermelho ento seus filhos so pretos. Todo caminho da raiz at qualquer folha tem sempre o mesmo nmero de ns pretos (mesma profundidade preta).
Caractersticas
Uma rvore rubro-negra com n ns tem altura menor ou igual a 2log(n+1). Uma busca numa rvore leva um tempo O(log n). Inseres e retiradas podem, se feitas como nas rvores binrias de busca normais podem destruir as propriedades rubronegras. Para restabelecer as propriedades, recorrese a rotao e recolorao dos ns
Rotao
rotao esquerda ou direita essa operao preserva a ordenao da rvore.
rotao direita esquerda
Insero - exemplo
10 3 1 15 20 Insere 5 1 3 5
10 15 20
Insero - exemplo
10 3 1 5 15 20 Insere 7 1 3 5 7 10 Recolorao: o novo n comea com vermelho e alterado em caso de conflito. 3 Recolor. 1 5 7 20 15 10 15 20 n vermelho com N vermelho com filho vermelho.
Insero - Exemplo
10 3 1 5 7 15 20 Insere 8 1 3 5 7 10 8 3 Pai -> preto. Av -> vermelho. Rotao no av. Recolor & Rotate Recolor. 1 5 7 8 15 20 10 15 20 A recolorao anterior no funciona
Insero - exemplo
10 3 1 5 7 8 3 Recolor 1 5 7 8 9 15 9 20 Continua ... 15 20 10 5 8 Insere 9 1 3 7 10 15 20
Insero (cont.)
10 3 1 5 7 8 9 7 3 1 5 8 9 15 20 O problema ainda no foi eliminado ... 15 20 necessrio recolorir o pai e o av.
10
Rotao
Insero (cont)
10 7 3 1 5 8 9 15 Recolor. e rotao 20 1 5 8 9 15 20 3 7 10
Referncias na web
http://users.cs.cf.ac.uk/Paul.Rosin/CM0212/DEMOS/RBTree/redblack.h tml http://ww3.algorithmdesign.net/handouts/RedBlackTrees.pdf http://www.cs.buap.mx/~titab/files/RedBlackTrees.pdf http://www.cs.buap.mx/~titab/files/RedBlackTrees.pdf http://www.cs.dal.ca/~nzeh/Teaching/Fall%202003/3110/RedBlackTree s.pdf animao 1
Filas de prioridade
Uma fila de prioridade uma rvore binria tal que
o valor associado a cada n maior (ou menor) que o valor associado a cada um dos seus filhos.
Implementao:
se a fila de prioridade for uma rvore completa ou quase completa, ela pode ser implementada num vetor.
Filas de prioridade
Rearranjo: o elemento fora de ordem trocado com o seu maior filho, sucessivamente at restabelecer a 'condio de ordem' na fila de prioridade. No exemplo: 'h' seria trocado com 'm' e depois trocado com 'k'.
h g d b c a f e i j m k
Filas de prioridade
Rearranjo 'morro abaixo' : supondo que a fila de prioridade implementada num vetor v e o valor da raiz est fora de ordem
void sift(int r, int m, int v[]) { int x = v[r]; while (2*r < m) { int f = 2*r+1; if ((f < m) && (v[f] < v[f+1])) ++f; if (x >= v[f]) break; v[r] = v[f]; r = f; O trecho do vetor que contm a } sub-rvore a ser rearranjada v[r] = x; delimitado por r e m. }
Filas de prioridade
Rearranjo 'morro acima' : a folha v[m] est fora de ordem
void upHeap(int r, int m, int v[]) { int x = v[m]; int j = m/2; while((j >= r)&&(v[j]< x)) { v[m] = v[j]; m = j; j = j/2; } v[m] = x; }
Filas de prioridade
Construo da fila a partir de um vetor em que os elementos no mantm nenhuma relao de ordem: A construo parte 'de baixo para cima' a partir do ltimo elemento da primeira metade do vetor (penltimo nvel) porque o ltimo nvel j est organizado (cada sub-rvore s tem um n).
void makePQueue (int n, int v[]) { int r; for (r = (n-1)/2; r >= 0; r--) sift(r, n-1, v); }
Filas de prioridade
Inserir um valor x na fila (supondo que existe espao no vetor):
v[++m] = x; upHeap(0,m,v);
Heapsort
O algoritmo heapsort usa a fila de prioridade para ordenar um vetor: void heapsort (int n, int v[]) { int p, m, x; for (p = (n-1)/2; p >= 0; p--) sift(p, n-1, v); for (m = n-1; m >= 1; m--) { x = v[0], v[0] = v[m], v[m] = x; sift(0, m-1, v); } }
Referncia na web
Uma boa referncia na web, em portugues, sobre estruturas de dados e algoritmos, alm de uma introduo linguagem C, estilo de programao, etc: http://www.ime.usp.br/~pf/algoritmos/
rvores gerais
Conjunto T no vazio de objetos
um n raiz demais ns em conjuntos T1, ...Tm, rvores disjuntas.
rvores gerais
Representao binria