• Nenhum resultado encontrado

04-Heaps-AED-UFRPE-pbcm

N/A
N/A
Protected

Academic year: 2021

Share "04-Heaps-AED-UFRPE-pbcm"

Copied!
77
0
0

Texto

(1)

Algoritmos e Estruturas de Dados

Prof. Péricles Miranda

{periclesmiranda@gmail.com}

(2)

Conteúdo

Introdução

Heaps

(3)
(4)

Introdução

Hearpsort também é um algoritmo de ordenação.

O heapsort possui complexidade de execução na ordem

de O(n log n).

No algoritmo heapsort, uma estrutura auxiliar é usada

(5)

Introdução

A estrutura de dados Heap não é usada apenas pelo

algoritmo de heapsort, mas também em outras aplicações,

como listas de prioridade.

Veremos aplicações de listas de prioridades em alguns

algoritmos na disciplina:

Algoritmo Prim;

Algoritmo Dijkistra.

(6)
(7)

Heaps

Heap é uma estrutura de prioridades, que pode ser representada na

forma de árvore binária semi-completa, indicando uma ordem

parcial entre seus elementos.

16 14 10 3 8 2 4 9 7 1 1 2 3 4 5 6 7 8 9 10

(8)

Heaps

Os heaps são geralmente implementados como vetores

unidimensionais (arrays), onde a raiz ocupa a posição 1, e

os elementos obedecem à relação: A[i].esq = A[2i], A[i].dir

= A[2i + 1].

14 10

16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(9)

Heaps

procedimento indice_pai(i)

retorne 𝑖/2 ;

fim_procedimento_indice_pai

procedimento indice_filho_esquerda(i)

retorne 2𝑖;

fim_procedimento_indice_filho_esquerda

procedimento indice_filho_direita(i)

retorne 2𝑖 + 1;

fim_procedimento_índice_filho_direita

(10)

Heaps

Existem dois tipos principais de heaps.

Max-heaps;

Min-heaps.

Ambos os casos, os elementos devem satisfazer a uma

(11)

Heaps

Em um max-heap, cada elemento i deve satisfazer a

propriedade abaixo (maior elemento na raiz):

𝐴 𝑖 . 𝑝𝑎𝑖 ≥ 𝐴[𝑖]

Em um min-heap, cada elemento i deve satisfazer a

propriedade abaixo (menor elemento na raiz):

(12)

Heaps

Considerando um heap como uma árvore, definimos a altura

de um nó como o número de arestas no maior caminho entre

o nó e uma de suas folhas.

A altura de um heap é dada como a altura de sua raiz.

Como um heap é baseado em uma árvore binária, a altura do

(13)

Heaps

procedimento max_heapfy(A, i)

𝑙 ← 𝑖𝑛𝑑𝑖𝑐𝑒_𝑓𝑖𝑙ℎ𝑜_𝑒𝑠𝑞𝑢𝑒𝑟𝑑𝑎(𝑖)

;

𝑟 ← 𝑖𝑛𝑑𝑖𝑐𝑒_𝑓𝑖𝑙ℎ𝑜_𝑑𝑖𝑟𝑒𝑖𝑡𝑎(𝑖)

;

se 𝑙 ≤ 𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜_ℎ𝑒𝑎𝑝 e A[l] > A[i] então

𝑚𝑎𝑖𝑜𝑟 ← 𝑙

;

senão 𝑚𝑎𝑖𝑜𝑟 ← 𝑖;

se 𝑟 ≤ 𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜_ℎ𝑒𝑎𝑝 e A[r] > A[maior] então

𝑚𝑎𝑖𝑜𝑟 ← 𝑟

;

se 𝑚𝑎𝑖𝑜𝑟 ≠ 𝑖 então

trocar(A[i], A[maior]);

max_heapfy(A, maior);

(14)

Heaps

Exemplo:

16 4 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(15)

Heaps

Exemplo:

16 4 10 3 14 7 9 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(16)

Heaps

Exemplo:

16 4 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(17)

Heaps

Exemplo:

16 14 10 3 4 7 9 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(18)

Heaps

Exemplo:

16 14 10 3 4 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(19)

Heaps

Exemplo:

16 14 10 3 4 7 9 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(20)

Heaps

Exemplo:

16 14 10 3 8 2 4 9 7 1 1 2 3 4 5 6 7 8 i = 9 10 14 10 16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(21)

Heaps

Exemplo:

16 14 10 3 8 7 9 1 2 3 4 5 6 7 8 i = 9 10 14 10 16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(22)

Heaps

A construção de um heap pode ser feita de

baixo-para-cima através do processo que segue.

procedimento constroi_max_heap(A)

𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜_ℎ𝑒𝑎𝑝 ← 𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜

;

para 𝑖 ← 𝑡𝑎𝑚𝑎𝑛ℎ𝑜/2 até 1 faça

max_heapfy(A, i);

fim_constroi_max_heap

(23)

Heaps

