Ordenação: HeapSort - DECOM- ?· HeapSort • Algoritmo: 1. Construir o heap. 2. Troque o item na…

Embed Size (px)

Text of Ordenação: HeapSort - DECOM- ?· HeapSort • Algoritmo: 1. Construir o heap. 2. Troque o item...

Ordenao: HeapSortProf. Tlio Toffolohttp://www.toffolo.com.br

BCC202 Aula 17Algoritmos e Estruturas de Dados I

2014-01 Aula 16 Fila de Prioridade / HeapSortAdaptado por Reinaldo Fortes para o curso de 2014-01Arquivo original: Aula 17: HeapSort

FILAS DE PRIORIDADE

Fila de Prioridade

uma estrutura de dados onde a chave de cada item reflete sua habilidade relativa de abandonar o conjunto de itens rapidamente.

Aplicaes: SOs usam filas de prioridades, nas quais as chaves

representam o tempo em que eventos devem ocorrer. Mtodos numricos iterativos so baseados na

seleo repetida de um item com maior (menor) valor. Sistemas de gerncia de memria usam a tcnica de

substituir a pgina menos utilizada na memria principal por uma nova pgina.

3

TAD - Fila de Prioridade

Operaes:1. Constri uma fila de prioridades a partir de um

conjunto com n itens.2. Informa qual o maior item do conjunto.3. Retira o item com maior chave.4. Insere um novo item.5. Aumenta o valor da chave do item i para um novo

valor que maior que o valor atual da chave.

4

OBS: Neste ponto, estamos considerando que item com maior chave tem maior prioridade.

TAD - Fila de Prioridade

Operaes:6. Substitui o maior item por um novo item, a no ser

que o novo item seja maior.7. Altera a prioridade de um item.8. Remove um item qualquer.9. Agrupar duas filas de prioridades em uma nica.

5

OBS: Neste ponto, estamos considerando que item com maior chave tem maior prioridade.

Filas de Prioridades - Representao

Lista linear ordenada: Constri O(n log n) ou O(n2). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada: Constri O(n). Insere O(1). Retira O(n). Altera O(n)

6

FILA DE PRIORIDADE:

HEAP

Heap

A melhor representao de uma fila de prioridade atravs de uma estrutura de dados chamada heap: Neste caso, Constri O(n). Insere, Retira, Substitui e Altera so O(log n).

Observao: Para implementar a operao Agrupar de forma

eficiente e ainda preservar um custo logartmico para as operaes Insere, Retira, Substitui e Altera necessrio utilizar estruturas de dados mais sofisticadas, tais como rvores binomiais (Vuillemin, 1978).

8

Heap

uma rvore binria em que um n filho sempre maior ou igual a um n pai.

Ou seja: chave(v) >= chave(pai(v))

9

2

65

79 n raiz (menor elemento)

Heap

rvore binria completa: Os ns so numerados de 0 a n-1. O primeiro n chamado raiz. O n (k-1)/2 o pai do n k, para 0 < k < n. Os ns 2k+1 e 2k+2 so os filhos esquerda e

direita do n k, para 0 < k

Heap

Cada n possui uma tupla (chave, elemento) Assim, cada n do heap armazena todo o item sendo

armazenado

11

(2, Sue)

(6, Mark)(5, Pat)(9, Jeff)

(7, Anna)

Heaps

As chaves na rvore satisfazem condio do heap.

A chave em cada n menor do que as chaves em seus filhos.

A chave no n raiz a menor chave do conjunto. Uma rvore binria completa pode ser

representada por um array:

12

0 1 2 3 4 5 6

2 5 6 9 7 8 10

Heaps

A representao extremamente compacta. Permite caminhar pelos ns da rvore facilmente.

Os filhos de um n i esto nas posies: 2i+1 e 2i+2. O pai de um n i est na posio (i-1) div 2.

Na representao do heap em um arranjo, a menor (ou maior) chave est sempre na posio 0 do vetor. Heap mnimo: menor elemento na raiz. Heap mximo: maior elemento na raiz.

13

HEAPOPERAES

Construo do Heap

Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964.

O algoritmo no necessita de nenhuma memria auxiliar.

Dado um vetor A[0], A[1], ..., A[n-1]: Os itens A[n/2], A[n/2 + 1], ..., A[n-1] formam um

heap vlido pois so ns folhas (ns que no possuem filhos).

Neste intervalo no existem dois ndices i e j tais que j = 2i+1 ou j = 2i+2.

15

Construo do Heap

16

0 1 2 3 4 5 6

9 5 6 8 3 2 7

9 5 2 8 3 6 7

9 3 2 8 5 6 7

2 3 9 8 5 6 7

2 3 6 8 5 9 7

Vetor inicial

Esq = 2

Esq = 1

Esq = 0

Esq = 0

Construo do Heap

Os itens de A[3] a A[6] formam um heap. O heap estendido para a esquerda (Esq = 2),

englobando o item A[2], pai dos itens A[5] e A[6]. A condio de heap violada:

