A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Algoritmos e Estruturas de Dados II

Apresentações semelhantes


Apresentação em tema: "Algoritmos e Estruturas de Dados II"— Transcrição da apresentação:

1 Algoritmos e Estruturas de Dados II
Ordenação: Heapsort Algoritmos e Estruturas de Dados II

2 Introdução Possui o mesmo princípio de funcionamento da ordenação por seleção. Selecione o menor item do vetor Troque-o pelo item da primeira posição Repita operação com os elementos restantes do vetor Implementação direta Encontrar o menor elemento requer n-1 comparações Ideia: Utilização de uma fila de prioridades implementada com um heap.

3 Fila de Prioridades Definição: Aplicações:
Estrutura de dados composta de chaves, que suporta duas operações básicas: inserção de um novo item e remoção do item com a maior chave. A chave de cada item reflete a prioridade em que se deve tratar aquele item. Aplicações: Sistemas operacionais, sistema de memória (paginação).

4 Fila de Prioridades Operações
Constrói a fila de prioridade com N itens Insere um novo item Retira o maior item Altera a prioridade de um item

5 Fila de Prioridades Representações
Lista sequencial ordenada, não ordenada e heap. Constrói Insere Retira máximo Altera prioridade Lista ordenada O(N log N) O(N) O(1) Lista não ordenada heaps O(log N)

6 Fila de Prioridades Algoritmos de ordenação com fila de prioridades
Utiliza operação insere para adicionar todas as N chaves Utiliza a operação retira máximo para receber uma lista na ordem reversa. Algoritmo Lista ordenada Lista não ordenada heaps

7 Fila de Prioridades Algoritmos de ordenação com fila de prioridades
Utiliza operação insere para adicionar todas as N chaves Utiliza a operação retira máximo para receber uma lista na ordem reversa. Algoritmo Lista ordenada Inserção Lista não ordenada Seleção heaps Heapsort

8 Heap Representação vetorial A[1], A[2], ..., A[n]
A[i] ≥A[2i] A[i] ≥ A[2i+1] i = 1, 2, 3, ..., n/2. Representação em árvore binária Será um heap se cada nó for maior ou igual seus filhos.

9 Heap Representação em árvore binária Nós são numerados de 1 a n
O primeiro é chamado raiz O nó k/2 é o pai do nó k, 1 < k ≤ n Os nós 2k e 2k+1 são filhos da esquerda e direita do nó k, para 1 ≤ k ≤ n/2.

10 Heap Árvores binária pode ser representadas por vetores.
Uma representação muito compacta Permite caminhar pelos nós da árvore facilmente Filhos de um nó i estão nas posições 2i e 2i + 1 O pai de um nó i está na posição i/2

11 Heap Construindo/Restauração da condição de heap.
Garantir que o valor da chave do pai é maior que dos filhos. Observe que os nós n/2,..., n satisfazem a condição, uma vez que não tem filhos. Para todo i de n/2 até 1 Troque o nó com seu filho de maior chave, até que nenhuma mudança ocorra.

12 Heap Restauração da condição de heap (árvore) 1 2 3 4 D R O E N A S D
5 6 7 D R O E N A S 1 D 1 D 1 2 3 3 2 R O 2 R O 4 5 6 7 4 5 6 7 E N A S E N A S 1 D 1 S 3 4 3 3 2 R S 2 R D 4 5 6 7 4 5 6 7 E N A O E N A O

13 Heap – Refaz a condição de heap
void RefazCimaBaixo(Item A[], int k, int Dir) { int j; while (2*k <= Dir) { j = 2*k; /* encontra maior filho */ if (j+1 <= Dir && A[j] < A[j+1]) j++; /* testa se pai é maior que filho */ if (A[k] >= A[j]) break; /* pai é menor que filho, troca posições */ Troca(A[k], A[j]); k = j; }

14 Heap – Construção do heap
void Constroi(Item A[], int N) { int Esq; /* inicia na metade do vetor */ Esq = N / 2 + 1; while (Esq > 1) { Esq--; RefazCimaBaixo(A, Esq, N); }

15 Heap – Refaz a condição de heap
void RefazBaixoCima(Item A[], int k) { /* se pai for menor que filho, troca */ while (k > 1 && A[k/2] < A[k]) { Troca(A[k], A[k/2]); /* vai para o pai e repete o processo */ k = k / 2; }

16 Heap – Operações Int N; /* controla número de elementos na fila */ Item pq[MaxN]; /* contém os dados */ /* inicia fila de prioridade */ Void FPInicia() { N = 0; } /* insere um elemento */ void FPInsere(Item v) { A[++N] = v; RefazBaixoCima(pq, N); } /* remove elemento com valor máximo */ Item FPRemoveMaximo() { Troca(pq[1], pq[N]); RefazCimaBaixo(pq, 1, N-1); return pq[N--];

17 Heapsort – Ordenação com fila de prioridades
Void FPSort(Item A[], int n) { int k; FPInicia(); /* insere elementos na fila de prioridade */ for (k = 0; k < n; k++) FPInsere(A[k]); /* remove maiores elementos da fila de prioridade */ for (k = n-1; k >= 0; k--) a[k] = FPRemoveMaximo(); }

18 Heapsort – Análise O procedimento RefazCimaBaixo gasta cerca de log n operações no pior caso. Logo, o heapsort gasta um tempo proporcional a O(n log n), no pior caso. Algoritmos e Estrutura de Dados II

19 Heapsort Vantagens O(n log n). Desvantagens Não é estável.

20 Exercícios Por que não usar o algoritmo de ordenação por seleção para identificar o k-ésimo menor elemento do vetor? Mesmo com o uso da estratégia da mediana, mostre um vetor de entrada que cai no pior caso do quicksort. Um vetor com elementos em ordem reversa é um heap? Mostre que o heapsort não é estável.


Carregar ppt "Algoritmos e Estruturas de Dados II"

Apresentações semelhantes


Anúncios Google