O slideshow foi denunciado.
Introdução ao
JQuery e AJAX
Prof: Sérgio Souza Costa
Heap
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com
https://sit...
Filas de prioridade
Diferentemente das filas comuns, neste caso, um elemento ao
entrar na fila tem prioridade.
O primeiro ...
Filas de prioridade
Exemplos de aplicação
●Uma fila de pacientes esperando transplante de orgão.
●Em sistemas operacionais,...
Filas de prioridade
Fila de prioridade é uma estrutura de dado que mantém uma
coleção de elementos, cada um com uma priori...
Filas de prioridade
Eficiente na inserção:
● cada elemento inserido é anexado à lista
● a cada extração, percorremos a lis...
Filas de prioridade
Eficiente na remoção:
●a cada inserção, a fila é percorrida até o ponto de inserção,
inserção ordenada...
Filas de prioridade
Eficiente na inserção:
Para esta codificação não precisamos modificar a função
enfileira
Precisamos mo...
Filas de prioridade
Eficiente na remoção:
Para esta codificação não precisamos modificar a função
desenfileira.
Precisamos...
Para maior eficiência, usamos heaps
Um heap é uma estrutura de dados baseada em árvore
binárias...
Os dados armazenados em...
Podemos representar heaps em vetores
A idéia é linearizar a árvore por níveis
●a raíz é armazenada na primeira posição do ...
Heaps - Representação
int Pai(int i)
1: return (int)i/2
int Esq(int i)
1: return 2*i
int Dir(int i)
1: return 2*i + 1
Heaps - Representação
Para inserir um novo elemento com prioridade e,
● Cria-se um novo elemento no fim do array A para
receber e.
Isso pode pert...
Heaps - Inserção
Insere(A,e)
1: n = tam(A);
2: se n = max
3: then erro 'heap cheio'
4: i = n
5: enquanto (i > 1) e (A[Pai(i)] < e)
6: A[i] ...
A remoção em si é muito simples, já que o elemento de maior
prioridade é A[1].
Após a remoção, entretanto, precisamos rear...
CorrigeHeap(i)
1: esq := Esq(i)
2: dir := Dir(i)
3: maior := i
4: if esq <= tam(A) && A[esq] > A[i]
5: then maior := esq
6...
Perceba que podemos ordenar os elementos em um heap sem
"dificuldades"...
Basta extrair os elementos um a um
O algoritmo c...
O problema é: como fazer com que os elementos de um vetor
desordenado passem à condição de heap?
Uma solução simples é usa...
Então podemos construir um novo vetor, dado um
vetor desordenado de entrada, e corrigi-lo depois:
void HeapSort(int *vet, ...
Próximos SlideShares
Carregando em…5
×

Heap

779 visualizações

Publicada em

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Heap

  1. 1. Introdução ao JQuery e AJAX Prof: Sérgio Souza Costa Heap
  2. 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta http://www.slideshare.net/skosta/presentations?order=popular
  3. 3. Filas de prioridade Diferentemente das filas comuns, neste caso, um elemento ao entrar na fila tem prioridade. O primeiro a sair não é necessariamente o primeiro a entrar
  4. 4. Filas de prioridade Exemplos de aplicação ●Uma fila de pacientes esperando transplante de orgão. ●Em sistemas operacionais, a fila de prioridade de processos aguardando o processador para execução. ○Os processos mais prioritários são executados antes dos outros. Veremos algumas formas de implementar uma fila de prioridade. Algumas são eficientes na inserção, outras na remoção.
  5. 5. Filas de prioridade Fila de prioridade é uma estrutura de dado que mantém uma coleção de elementos, cada um com uma prioridade associada. Valem as operações seguintes: ●Inserir um elemento novo na fila de prioridade. ●Remover o elemento de maior prioridade da fila de prioridade.
  6. 6. Filas de prioridade Eficiente na inserção: ● cada elemento inserido é anexado à lista ● a cada extração, percorremos a lista em busca do elemento com maior prioridade Se há n elementos na fila, então... O(1) para inserções O(n) para extrações
  7. 7. Filas de prioridade Eficiente na remoção: ●a cada inserção, a fila é percorrida até o ponto de inserção, inserção ordenada. ●a extração é sempre do primeiro elemento Se há n elementos na fila, então... ● O(n) para inserções ● O(1) para extrações
  8. 8. Filas de prioridade Eficiente na inserção: Para esta codificação não precisamos modificar a função enfileira Precisamos modificar a função dequeue (desenfileira). ○ Primeiro encontramos o maior valor, percorrendo a lista da fila. ○ Depois removemos este valor da lista (list_remove) ○ Por fim, retornamos o maior valor
  9. 9. Filas de prioridade Eficiente na remoção: Para esta codificação não precisamos modificar a função desenfileira. Precisamos modificar a função enfileira. ●Neste caso, inserimos ordenado dentro da lista.
  10. 10. Para maior eficiência, usamos heaps Um heap é uma estrutura de dados baseada em árvore binárias... Os dados armazenados em um heap devem satisfazer a seguinte condição: ● todo nó deve ter valor maior (ou menor) que seus filhos ● Não confunda a condição de heap com a de árvore binária de pesquisa! Heaps
  11. 11. Podemos representar heaps em vetores A idéia é linearizar a árvore por níveis ●a raíz é armazenada na primeira posição do vetor, ●o filho à esquerda da raíz na segunda posição, ●o filho à direita da raíz na terceira, ●o primeiro neto da raíz na quarta, ●etc.. Heaps - Representação
  12. 12. Heaps - Representação
  13. 13. int Pai(int i) 1: return (int)i/2 int Esq(int i) 1: return 2*i int Dir(int i) 1: return 2*i + 1 Heaps - Representação
  14. 14. Para inserir um novo elemento com prioridade e, ● Cria-se um novo elemento no fim do array A para receber e. Isso pode perturbar a propriedade do “heap”. Para consertar isso: ● se e for maior que seu pai, então os dois trocam de lugar. ● essa operação é repetida até que e encontre o seu lugar correto no vetor A. Heaps - Representação
  15. 15. Heaps - Inserção
  16. 16. Insere(A,e) 1: n = tam(A); 2: se n = max 3: then erro 'heap cheio' 4: i = n 5: enquanto (i > 1) e (A[Pai(i)] < e) 6: A[i] := A[Pai(i)] 7: i := Pai(i) 8: A[i] = e 9: n++ Note que nesse algoritmo, o novo elemento não é colocado dentro do “heap” até que o lugar apropriado tenha sido obtido Heaps - Inserção
  17. 17. A remoção em si é muito simples, já que o elemento de maior prioridade é A[1]. Após a remoção, entretanto, precisamos rearranjar os elementosdo“heap”: ● Colocamos em A[1] o elemento da última posição: A[num] e chamamos o algoritmo de correção: Elemento ExtraiMáximo() 1: if num = 0 2: then erro 'heap vazio' 3: máximo := A[1] 4: A[1] := A[num] 5: num-- 6: CorrigeHeap(1) 7: return máximo Heaps - Inserção
  18. 18. CorrigeHeap(i) 1: esq := Esq(i) 2: dir := Dir(i) 3: maior := i 4: if esq <= tam(A) && A[esq] > A[i] 5: then maior := esq 6: if dir <= tam(A) && A[dir] > A[maior] 7: then maior := dir 8: if maior != i 9: then troque A[i] por A[maior] 10: CorrigeHeap(maior) Heap - Correção
  19. 19. Perceba que podemos ordenar os elementos em um heap sem "dificuldades"... Basta extrair os elementos um a um O algoritmo conhecido como heapsort explora exatamente essa idéia Heap - Ordenação
  20. 20. O problema é: como fazer com que os elementos de um vetor desordenado passem à condição de heap? Uma solução simples é usar o algoritmo de inserção repetidas vezes... ● Custo: O(n log n) Heap - Ordenação
  21. 21. Então podemos construir um novo vetor, dado um vetor desordenado de entrada, e corrigi-lo depois: void HeapSort(int *vet, int n) { Heap heap; ConstroiHeap(&heap, vet, n); for (int i = 0; i < n; i++) vet[heap.n] = ExtraiMaximo(&heap); } Heap - Ordenação

×