Vous êtes sur la page 1sur 39

Projeto e Anlise de Algoritmos

Heapsort

Bruno Prado

Departamento de Computao / UFS


Introduo

I O que Heapsort?
I Criado por J. W. J. Williams em 1964
I Estratgia de Transformao e Conquista
I Converte os dados para uma estrutura de Heap

Problema Estruturao Soluo

(C) 2017 Bruno Prado Departamento de Computao / UFS 2 - 39


Introduo

I Vantagens
I In-place
I Sem necessidade de espao adicional
I Eficincia algortmica
I Complexidade O(n log n)
I Aplicaes de tempo real
I Ordem exata de execuo

(C) 2017 Bruno Prado Departamento de Computao / UFS 3 - 39


Introduo

I Desvantagens
I Desempenho
I Mais lento que o Quicksort na prtica
I No explora o princpio da localidade
I Paralelismo
I No to facilmente paralelizvel

(C) 2017 Bruno Prado Departamento de Computao / UFS 4 - 39


Heapsort

I Conceitos chave
I Heap mnimo ou mximo
I Construo da estrutura de Heap
I Manuteno da propriedade do Heap

(C) 2017 Bruno Prado Departamento de Computao / UFS 5 - 39


rvores Heap
I Armazenamento e indexao
I N pai

11

1 2
11 09 05 07
0 1 2 3 09 05
3

07

i 1
Pai(i) =
2

(C) 2017 Bruno Prado Departamento de Computao / UFS 6 - 39


rvores Heap

I Armazenamento e indexao
I N filho esquerdo

11

1 2
11 09 05 07
0 1 2 3 09 05
3

07

Esquerdo(i) = 2i + 1

(C) 2017 Bruno Prado Departamento de Computao / UFS 7 - 39


rvores Heap

I Armazenamento e indexao dos ns


I N filho direito

11

1 2
11 09 05 07
0 1 2 3 09 05
3

07

Direito(i) = 2i + 2

(C) 2017 Bruno Prado Departamento de Computao / UFS 8 - 39


rvores Heap

I Tipos de rvores heap


I Heap mnimo

E D

Propriedade R E e R D

(C) 2017 Bruno Prado Departamento de Computao / UFS 9 - 39


rvores Heap

I Tipos de rvores heap


I Heap mximo

E D

Propriedade R E e R D

(C) 2017 Bruno Prado Departamento de Computao / UFS 10 - 39


rvores Heap
I Manuteno da propriedade de heap
I Procedimento heapify

void heapify(int V[], int i, int n) {


unsigned int P = i;
unsigned int E = esquerdo(i);
unsigned int D = direito(i);
if(E < n && V[E] > V[P]) P = E;
if(D < n && V[D] > V[P]) P = D;
if(P != i) {
trocar(&V[P], &V[i]);
heapify(V, P, n);
}
}

(C) 2017 Bruno Prado Departamento de Computao / UFS 11 - 39


Heapsort

I Princpio de funcionamento
I Etapa de transformao

23
1 i=2

13 29
3 4 5 6

11 17 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 12 - 39


Heapsort

I Princpio de funcionamento
I Etapa de transformao

23
i=1 2

13 29
3 4 5 6

11 17 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 13 - 39


Heapsort

I Princpio de funcionamento
I Etapa de transformao

23
i=1 2

17 29
3 4 5 6

11 13 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 14 - 39


Heapsort

I Princpio de funcionamento
I Etapa de transformao

i=0

23
1 2

17 29
3 4 5 6

11 13 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 15 - 39


Heapsort

I Princpio de funcionamento
I Etapa de transformao

i=0

29
1 2

17 23
3 4 5 6

11 13 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 16 - 39


Heapsort

I Dados estruturados
I Heap mximo

29
1 2

17 23
3 4 5 6

11 13 21 19

(C) 2017 Bruno Prado Departamento de Computao / UFS 17 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

19
1 2

17 23
3 4 5 6

11 13 21 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 18 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

