• 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

 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

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

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,

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

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]