Exemplo:

4 1 3 10 2 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(24)

Heaps

Exemplo:

4 1 3 10 2 14 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(25)

Heaps

Exemplo:

4 1 3 10 2 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(26)

Heaps

Exemplo:

4 1 3 10 2 14 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(27)

Heaps

Exemplo:

4 1 3 10 2 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(28)

Heaps

Exemplo:

4 1 3 10 2 14 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 2 16 9 10 14 8 7 1 2 3 4 5 6 7 8 9 10

(29)

Heaps

Exemplo:

4 1 3 10 14 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 14 16 9 10 2 8 7 1 2 3 4 5 6 7 8 9 10

(30)

Heaps

Exemplo:

4 1 3 10 14 2 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 14 16 9 10 2 8 7 1 2 3 4 5 6 7 8 9 10

(31)

Heaps

Exemplo:

4 1 3 10 14 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 14 16 9 10 2 8 7 1 2 3 4 5 6 7 8 9 10

(32)

Heaps

Exemplo:

4 1 3 10 14 2 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 3 4 14 16 9 10 2 8 7 1 2 3 4 5 6 7 8 9 10

(33)

Heaps

Exemplo:

4 1 10 3 14 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 10 4 14 16 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(34)

Heaps

Exemplo:

4 1 10 3 14 2 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 10 4 14 16 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(35)

Heaps

Exemplo:

4 1 10 3 14 16 9 1 2 3 4 5 6 7 8 9 10 i = 1 10 4 14 16 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(36)

Heaps

Exemplo:

4 1 10 3 14 2 8 9 16 7 1 2 3 4 5 6 7 8 9 10 i = 1 10 4 14 16 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(37)

Heaps

Exemplo:

4 16 10 3 14 1 9 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 1 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(38)

Heaps

Exemplo:

4 16 10 3 14 2 8 9 1 7 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 1 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(39)

Heaps

Exemplo:

4 16 10 3 14 1 9 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 1 9 3 2 8 7 1 2 3 4 5 6 7 8 9 10

(40)

Heaps

Exemplo:

4 16 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(41)

Heaps

Exemplo:

4 16 10 3 14 7 9 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(42)

Heaps

Exemplo:

4 16 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(43)

Heaps

Exemplo:

4 16 10 3 14 7 9 1 2 3 4 5 6 7 8 9 10 i = 16 10 4 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(44)

Heaps

Exemplo:

16 4 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(45)

Heaps

Exemplo:

16 4 10 3 14 7 9 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(46)

Heaps

Exemplo:

16 4 10 3 14 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 4 10 16 14 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(47)

Heaps

Exemplo:

16 14 10 3 4 7 9 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(48)

Heaps

Exemplo:

16 14 10 3 4 2 8 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(49)

Heaps

Exemplo:

16 14 10 3 4 7 9 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 4 7 9 3 2 8 1 1 2 3 4 5 6 7 8 9 10

(50)

Heaps

Exemplo:

16 14 10 3 8 2 4 9 7 1 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(51)

Heaps

Exemplo:

16 14 10 3 8 7 9 1 2 3 4 5 6 7 8 9 10 i = 14 10 16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(52)
(53)

Heapsort

O algoritmo Heapsort tem início com a construção de um

max-heap para um vetor de dados A qualquer.

Tendo em vista que o maior elemento estará localizado

na raiz, podemos colocá-lo em sua posição correta pela

troca do mesmo com o elemento da posição A[n].

(54)

Heapsort

Após a modificação anterior, passamos a ignorar a última posição do

vetor original.

Isso é feito através do decremento do tamanho do heap

(A.tamanho_heap).

Como a nova raiz pode estar violando à propriedade de um max_heap,

realizamos um max_heapfy na raiz.

Esse processo é repetido no heap de tamanho n-1 até que o heap tenha

(55)

Heapsort

procedimento heapsort(A)

constroi_max_heap(A);

para 𝑖 ← 𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜 até 2 faça

trocar(A[1], A[i]);

𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜_ℎ𝑒𝑎𝑝 ← 𝐴. 𝑡𝑎𝑚𝑎𝑛ℎ𝑜_ℎ𝑒𝑎𝑝 − 1

;

max_heapfy(A, 1);

fim_heapsort

(56)

Heapsort

Exemplo: 16 14 10 3 8 2 4 9 7 1 1 2 3 4 5 6 7 8 9 10 14 10 16 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10

(57)

Heaps

Exemplo:

1 14 10 3 8 7 9 1 2 3 4 5 6 7 8 9 i = 10 14 10 1 8 7 9 3 2 4 16 1 2 3 4 5 6 7 8 9 10

(58)

Heaps

Exemplo:

14 8 10 3 4 2 1 9 7 16 1 2 3 4 5 6 7 8 9 i = 10 8 10 14 4 7 9 3 2 1 16 1 2 3 4 5 6 7 8 9 10

(59)

Heaps

Exemplo:

