Árvore Hierárquica - IME-USP

Propaganda
Árvore Hierárquica
Em inglês é chamada de Heap.
Representar: conjunto C de elementos com relação .
Operações: Insx, C (inserir x em C e ExMaxC (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 p1  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
12  2
filho esq de
filho dir de
9
22  4
221  5
3
4
5
6
1
2
121  3
30
9
filho dir de
30
Vantagem: representação SEM apontador.
Operação de inserção Insx, 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 Insx, 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 n1  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: Olg n. Por quê?
9
lg(n + 1) − 1
3
2
8
1
5
6
Rebaixamento
Antes do algoritmo ExMaxC, 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 Rebaixai, 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 j1 )
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: Olg 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 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 Olg 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 é Tn  On. (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 On;
2. Aplicar ExMax n vezes. Resulta M ordenado em tempo On lg n.
3. Tempo total: On 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 ...”
i5
6, 25, 26, 5, max  31, Rebaixa1, 4  max  26, 25, 6, 5, 31
i4
5, 25, 6, max  26, 31, Rebaixa1, 3  max  25, 5, 6, 26, 31
i3
6, 5, max  25, 26, 31, Rebaixa1, 2  max  6, 5, 25, 26, 31
i2
5, max  6, 25, 26, 31 Rebaixa1, 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 Insx, C visto.
2. Considere a mesma árvore do exercício (1). Remover o mínimo
aplicando o algoritmo ExMinC.
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
Download