Professional Documents
Culture Documents
O custo para encontrar o menor (ou o maior) item entre n itens n 1 comparaes. Isso pode ser reduzido utilizando uma fila de prioridades.
Heapsort
Filas de Prioridades
uma estrutura de dados onde a chave de cada item reflete a prioridade em tratar aquele item Aplicaes:
SOs usam filas de prioridades, nas quais as chaves representam o tempo em que eventos devem ocorrer. Sistemas de gerncia de memria usam a tcnica de substituir a pgina menos utilizada na memria principal por uma nova pgina. Mtodos numricos iterativos so baseados na seleo repetida de um item com maior (menor) valor.
Algoritmos e Estrutura de Dados II
Heapsort
Filas de Prioridades - Tipo Abstrato de Dados
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. 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. Ajunta duas filas de prioridades em uma nica.
Heapsort
Filas de Prioridades Representao
Representao atravs de uma lista linear ordenada:
Neste caso, Constri leva tempo O(n log n). Insere O(n). Retira O(1).
Heapsort
Filas de Prioridades Representao
A melhor representao atravs de uma estruturas de dados chamada heap:
Neste caso, Constri O(nlogn). Insere, Retira, Substitui e Altera so O(log n).
Heapsort
Filas de Prioridades - Algoritmos de Ordenao
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 reversa. O uso de listas lineares no ordenadas corresponde ao mtodo da seleo. O uso de listas lineares ordenadas corresponde ao mtodo da insero. O uso de heaps corresponde ao mtodo Heapsort.
Algoritmos e Estrutura de Dados II
Heapsort
Heaps
uma seqncia de itens com chaves c[1], c[2], ... , c[n], tal que, para todo i = 1, 2, ..., n/2 :
Heapsort
Essa definio pode ser facilmente visualizada em uma rvore binria completa:
Heapsort
Heaps
rvore binria completa:
Os ns so numerados de 1 a n. O primeiro n chamado raiz. O n k/2 o pai do n k, para 1 < k <= n. Os ns 2k e 2k + 1 so os filhos esquerda e direita do n k, para 1 <= k <= n/2.
Heapsort
Heaps
As chaves na rvore satisfazem a condio do heap. A chave em cada n maior do que as chaves em seus filhos. A chave no n raiz a maior chave do conjunto. Uma rvore binria completa pode ser representada por um array:
Heapsort
Heaps
A representao extremamente compacta. Permite caminhar pelos ns da rvore facilmente. Os filhos de um n i esto nas posies 2i e 2i + 1. O pai de um n i est na posio i div 2. Na representao do heap em um arranjo, a maior chave est sempre na posio 1 do vetor. Os algoritmos para implementar as operaes sobre o heap operam ao longo de um dos caminhos da rvore. Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964.
Algoritmos e Estrutura de Dados II
Heapsort
Construo dos Heaps
O algoritmo no necessita de nenhuma memria auxiliar. Dado um vetor A[1], A[2], ..., A[n], os itens A[n/2 + 1], A[n/2 + 2], ..., A[n] formam um heap:
Neste intervalo no existem dois ndices i e j tais que j = 2i ou j = 2i + 1.
Algoritmos e Estrutura de Dados II
Heapsort
Heaps
Algoritmo:
Heapsort
Heaps
Os itens de A[4] a A[7] formam um heap. O heap estendido para a esquerda (Esq = 3), englobando o item A[3], pai dos itens A[6] e A[7]. A condio de heap violada:
O heap refeito trocando os itens D e S.
O item R incluindo no heap (Esq = 2), o que no viola a condio de heap. O item O incluindo no heap (Esq = 1). A Condio de heap violada:
O heap refeito trocando os itens O e S, encerrando o processo.
Algoritmos e Estrutura de Dados II
Heapsort
Programa para refazer a condio de heap:
void Refaz(Indice Esq, Indice Dir, Item *A) { Indice i = Esq; int j; Item x; j = i * 2; x = A[i]; while (j <= Dir) { if (j < Dir) { if (A[j].Chave < A[j+1].Chave) j++; } if (x.Chave >= A[j].Chave) break; A[i] = A[j]; i = j; j = i *2; } A[i] = x; Algoritmos e Estrutura de Dados II }
Heapsort
Programa para construir o heap:
void Constroi(Item *A, Indice n) { Indice Esq; Esq = n / 2 + 1; while (Esq > 1) { Esq--; Refaz(Esq, n, A); } }
Heapsort
Programa que implementa a operao de retirar o item com maior chave: Item RetiraMax(Item *A, Indice *n) { Item Maximo; if (*n < 1) printf(Erro: heap vazio\n); else { Maximo = A[1]; A[1] = A[*n]; (*n)--; Refaz(1, *n, A); } return Maximo; Algoritmos e Estrutura de Dados II }
Heapsort
Algoritmo:
1. Construir o heap. 2. Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n. 3. Use o procedimento Refaz para reconstituir o heap para os itens A[1], A[2], ..., A[n - 1]. 4. Repita os passos 2 e 3 com os n - 1 itens restantes, depois com os n - 2, at que reste apenas um item.
Heapsort
Exemplo de aplicao do Heapsort:
Heapsort
O caminho seguido pelo procedimento Refaz para reconstituir a condio do heap est em negrito. Por exemplo, aps a troca dos itens S e D na segunda linha da Figura, o item D volta para a posio 5, aps passar pelas posies 1 e 2.
Algoritmos e Estrutura de Dados II
Heapsort
Programa que mostra a implementao do Heapsort:
/* -- Entra aqui a funo Refaz -- */ /* -- Entra aqui a funo Constroi -- */ void Heapsort(Item *A, Indice *n) { Indice Esq, Dir; Item x; Constroi(A, n); /* constroi o heap */ Esq = 1; Dir = *n; while (Dir > 1) { /* ordena o vetor */ x = A[1]; A[1] = A[Dir]; A[Dir] = x; Dir--; Refaz(Esq, Dir, A); } Algoritmos e Estrutura de Dados II }
Heapsort
Anlise
O procedimento Refaz gasta cerca de log n operaes, no pior caso. Logo, Heapsort gasta um tempo de execuo proporcional a n log n, no pior caso.
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.
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.
Algoritmos e Estrutura de Dados II
1. Shellsort, Quicksort e Heapsort tm a mesma ordem de grandeza. 2. O Quicksort o mais rpido para todos os tamanhos aleatrios experimentados. 3. A relao Heapsort/Quicksort se mantm constante para todos os tamanhos. 4. A relao Shellsort/Quicksort aumenta medida que o nmero de elementos aumenta.
5. Para arquivos pequenos (500 elementos), o Shellsort mais rpido que o Heapsort. 6. Quando o tamanho da entrada cresce, o Heapsort mais rpido que o Shellsort. 7. O Insero o mais rpido para qualquer tamanho se os elementos esto ordenados. 8. O Insero o mais lento para qualquer tamanho se os elementos esto em ordem descendente. 9. Entre os algoritmos de custo O(n2), o Insero melhor para todos os tamanhos aleatrios Algoritmos e Estrutura de Dados II experimentados.