• Nenhum resultado encontrado

aula9 heap

N/A
N/A
Protected

Academic year: 2021

Share "aula9 heap"

Copied!
35
0
0

Texto

(1)

Estrutura de Dados

Universidade Federal de Juiz de Fora Departamento de Ciˆencia da Computac¸˜ao

(2)

I Introduc¸˜ao

I Definic¸˜ao de Heap I Heap Bin´aria

I Implementac¸˜ao com vetor

I Fila de Prioridades

(3)

I A heap ´e uma estrutura de dados importante que pode surgir em diversas aplicac¸ ˜oes.

I Pode ser usada para a implementac¸˜ao de listas de prioridades

I Casos especiais de listas em que os elementos possuem

relac¸ ˜oes de prioridade entre si.

I Exemplos de prioridades simples: pilhas e filas.

I Pode ser usada em algoritmos de ordenac¸˜ao:

(4)

I Heap ´e uma lista composta pelos elementos s0, . . . ,sn−1em

que o elemento siest´a ordenado (segundo algum crit´erio

de ordenac¸˜ao) em relac¸˜ao ao elemento s(i−1)/d. I Heap bin´aria: d = 2.

0 1 2 3 4 5 6 7

(5)

I Pode-se visualizar uma heap bin´aria como uma ´arvore

bin´aria completa, em que cada pai est´a ordenado em relac¸˜ao a seus filhos.

I Arvore bin´aria completa: ´e uma ´arvore balanceada na qual´ a distˆancia da raiz para qualquer folha ´e h ou h − 1.

0 1 2 3 4 5 6 7 95 60 78 39 28 66 70 33 95 60 39 33 28 78 66 70

(6)

I Max-heap 95 60 39 28 78 66 70 I Crit´erio de ordenac¸˜ao si≤ sb(i−1)/2c I Min-heap 33 42 70 80 36 54 37 I Crit´erio de ordenac¸˜ao si≥ sb(i−1)/2c

(7)

Representac¸˜ao

I Encadeada

I Vetorial

I Representac¸˜ao pouco flex´ıvel

I Percurso da ´arvore ´e mais simplificado

I Pode-se acessar qualquer pai ou filho da ´arvore com apenas

um c´alculo de ´ındices.

I Pai: (i − 1)/2