1 8 10 3 4 7 9 1 2 3 4 5 6 7 8 i = 9 10 8 10 1 4 7 9 3 2 14 16 1 2 3 4 5 6 7 8 9 10

(60)

Heaps

Exemplo:

10 8 9 3 4 2 14 1 7 16 1 2 3 4 5 6 7 8 i = 9 10 8 9 10 4 7 1 3 2 14 16 1 2 3 4 5 6 7 8 9 10

(61)

Heaps

Exemplo:

2 8 9 3 4 7 1 1 2 3 4 5 6 7 8 9 10 i = 8 9 2 4 7 1 3 10 14 16 1 2 3 4 5 6 7 8 9 10

(62)

Heaps

Exemplo:

9 8 3 2 4 10 14 1 7 16 1 2 3 4 5 6 7 8 9 10 i = 8 3 9 4 7 1 2 10 14 16 1 2 3 4 5 6 7 8 9 10

(63)

Heaps

Exemplo:

2 8 3 9 4 7 1 1 2 3 4 5 6 7 8 9 10 i = 8 3 2 4 7 1 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(64)

Heaps

Exemplo:

8 7 3 9 4 10 14 1 2 16 1 2 3 4 5 6 7 8 9 10 i = 7 3 8 4 2 1 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(65)

Heaps

Exemplo:

1 7 3 9 4 2 8 1 2 3 4 5 6 7 8 9 10 i = 7 3 1 4 2 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(66)

Heaps

Exemplo:

7 4 3 9 1 10 14 8 2 16 1 2 3 4 5 6 7 8 9 10 i = 4 3 7 1 2 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(67)

Heaps

Exemplo:

2 4 3 9 1 7 8 1 2 3 4 5 6 7 8 9 10 i = 4 3 2 1 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(68)

Heaps

Exemplo:

4 2 3 9 1 10 14 8 7 16 1 2 3 4 5 6 7 8 9 10 i = 2 3 4 1 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(69)

Heaps

Exemplo:

1 2 3 9 4 7 8 1 2 3 4 5 6 7 8 9 10 i = 2 3 1 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(70)

Heaps

Exemplo:

3 2 1 9 4 10 14 8 7 16 1 2 3 4 5 6 7 8 9 10 i = 2 3 1 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(71)

Heaps

Exemplo:

1 2 3 9 4 7 8 1 2 3 4 5 6 7 8 9 10 i = 2 3 1 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(72)

Heaps

Exemplo:

2 1 3 9 4 10 14 8 7 16 1 2 3 4 5 6 7 8 9 10 i = 1 3 2 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(73)

Heaps

Exemplo:

1 2 3 9 4 7 8 1 2 3 4 5 6 7 8 9 10 i = 2 3 1 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(74)

Heaps

Exemplo:

1 2 3 9 4 10 14 8 7 16 1 2 3 4 5 6 7 8 9 10 i = 2 3 1 4 7 8 9 10 14 16 1 2 3 4 5 6 7 8 9 10

(75)
(76)

Exercícios

1.

Dada a sequência de números x = {21, 28, 5, 39, 18,

22, 12, 47, 29}. Represente cada passo da ordenação

dos mesmos através do algoritmo Heapsort.

(77)

Referências

CORMEN, H. T.; LEISERSON, C. E.; RIVEST, R. L.;

STEIN, C. Introduction to Algorithms, 3rd ed., Boston:

MIT Press, 2009.

FEOFILOFF, Paulo. Algoritmos em Linguagem C.

Referências

Documentos relacionados

Foi realizado um estudo comparativo do diagnóstico da cinomose pelas técnicas de Imunofluorescência Direta (IFD), Imunofluorescência Indireta (IFI) e Coloração de Sellers em

Quando Carlos III expulsou os jesuítas da colônia no final do século XVIII e membros da Companhia de Jesus enfrentaram uma situação peculiar: apesar de súditos do

Este procedimento deve inserir uma tupla no banco de horas para todos os empregados referente período em questão.. Crie uma stored procedure que receba como parâmetro de entrada

Esse obtém uma rede translúcida, com nível de probabilidade de bloqueio da rede opaca, com um CapEx aproximadamente 30% menor do que a solução encontrada pelo MOWRP-3o-R, o

Diante do exposto, o objetivo deste trabalho foi comparar a taxa de blastocistos produzidos com sêmen sexado e convencional de três touros da raça 5/8 Girolando a partir da

Como parte integrante do “Todos por Pernambuco”, mais especificamente da Perspectiva de “Qualidade de vida” do modelo, encontra-se o Pacto pela Educação, o qual se

Com o intuito de aperfeic¸oar a realizac¸˜ao da pesquisa O/D, o objetivo do presente trabalho ´e criar um aplicativo para que os usu´arios do transporte p´ublico informem sua origem

Resultados: Os parâmetros LMS permitiram que se fizesse uma análise bastante detalhada a respeito da distribuição da gordura subcutânea e permitiu a construção de