19
1 2

17 23
3 4 5 6

11 13 21 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 19 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

23
1 2

17 19
3 4 5 6

11 13 21 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 20 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

23
1 2

17 21
3 4 5 6

11 13 19 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 21 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

19
1 2

17 21
3 4 5 6

11 13 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 22 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

19
1 2

17 21
3 4 5 6

11 13 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 23 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

21
1 2

17 19
3 4 5 6

11 13 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 24 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

13
1 2

17 19
3 4 5 6

11 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 25 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

13
1 2

17 19
3 4 5 6

11 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 26 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

19
1 2

17 13
3 4 5 6

11 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 27 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

11
1 2

17 13
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 28 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

11
1 2

17 13
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 29 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

17
1 2

11 13
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 30 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

13
1 2

11 17
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 31 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

13
1 2

11 17
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 32 - 39


Heapsort

I Princpio de funcionamento
I Etapa de conquista

11
1 2

13 17
3 4 5 6

19 21 23 29

(C) 2017 Bruno Prado Departamento de Computao / UFS 33 - 39


Heapsort

I Realizando o processo de ordenao


I Procedimento heapsort

void heapsort(int V[], int n) {


construir_heap(V, n);
int i;
for(i = n - 1; i > 0; i) {
trocar(&V[0], &V[i]);
heapify(V, 0, i);
}
}

(C) 2017 Bruno Prado Departamento de Computao / UFS 34 - 39


Heapsort

I Anlise de complexidade
I Tempo O(n log2 n)
I Construo O(n)
I Heapify O(log2 n)
I Espao O(1)
I Implementao iterativa
I Sem alocao de espao extra
I No estvel

(C) 2017 Bruno Prado Departamento de Computao / UFS 35 - 39


Exemplo

I Considerando o algoritmo Heapsort, realize a


ordenao decrescente do vetor
I Sequncia 32, 54, 92, 74, 23, 3, 43, 63
I Utilize o heap mnimo e mximo
I Execute o algoritmo passo a passo

(C) 2017 Bruno Prado Departamento de Computao / UFS 36 - 39


Exerccio
I A empresa de telecomunicaes Poxim Tech est
construindo um sistema de comunicao, baseado
no protocolo de datagrama do usurio (UDP) para
transferncia de pacotes em redes TCP/IP
I Os dados so organizados em sequncias de bytes
de tamanho varivel, mas limitados at o tamanho
mximo de 512 bytes
I Devido s caractersticas de roteamento de redes
TCP/IP, os pacotes podem chegar ao seu destino
desordenados, sendo necessria a ordenao dos
pacotes para receber os dados corretamente
I Para permitir o acesso rpido dos dados, possvel
processar as informaes recebidas desde que
estejam parcialmente ordenadas, com os pacotes
iniciais, sendo este processamento disparado por
uma determinada quantidade de pacotes recebidas

(C) 2017 Bruno Prado Departamento de Computao / UFS 37 - 39


Exerccio

I Formato de arquivo de entrada


I [#n total de pacotes] [Quantidade de pacotes]
I [N umero do pacote] [#m1 Tamanho do pacote] [B1] [Bm1 ]
I
I [N umero do pacote] [#mn Tamanho do pacote] [B1] [Bmn ]

62
0 3 01 02 03
1 2 04 05
2 4 06 07 08 09
4 2 0F 10
3 5 0A 0B 0C 0D 0E
5 6 11 12 13 14 15 16

(C) 2017 Bruno Prado Departamento de Computao / UFS 38 - 39


Exerccio

I Formato de arquivo de sada


I Quando uma quantidade determinada de pacotes
recebida, feita a ordenao parcial dos pacotes
para verificar se possvel exibir a parte inicial
completa dos dados que j foram recebidos

0: 01 02 03 04 05
1: 06 07 08 09
2: 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16

(C) 2017 Bruno Prado Departamento de Computao / UFS 39 - 39

Vous aimerez peut-être aussi