I Filho `a esquerda: 2i + 1

(8)

Operac¸ ˜oes

I Construtor e destrutor

I Inserc¸˜ao

I Remoc¸˜ao I Consulta raiz

I Os algoritmos de inser¸c˜ao e remo¸c˜ao consistem em:

I fazer uma modificac¸˜ao simples e;

I em seguida, percorrer a heap e modific´a-la para garantir

que o crit´erio de ordenac¸˜ao seja satisfeito em toda a estrutura.

(9)

Inserc¸˜ao

1. Inserir um novo n ´o no final do vetor

2. Incrementar o total de n ´os da heap

3. Corrigir o posicionamento do n ´o inserido

a. Verificar se o valor do novo n ´o deveria vir antes do pai

b. Caso positivo: troque o n ´o com o pai

c. Repita os passos (a) e (b) enquanto a verificac¸˜ao do passo

(10)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 60 39 33 28 78 66 70

(11)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 60 39 33 73 28 78 66 70 I 73 < 39?

I Se for menor, termina;

(12)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 60 73 33 39 28 78 66 70 I 73 ↔ 39

(13)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 60 73 33 39 28 78 66 70 I 73 < 60?

I Se for menor, termina;

(14)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 73 60 33 39 28 78 66 70 I 73 ↔ 60

(15)

Exemplo de Inserc¸˜ao I Inserc¸˜ao do n ´o 73 95 73 60 33 39 28 78 66 70 I 73 < 95?

I Se for menor, termina;

(16)

Exemplo de Inserc¸˜ao

I Situac¸˜ao final ap ´os a inserc¸˜ao do n ´o 73 95 73 60 33 39 28 78 66 70

(17)

Remoc¸˜ao

1. Colocar o ´ultimo n ´o na primeira posic¸˜ao do vetor

2. Decrementar o total de n ´os da heap

3. Corrigir o posicionamento do n ´o alterado

a. Verificar por qual caminho descer na ´arvore: escolher o

filho que tiver maior valor (max-heap) ou menor valor (min-heap)

b. Verificar se o filho deveria vir antes do n ´o

c. Caso positivo: troque o n ´o com o filho

d. Repita os passos (a),(b) e (c) e enquanto a verificac¸˜ao do

passo (b) for verdadeira ou enquanto n˜ao atingir o fim da

(18)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 95 73 60 33 39 28 78 66 70

(19)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 95 73 60 33 39 28 78 66 70

(20)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 39 73 60 33 95 28 78 66 70

(21)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 39 73 60 33 28 78 66 70

(22)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 39 73 60 33 28 78 66 70

(23)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 39 73 60 33 28 78 66 70 I 39 < 78?

I Se sim, desce com 39;

(24)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 78 73 60 33 28 39 66 70

(25)

Exemplo de Remoc¸˜ao I Remoc¸˜ao do n ´o 95 78 73 60 33 28 39 66 70 I 39 < 70?

I Se sim, desce com 39;

(26)

Exemplo de Remoc¸˜ao

I Situac¸˜ao final ap ´os a remoc¸˜ao do n ´o 95 78 73 60 33 28 70 66 39

(27)

I Definic¸˜ao da classe do TAD HeapMax (HeapMax.h)

class HeapMax {

private:

int m; // capacidade maxima de elementos

int n; // total de elementos corrente

float *x; // vetor que armazena a heap

void sobe(int i);

void desce(int i);

public:

HeapMax(int tam);

∼HeapMax();

float getRaiz();

void insere(float val);

void remove();

(28)

HeapMax::HeapMax(int tam) {

m = tam; n = 0;

x = new float[tam]; } HeapMax::∼HeapMax() { delete [] x; } float HeapMax::getRaiz() { if(n > 0) return X[0]; else {

cout << "Heap vazia!" << endl; exit(1);

(29)

void HeapMax::insere(float val) { if(n < m) { x[n] = val; n++; sobe(n-1); } else {

cout << "Heap cheia!" << endl; exit(1);

} }

(30)

I Implementac¸˜ao recursiva da operac¸˜ao sobe()

void HeapMax::sobe(int filho)

{

int pai = (filho - 1)/2;

if(x[filho] > x[pai])

{

// troca valores das posicoes pai com filho float aux = x[filho];

x[filho] = x[pai]; x[pai] = aux; sobe(pai); }

(31)

void HeapMax::remove() { if(n > 0) { x[0] = x[n-1]; n--; desce(0); } else {

cout << "Heap vazia!" << endl; exit(1);

} }

(32)

I Implementac¸˜ao recursiva da operac¸˜ao desce()

void HeapMax::desce(int pai)

{

int maxFilho = 2*pai + 1; //supoe filho esq maior

if(maxFilho < n)

{

// determina o indice do maior filho

if(maxFilho+1 < n)

if(x[maxFilho+1] > x[maxFilho])

maxFilho++; // filho dir maior que da esq

if(x[pai] < x[maxFilho]) {

float aux = x[pai]; x[pai] = x[maxFilho]; x[maxFilho] = aux; desce(maxFilho); }

(33)

I Podemos usar uma heap para implementar uma lista de

prioridades.

I Uma lista de prioridades ´e uma lista em que cada n ´o possui, al´em do valor armazenado, uma informac¸˜ao de prioridade.

I Em alguns casos, o pr ´oprio valor pode ser usado como a prioridade.

I Podemos definir o TAD ListaPrioridade exatamente

como definimos o TAD HeapMax, mudando apenas o tipo do n ´o. typedef struct { float val; int prioridade; } Dupla;

(34)

I TAD ListaPrioridade class ListaPrioridade {

private:

int m; // capacidade maxima de elementos

int n; // total de elementos corrente

Dupla *x; // vetor com os dados

void sobe(int i);

void desce(int i);

public:

ListaPrioridade(int tam);

∼ListaPrioridade();

float getRaiz();

void insere(float val);

(35)

1. Implementar o TAD ListaPrioridade com as seguintes operac¸ ˜oes: construtor, destrutor; operac¸ ˜oes para inserir, remover, consultar a raiz, subir e descer um n ´o.

2. Implementar vers ˜oes iterativas dos procedimentos sobe()e desce() do TAD HeapMax.

3. Modificar o TAD HeapMax para representar uma Min-heap.

4. Implementar uma operac¸˜ao no TAD para construir a heap dado um vetor de elementos.

5. Escrever um programa que usa uma heap para ordenar um vetor de 50 elementos lidos pelo usu´ario. Imprimir o vetor ordenado.

Referências

Documentos relacionados

Ainda segundo Gil (2002), como a revisão bibliográfica esclarece os pressupostos teóricos que dão fundamentação à pesquisa e às contribuições oferecidas por

13 CEZAR CORREIA DE QUEIROZ FILHO Confirmado 130 CLARISSE LOURDES NADU DE ALMEIDA Confirmado 22 CLEICIANE MARIA UCHÔA DE ANDRADE Confirmado. 104 DAMIANA SILVA FERNANDES

ABSTRACT: The toxicological effects of crude ethanolic extracts (CEE) of the seed and bark of Persea americana have been analyzed on larvae and pupae of

[r]

descobre tal elemento por meio de uma busca linear, o algoritmo abaixo mantém o trecho não ordenado num monte, de forma que a seleção do maior elemento pode ser feita em tempo O(lg

 Recebimento, em uma ou mais operações, em nome próprio, na qualidade de cessionário de beneficiário, ou em nome de beneficiário, na qualidade de mandatário, de indenizações

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

É perceptível, desta forma, o constante aumento do aprofundamento dos personagens: os “príncipes” têm agora não só nome e falas, mas personalidades bem desenvolvidas,