Á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
1
6
2
30
9
1
6
2
1
elemento novo
30
Não é árvore
hierarquica
1
9
6
2
30
Não é árvore
hierarquica
1
6
9
2
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 2 p1 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:
Mi
M2i
M 2i +1
Se M j é um filho então M j/2 é o pai, filho esquerdo ou direito
(j 2i 1 2i 1/2 i).
30
9
6
1
2
filho esq de
i
1
2
M 30 9
12 2
filho esq de
filho dir de
9
22 4
221 5
3
4
5
6
1
2
121 3
30
9
filho dir de
30
Vantagem: representação SEM apontador.
Operação de inserção Insx, C
8
3
2
6
1
5
conj. C, n = 6
9
(n+1) ésimo, novo
8
ELEM
3
9
-
9>6
2
1
5
6
Rebaixado
ELEM
9
9>8
9
3
8
Rebaixado
2
1
5
6
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. M n1 x; (* provisoriamente colocado como última folha *)
3. j n 1; i n 1/2; (* índice do pai *)
4. enqto i 0 e M i ELEM faça {
5. M j M i ; (* o pai é rebaixado *)
6. j i; i i/2; (* índice do novo pai, um nível acima *)
7. } (* fim do enqto *)
8. M j ELEM; (* coloca x no lugar correto *)
Complexidade: Olg n. Por quê?
9
lg(n + 1) − 1
3
2
8
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.
6
Rebaixar
3
2
9
1
5
8
ELEM
6
Rebaixar
6<9
3
filho maior
9
2
1
5
9
8
Promovido
ELEM = 6
3
Rebaixar
6<8
2
1
5
8
filho maior
9
3
2
Promovido
8
1
5
6
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, M i é 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 M i ; j 2 i; achou falso; (* M j é o filho esquerdo *)
2. enqto (j n) e (não achou) faça{ (* enqto há rebaixamento a ser
feito *)
3. se (j n e M j M j1 )
4.
então j j 1; (* M j é o filho maior *)
5. se (ELEM M j )
6.
então achou verdadeiro; (* terminar rebaixamentos *)
7.
senão {
8.
M j/2 M j ; (* filho maior é promovido *)
9.
j 2 j; (* índice do novo filho, um nível abaixo *)
10.
} (* fim-senão *)
11. } (* fim-enqto *)
12. M j/2 ELEM; (* a raiz original é colocada no nó pai de M j *)
Complexidade: Olg n. Por quê?
Operação de extração do max, ExMaxC
(1) O máximo está na raiz. Seja y o objeto na última folha M n .
max
Extrai
max
Árv. Hierarq.
y
última
folha
(2) Promove y para raiz, e tira M n da árvore, ou seja faz n n 1. A
árvore resultante não é mais hierárquica.
y
promove y
para raiz
não é mais
Árv. Hierarq.
tira última
folha
(3) Aplica o algoritmo Rebaixa, que rebaixa a raiz com y até o local
apropriado, tornando a árvore de novo em hierárquica.
y
Rebaixa raiz
de novo,
Árv. Hierarq.
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 On lg n.
3. Tempo total: On lg n.
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 M 1 , o máximo, com M i *)
4. t M i ; M i M 1 ; M 1 t;
5.
6.
Rebaixa(1, i 1);
} (* 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 ...”
i5
6, 25, 26, 5, max 31, Rebaixa1, 4 max 26, 25, 6, 5, 31
i4
5, 25, 6, max 26, 31, Rebaixa1, 3 max 25, 5, 6, 26, 31
i3
6, 5, max 25, 26, 31, Rebaixa1, 2 max 6, 5, 25, 26, 31
i2
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.
2.
3.
4.
5.
Inserir
Rebaixa
ExMax (ou ExMin)
Hierarq
OrdHierarq
Exercícios sobre Heap (Árvore Hierárquica).
1. Dada a matriz hieraquizada, com a relação :
índ. 1 2 3
M
4
5 6
7
8
9
10 11 12 13
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.
M
1
2 3
4
5
6
7 8 9 10 11 12 13 14 15
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