E
STRUTURASDED
ADOS EA
LGORITMOSH
EAPB
INÁRIAAdalberto Cajueiro
Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1
H
EAPB
INÁRIA É uma árvore binária satisfazendo duas
propriedades:
1. Shape property
Estar completa até pelo menos seu penúltimo nível Se o seu último nível não estiver completo, todos os
2
H
EAPB
INÁRIA(E
XEMPLO)
Applet
http://people.ksp.sk/~kuko/bak/index.html
completa
esq→dir
max heap
Árvore binária completa
40
19 36
17 3 25 1
2 7
3
H
EAPB
INÁRIA(R
EPRESENTACAO)
4
E
XERCÍCIO1
Desenhe a Max heap representada pelo vetor a seguir
5
Posição
Valor
E
XERCÍCIO2
A árvore binária a seguir pode representar uma max heap? Justifique.
42
4
E
XERCÍCIO3
Qual o número mínimo de elementos de uma heap com altura h?
7
40
19 36
17 3 25 1
2
h
20+21+...2h-1 + 1 = n
(1 + 2 + 4 + ... 2h-1) + 1 = n 1(2h - 1)/1 +1 = n
2h - 1 +1 = n 2h = n
E
XERCÍCIO4
Qual o número máximo de elementos de uma heap com altura h?
8
40
19 36
17 3 25 1 h
20+21+...2h = n
E
XERCÍCIO5
Qual a altura de uma heap em função do número de elementos?
Vendo os casos extremos (2h e 2h+1)
9
2
h≤ n ≤ 2
h+1-1
h
≤
lg n
≤
h +1
h =
⌊
lg(n)
⌋
H
EAPB
INÁRIA Qual o invariante de um Max heap?
Qual a condicao necessária e suficiente para descrever o invariante de um Max heap?
6
H
EAPB
INÁRIA Qual o invariante de um Max heap?
Todo elemento pai é maior que seus elementos filhos
Qual a condicao necessária e suficiente para descrever o invariante de um Max heap?
A[Parent(i)] A[i], para todo i que não é raiz
Como manter o invariante de um Max heap? A cada insercao e remoção, trocar elementos de forma
a validar a propriedade
Quão custoso é mander o invariante?
Os elementos vão subindo ou descendo na heap => O(log n)
11
H
EAPB
INÁRIA(H
EAPIFY)
Processo de consertar uma heap para que ela preserve seus invariantes
H
EAPB
INÁRIA(H
EAPIFY)
13
8
E
XERCÍCIO Ilustre a operacao Heapify considerando o seguinte array:
15
E
XERCÍCIO O que acontece com o Heapify quando o elemento A[i] é maior que seus filhos?
E
XERCÍCIO Qual a análise do pior caso da Heapify?
O pior caso ocorre quando a árvore é dividida em 2/3
T(n) = T(2n/3) + O(1)
Caso 2.Θ(log n)
17
42
32
2 1
6
17 12
5 4 3 8
2n/3
H
EAPB
INÁRIA Como construir uma Heap a partir de um array qualquer?
Qual o custo dessa construção?
10
E
XERCÍCIO Utilize o build heap para construir a heap a partir do vetor <4,1,3,2,16,9,10,14,8,7>.
19
E
XERCÍCIO Utilize o build heap para construir a heap a partir do vetor <4,1,3,2,16,9,10,14,8,7>.
E
XERCÍCIO Utilize o build heap para construir a heap a partir do vetor <4,1,3,14,16,9,10,2,8,7>.
21
E
XERCÍCIO12
E
XERCÍCIO Utilize o build heap para construir a heap a partir do vetor <4,16,10,14,7,9,3,2,8,1>.
23
E
XERCÍCIO Utilize o build heap para construir a heap a partir do vetor <16,14,10,8,7,9,3,2,4,1>.
B
UILDH
EAP(A
NÁLISE)
Qual a ordem de complexidade do Buildheap? Aproximação inicial: O(n.log n)
Cálculo simples mas não é limite restrito (tight)
Análise mais detalhada indica: Θ(n). Observe que heapify varia de acordo com a altura do nó (a maioria dos nós tem uma altura pequena).
25
H
EAPB
INÁRIA E se a Heap já estiver construída? Como
14
H
EAPB
INÁRIA(I
NSERCOES)
Insira o elemento na ultima posicao da heap.
Mantenha o invariante da heap, considerando o novo elemento inserido.
40 19 36
17 3 25 1
2 7 20 40
19 36
17 3 25 1
2 7
40
20 36
17 19 25 1
2 7 3 40
19 36
17 20 25 1
2 7 3
inserir(20)
Viola invariante
Viola invariante Invariante ok
27
E
XERCÍCIO Insira os elementos 32, 45, 17, 2, 5 na heap seguinte. Mostre visualmente como a heap fica após cada operação.
28
40
19 36
17 3 25 1
H
EAPB
INÁRIA(I
NSERCAO)
Como seria o algoritmo de insercao na Heap?
29
H
EAPB
INÁRIA(I
NSERCAO)
16
H
EAPB
INÁRIA(R
EMOCOES)
Remocoes na heap acontecem sempre pelo elemento raiz (elemento máximo ou mínimo).
Mova o ultimo elemento para a raiz
Mantenha o invariante.
40 19 36
17 3 25 1
2 7
Remover maximo
Viola invariante
Viola invariante Invariante ok 7
19 36
17 3 25 1
2
36 19 7
17 3 25 1
2
36 19 25
17 3 7 1
2
31
E
XERCÍCIO Aplique remover maximo 4 vezes e mostre
visualmente como a heap fica após cada operação
32
40
19 36
17 3 25 1
H
EAPB
INÁRIA(R
EMOCAO)
Como seria o algoritmo de remocao na Heap?
33
H
EAPB
INÁRIA(R
EMOCAO)
18
H
EAPB
INÁRIA Heaps sao estruturas eficientes para armazenamento?
É possível usar heaps para ordenar um conjunto de dados?
Abordagens para o Heapsort:
1. Pega o conjunto de dados e vai inserindo em uma Min heap. Depois é só remover da heap na ordem crescente (Abordagem 1)
2. Ordenar no próprio vetor (Abordagem 2 – in-place)
35
H
EAPSORT(A
BORDAGEM1)
4 1
4
1 2 3
4 16 9 10 1
4 3
1 4 3
2
1 2 3
4 Inserir(4) Inserir(1) Inserir(3) Inserir(2)
1 2 3
4 16 Inserir(16)
1 2 3
4 16 9
Inserir(9) Inserir(10)
H
EAPSORT(A
BORDAGEM1)
Inserir(14)
1 2 3
4 16 9 10
14 8
1 2 3
4 16 9 10
14
Inserir(8)
8 1 2 3
4 7 9 10
14
Inserir(7)
16
37
H
EAPSORT(A
BORDAGEM1)
Inserir(14)
1 2 3
4 16 9 10
14 8
1 2 3
4 16 9 10
14
Inserir(8)
8 1 2 3
4 7 9 10
14
20
H
EAPSORT(A
BORDAGEM2)
Recebe um array completo e transforma-o em heap de forma in-place.
Evita uso de memória extra.
39
H
EAPSORT(A
BORDAGEM2)
Considerando uma Max heap.
40
H
EAPSORT(A
BORDAGEM2)
41
22
E
XERCÍCIO Use o heapsort (abordagens 1 e 2) para ordenar o vetor <4,1,3,2,16,9,10,14,8,7>.
43
C
ARACTERÍSTICAS Não é stable
In place (Abordagem 2)
Pior caso e caso médio similares Θ(n.log n)
Uma boa implementação do quicksort é melhor
P
RIORITYQ
UEUES Heapsort é tão bom quanto Mergesort e Quicksort* (exceto para o pior caso)
Entretanto, a estrutura tem uma enorme utilidade
45
P
RIORITYQ
UEUES Uma fila de prioridades é uma estrutura de dados para manter um conjunto S de elementos, cada um com uma chave associada, em
determinada ordem
Maior chave deve estabelecer a ordem de acesso aos elementos.
24
P
RIORITYQ
UEUES Implementação em Java PriorityQueue
Min heap genérica
Elementos comparáveis ou trabalha com um Comparator Mudança de prioridade on the fly violam a propriedade da
heap
Implementar uma max-heap precisa apenas “inverter” o
Comparator usado.
47
H
EAP(I
MPLEMENTACAO)
Como implementar uma heap que guarda
elementos contendo uma chave e dados satélites? Elementos devem ser objetos comparáveis (menor,
maior, igual)
Ou a heap deve trabalhar com um Comparator (mais incomum, mais reutilizável)
Como considerar isso na interface da heap?
H
EAP(I
MPLEMENTACAO)
public interface GenericHeap<T extends Comparable<T>> { public boolean isEmpty();
public void insert(T element); public T extractRootElement(); public T rootElement();
public T[] heapsort(T[] array); public void buidHeap(T[] array); public T[] toArray();
}
49