O heap refeito trocando os itens A[2] e A[5]. O item 5 (A[1]) incluindo no heap (Esq = 1) A condio de heap violada:

O heap refeito trocando os itens A[1] e A[4].

17

Construo do Heap

O item 9 (A[0]) incluindo no heap (Esq = 0) A condio de heap violada:

O heap refeito trocando os itens A[0] e A[1]. Como a condio ainda est sendo violada:

O heap refeito trocando os itens A[1] e A[4].

Como resultado, o heap foi construdo: 2 3 6 8 5 9 7

18

Inserir um N no Heap

19

2

65

79

N sendo inserido

2

65

79 1

z

z

Comparar o n inserido com os pais e trocar enquantoele for menor que o pai ouat que ele seja o n raiz

Inserir um N no Heap

Na pior das hipteses o custo de uma insero ser O(n log n), equivalente altura da rvore

20

1

25

79 6z

2

15

79 6z

Remover um N do Heap

21

Trocar o n raiz pelo ltimo n do heap eremover o ltimo n

2

65

79

ltimo N

w

7

65

9w

novo ltimo N

Remover um N do Heap

Refazer o heap! Na pior das hipteses o custo de uma remoo

ser O(n log n), equivalente altura da rvore

22

7

65

9

w 5

67

9

w

ORDENAO USANDO HEAP

HEAPSORT

Ordenao usando Filas de Prioridades

As operaes das filas de prioridades podem ser utilizadas para implementar algoritmos de ordenao.

Basta utilizar repetidamente a operao Insere para construir a fila de prioridades.

Em seguida, utilizar repetidamente a operao Retira para receber os itens na ordem correta.

O uso de heap para fazer a ordenao origina o mtodo HeapSort.

24

Heapsort

Para reduzir o nmero de operaes, ser utilizado um Heap em que o maior valor armazenado na raiz Teremos que o valor de um n pai dever ser sempre

maior ou igual aos valores dos seus filhos

Utilizaremos repetidamente a operao Insere para construir a fila de prioridades.

Em seguida, utilizaremos repetidamente a operao Retira para receber os itens na ordem inversa.

25

HeapSort

Algoritmo:1. Construir o heap.

2. Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n-1.

3. Use o procedimento Refaz para reconstituir o heap para os itens A[0], A[1], ..., A[n - 2].

4. Repita os passos 2 e 3 com os n - 1 itens restantes, depois com os n - 2, at que reste apenas um item.

26

HeapSort

Exemplo de aplicao do Heapsort: Link para o arquivo.

27

http://www.decom.ufop.br/reinaldo/site_media/uploads/2013-02-bcc202/exemploheapsort.png

HEAPSORTIMPLEMENTAO

void heapRefaz(TItem *v, int esq, int dir) { int i = esq; int j = i*2 + 1; // j = prim eiro filho de i TItem aux = v[i]; // aux = no i (pai de j) w hile (j < = dir) { if (j < dir && v[j].chave < v[j+ 1].chave) j+ + ; // j recebe o outro filho de i if (aux.chave > = v[j].chave) break; // heap foi refeito corretam ente v[i] = v[j]; i = j; j = i*2 + 1; // j = prim eiro filho de i } v[i] = aux;}

HeapSort

29

void heapConstroi(TItem *v, int n) { int esq; esq = (n / 2) 1; // esq = n anterior ao prim eiro n folha do heap w hile (esq > = 0) { heapRefaz(v, esq, n-1); esq--; }}

HeapSort

30

void heapSort(TItem *v, int n) { TItem aux; heapConstroi(v, n); w hile (n > 1) { aux = v[n-1]; v[n-1] = v[0]; v[0] = aux; n--; heapRefaz(v, 0, n-1); // refaz o heap }}

HeapSort

31

MERGESORTANLISE DO ALGORITMO

Heapsort

O procedimento Refaz gasta cerca de log n operaes, no pior caso.

Constroi executa O(n) x Refaz Loop interno executa O(n) x Refaz Logo, Heapsort gasta um tempo de execuo O(n

log n) no pior caso.

33

Anlise do HeapSort

A altura h da rvore de execuo O(log n) Refazer o heap, na pior das hipteses, tem custo

igual altura da rvore. Construir o heap custa O(n log n)

Logo: algoritmo O(n log n)

34

h = O(log n)

MERGESORTVANTAGENS/DESVANTAGENS

Quando usar o Heapsort?

O HeapSort recomendado: Para aplicaes que no podem tolerar eventualmente

um caso desfavorvel. No recomendado para arquivos com poucos

registros, por causa do tempo necessrio para construir o heap.

36

Heapsort

Vantagens: O comportamento do Heapsort sempre O(n log n),

qualquer que seja a entrada. Desvantagens:

O anel interno do algoritmo bastante complexo se comparado com o do Quicksort.

O Heapsort no estvel.

37

Perguntas?

38

HEAPSORT

EXERCCIO

Exerccio

Dada a sequncia de nmeros:

3 4 9 2 5 1 8Ordene em ordem crescente ut