Árvore Hierárquica
Em inglês é chamada de Heap.
Representar: conjunto C de elementos com relação .
Operações: Insx,C (inserir x em C e ExMaxC (extrair o máximo do conjunto).
Chamado também de Fila de Prioridade.
Definição: É uma árvore binária tal que:
1. Para um inteiro p 0 todas as folhas estão na profundidade p ou p 1.
2. As de profundidade p estão todas "à esquerda" das de profundidade p 1.
3. Conteúdo de um vértice v é conteúdo dos filhos de v.
30
9 6
2 1
30
9 6
1 2
1
elemento novo
1 6
2 9
Não é árvore hierarquica
30
1 6
2 9
Não é árvore hierarquica
As propriedades (1) e (2) implicam que a árvore é quase completa ou completa.
Se todas as folhas ocorrem na profundidade p então a árvore é completa,
com profundidade 2p1 1 vértices.
A propriedade (3) é chamada de hierarquização.
Se a relação de ordem for ao invés de , o mínimo ocorre na raiz.
Seja M um vetor na memória:
M
2iM
2i+1M
iSe Mj é um filho então Mj/2 é o pai, filho esquerdo ou direito (j 2i 1 2i 1/2 i).
9 6
1 2
filho esq de
9
filho dir de9
2 2 4 2 2 1 5
i
1 2 3 4 5M 30 9 6 1 2
1 2 2 1 2 1 3 filho esq de
30
filho dir de30
Vantagem: representação SEM apontador.
Operação de inserção Ins x, C
8
3 6
2 1 5 9
(n+1) ésimo, novo conj. C, n = 6
3 -
2 1 5 6
9 ELEM
9>6
Rebaixado
9
3 8
2 1 5 6
Rebaixado 9
ELEM
9>8
Exercício: Se o elemento novo fosse 7, ao invés de 9?
Algoritmo Insx, C
Entrada: vetor M que representa uma árvore hierárquica com n objetos, e um objeto x
Saída: vetor M contendo x 1. ELEM x;
2. Mn1 x; (* provisoriamente colocado como última folha *) 3. j n 1; i n 1/2; (* índice do pai *)
4. enqto i 0 e Mi ELEM faça { 5. Mj Mi; (* o pai é rebaixado *)
6. j i; i i/2; (* índice do novo pai, um nível acima *) 7. } (* fim do enqto *)
8. Mj ELEM; (* coloca x no lugar correto *) Complexidade: Olg n. Por quê?
lg(n +1)
−1 3 82 1 5 6
Rebaixamento
Antes do algoritmo ExMaxC, veremos o algoritmo para rebaixar a raiz, cujas subárvores esquerda e direita são árvores hieráquicas, mas a raiz
contém um objeto MENOR que os dois filhos, e portanto a árvore toda não é hierarquica.
Rebaixar a raiz
Árv.Hierarq. Árv.Hierarq.
3 9
2 1 5 8
6 Rebaixar
3 9
2 1 5 8
6
6<9
Rebaixar
filho maior
3
2 1 5 8
6<8
Rebaixar
filho maior 9
ELEM = 6 Promovido
3
2 1 5
9
6
8 Promovido
Algoritmo Rebaixai,n
Entrada: vetor M que representa uma árvore hierárquica com n objetos, e índice i da raiz a ser rebaixada (ou seja, Mi é o vértice a ser rebaixado, que pode ser raiz de uma subárvore).
Saída: vetor M contendo após rebaixar a raiz para o local apropriado 1. ELEM Mi; j 2 i; achou falso; (* Mj é o filho esquerdo *) 2. enqto (j n) e (não achou) faça{ (* enqto há rebaixamento a ser
feito *)
3. se (j n e Mj Mj1)
4. então j j 1; (* Mj é o filho maior *)
5. se (ELEM Mj)
6. então achou verdadeiro; (* terminar rebaixamentos *) 7. senão {
8. Mj/2 Mj; (* filho maior é promovido *)
9. j 2 j; (* índice do novo filho, um nível abaixo *) 10. } (* fim-senão *)
11. } (* fim-enqto *)
12. Mj/2 ELEM; (* a raiz original é colocada no nó pai de Mj *) Complexidade: Olg n. Por quê?
Operação de extração do max, ExMax C
(1) O máximo está na raiz. Seja y o objeto na última folha Mn.
max
y
Árv. Hierarq.
última folha Extrai
max
(2) Promove y para raiz, e tira Mn da árvore, ou seja faz n n 1. A árvore resultante não é mais hierárquica.
y
não é mais Árv. Hierarq.
tira última folha para raiz
(3) Aplica o algoritmo Rebaixa, que rebaixa a raiz com y até o local apropriado, tornando a árvore de novo em hierárquica.
y
de novo, Árv. Hierarq.
Rebaixa raiz
Complexidade Olg n. Por quê?
Hierarquização
Objetivo: transformar uma árvore binária (representada por um vetor com n objetos) em árvore hierárquica.
Solução: aplicar o Algoritmo Rebaixa da seguinte forma (note que as folhas sozinhas já constituem uma árvore hierárquica):
1. Aplicar primeiro Rebaixa sobre cada pai das folhas, junto com as
folhas; resulta várias subárvores hierarquizadas com as raizes que são pais das folhas;
2. A seguir aplicar Rebaixa sobre cada avô das folhas; resulta hierarquização um nível acima;
3. E assim por diante, subindo de nível, até chegar à raiz.
Algoritmo Hierarq
Entrada: vetor M com n vértices Saída: M hierarquizada
para i n/2 até 1 faça { Rebaixa(i,n);
}
Exercício: a complexidade de tempo do Hierarq é Tn On. (solução no livro.)
HeapSort (Ordenação por Hierarquização)
Objetivo: dado um vetor com n objetos, ordená-lo em ordem crescente.
Solução:
1. Aplicar o Algoritmo Hierarq sobre o vetor M. Resulta uma árvore hierárquica em tempo On;
2. Aplicar ExMax n vezes. Resulta M ordenado em tempo Onlg n. 3. Tempo total: Onlgn.
Algoritmo OrdHierarq (ou HeapSort) Entrada: vetor M com n objetos
Saída: M em ordem crescente 1. Hierarq(M,n);
2. para i n até 2 faça {
3. (* a seguir troca M1, o máximo, com Mi *) 4. t Mi;Mi M1; M1 t;
5. Rebaixa(1,i 1);
6. } (* fim-para *)
Início com M 25, 31, 26, 5, 6
Aplica Hierarq(M, 5) resulta em M max 31, 25, 26, 5, 6 Inicia laço “para i n ...”
i 5
6, 25, 26, 5, max 31, Rebaixa1, 4 max 26, 25, 6, 5, 31 i 4
5, 25, 6, max 26, 31, Rebaixa1, 3 max 25, 5, 6, 26, 31 i 3
6, 5, max 25, 26, 31, Rebaixa1, 2 max 6, 5, 25, 26, 31 i 2
5, max 6, 25, 26, 31 Rebaixa1, 1 max 5, 6, 25, 26, 31
Figura: Ilustração de execução do algoritmo OrdHierarq.
Resumo
1. Inserir 2. Rebaixa
3. ExMax (ou ExMin) 4. Hierarq
5. OrdHierarq
Exercícios sobre Heap (Árvore Hierárquica).
1. Dada a matriz hieraquizada, com a relação :
índ. 1 2 3 4 5 6 7 8 9 10 11 12 13
M 4 5 6 15 9 7 20 16 25 14 12 11 8
a. Desenhar a árvore binária correspondente;
b. Inserir um novo objeto 2, aplicando o algoritmo Insx, C visto.
2. Considere a mesma árvore do exercício (1). Remover o mínimo aplicando o algoritmo ExMinC.
3. Hierarquizar a matriz M a seguir, aplicando o algoritmo Hierarq dado, com a relação
índ. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M 11 8 7 14 9 12 4 6 5 16 25 15 23 27 20 4. Ordenar a matriz a seguir, em ordem crescente, aplicando o
algoritmo OrdHierarq
índ 1 2 3 4 5 6 7 8 9 10
M 22 15 36 44 10 3 9 13 29 25