Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouGiuliana Campos Alterado mais de 9 anos atrás
1
Katia S. Guimarães katia@cin.ufpe.br
Heapsort Katia S. Guimarães
2
Recordando a construção de um Heap
Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify (A, n, i ) Onde: A é o array contendo os elementos n é o número de elementos no array, e i é o índice do nó raiz da sub-árvore considerada.
3
Algoritmo Heapify Algoritmo Heapify(A, n, i )
Enquanto 2i n /* i tem filhos*/ faça { Se 2i < n /* i tem dois filhos*/ então Se A[2i ] > A[2i +1] então maior 2i senão maior 2i +1 senão /* o único é o maior*/ maior 2i ; Se A[i ] < A[maior] então então {A[i ] A[maior]; i maior } senão i n /* deixe o laço*/ }
4
Heapsort Após construir o heap, o array é visto como
contendo: um heap + parte da solução 74 41 34 21 9 22 26 74 22 41 21 9 34 26 41 26 34 21 9 22 74 74 41 41 34 26 34 21 9 22 26 21 9 22 74
5
Heapsort 41 26 34 21 9 22 74 34 26 22 21 9 41 74 41 26 34 21 9 22 74 41 34 26 34 26 22 21 9 22 74 21 9 41 74
6
Heapsort 34 26 22 21 9 41 74 34 26 22 21 9 41 74 26 21 22 9 34 41 74 34 26 26 22 21 22 21 9 41 74 9 34 41 74
7
Heapsort 26 21 22 9 34 41 74 26 21 22 9 34 41 74 22 21 9 26 34 41 74 26 22 21 22 21 9 9 34 41 74 26 34 41 74
8
Heapsort 22 21 9 26 34 41 74 22 21 9 26 34 41 74 21 9 22 26 34 41 74 22 21 21 9 9 22 26 34 41 74 26 34 41 74
9
Heapsort 21 9 22 26 34 41 74 21 9 22 26 34 41 74 9 21 22 26 34 41 74 21 9 9 22 21 22 26 34 41 74 26 34 41 74
10
Algoritmo Heapsort (A, n) Constrói-Heap(A, n) Para j n até 2 faça
{ exchange (A[1], A[ j]); Heapify (A, j, 1) }
11
Custo do Heapsort T(n) = Custo (Constrói-Heap) + Custo (laço)
12
Relembrando o custo para construir um Heap bottom-up
Qual é a soma das alturas de todas as sub-árvores dentro de uma árvore de altura h ? h = 2 4 h = 0 0 h = 1 1
13
Relembrando o custo para construir um Heap bottom-up
A soma das alturas de todas as sub-árvores dentro de uma árvore de altura h é dada por: H(h) = 2 · H(h-1) + h H(0) = 0 h H(h) 2h H(h) = 2h+1 - (h+2) = (n)
14
Custo do Laço O laço é executado exatamente n-1 vezes.
A cada iteração, ocorre - Uma troca de elementos no array (tempo constante) - Heapify (tempo proporcional à altura da árvore, que é logarítmico) Logo, Custo (laço) = (n · log (n) )
15
Custo do Heapsort T(n) = Custo (Constrói-Heap) + Custo (laço)
T(n) = [ (n)] + [n · log2 (n)] = = (n · log (n) ) OBS: A constante do Heapsort é menor que a do MergeSort. Por quê?
16
Constantes do Heapsort vs. MergeSort
1. A cada comparação, o MergeSort realiza uma movimentação de dados, enquanto que o Heapsort nem sempre faz isso. 2. Além disso, o MergeSort sempre faz as n • log n comparações, enquanto o HeapSort pode encerrar a reorganização do heap sem precisar descer até uma folha.
17
Heapsort OBSERVAÇÕES:
O algoritmo Heapsort tem um número de comparações de chaves no pior caso comparável ao do MergeSort. Mas como ele faz muito menos cópias de chaves, ele é consideravelmente mais rápido. 2. Em termos de espaço, o Heapsort é um algoritmo in-place, enquanto o MergeSort necessita do dobro do espaço necessário para as chaves.
18
Para que serve o MergeSort?
Se o algoritmo Heapsort é melhor que o MergeSort em tempo de execução em em espaço, para que serve o MS? O MergeSort tem duas características muito interessantes: - Localidade de referências (a cada chamada recursiva, as comparações vão-se fazendo entre elementos cada vez mais próximos), e - Blocos de tamanho controlável.
19
Para que serve o MergeSort?
Essas duas características são muito úteis quando se está ordenando um arquivo muito grande, que precisa ser mantido em dispositivo externo. A localidade de referências diminui o número de acessos a dispositivos externos (o “gargalo” neste tipo de aplicação), e permite o controle no tamanho dos blocos de dados a serem lidos.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.