Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva Botelho Matheus Bispo Arrais de Souza Murilo Raphael de Souza Lira Rafael Alberto Gomes Pereira Lima Rafael Brandão Lobo Rafael Loureiro de Carvalho Tiago Carneiro Pessoa Canto Vinicius Miranda Cesar
Fila Sugere espera por algum serviço Indica ordem de atendimento. Capta a noção de ordem de chegada. FIFO (First-In-First-Out). No processamento de tarefas, além da ordem de chegada é típico atender a prioridades.
Prioridade Sugere que o serviço não será fornecido com o critério FIFO. Representada por uma chave que possui um certo tipo como, por exemplo, um número inteiro. É um valor associado a cada elemento e é do tipo ordenado. A prioridade associada a um dado pode ser qualquer coisa: tempo, custo, etc.
Fila de Prioridade É uma fila de elementos onde o próximo elemento a sair é o que possui a maior prioridade. Objetos na fila tem um número indicativo da sua prioridade. Alguns usos: ° processamento de tarefas em sistemas operacionais ° sistemas de tempo compartilhado ° simulação baseada em eventos
Heaps Binários Estruturas próprias para implementação de listas de prioridades. Árvores binárias (não de busca) onde: O pai tem chave menor ou igual a chave dos seus filhos (Heap Mínimo). OU O pai tem chave maior ou igual a chave dos seus filhos (Heap Máximo).
Heaps Binários O menor elemento está na raiz. (Heap Mínimo) O maior elemento está na raiz. (Heap Máximo) Árvore binária semi-completa: Todos os níveis da árvore estão preenchidos, exceto o último. O último nível é preenchido da esquerda para a direita.
Representação de Heaps Binários Diferentemente de árvores binárias de busca, heaps são implementados usando arrays Filho esquerdo 2*i Filho direito 2*i +1 Pai |_(i)/2_|
Representação de Heaps Binários O elemento das filas de prioridades possui duas partes: O objeto que define a prioridade desse elemento, que é do tipo comparável. O objeto que representa o próprio elemento a ser guardado na fila com prioridade.
Representação de Heaps Binários class Element { Object key; Object value; } Chave que define prioridade Elemento struct Element { int key; int value; }; typedef struct Element no Chave que define prioridade Elemento
Operação sobre Heaps Binários Se um nó tem seu valor alterado, a manutenção da propriedade do Heap pode requerer que o nó migre na árvore para cima ou para baixo. Para cada uma dessas situações, utiliza-se um algoritmo de migração. Subir migra o nó i para cima do heap Descer migra o nó i para baixo do heap Heapify = Descer
Operação sobre Heaps Binários Subir (Heaps Máximos) Implementação mais simples: void subir (Element heap[], int ind, int tam) { if (ind>0 && ind<tam && heap[pai(ind)]<heap[ind]){ trocar (heap, ind, pai(ind)); subir (heap, pai(ind), tam); }
Operação sobre Heaps Binários Subir (Heaps Máximos) Implementação mais simples: void subir (no **heap, int ind, int tam) { if (ind > 0 && ind key key) { trocar (heap, ind, pai(ind)); subir (heap, pai(ind), tam); }
Operação sobre Heaps Binários Descer (Heaps Máximos) - Implementação mais simples: void descer (Element heap[], int ind, int tam) { int maior = 0; if (esq(ind)<tam){ if (dir(ind) heap[esq(ind)]) maior = dir(ind); else maior = esq(ind); } if (maior != 0 && heap[pai(ind)]<heap[maior]) { trocar (pai(ind), maior); descer (heap, maior, tam); }
Operação sobre Heaps Binários Descer (Heaps Máximos) - Implementação mais simples: void descer (no heap**, int ind, int tam) { int maior = 0; if (esq(ind) < tam){ if (dir(ind) heap[esq(ind)]) maior = dir(ind); else maior = esq(ind); } if (maior != 0 && heap[pai(ind)]<heap[maior]) { trocar (pai(ind), maior); descer (heap, maior, tam); }
Construção de Heaps O problema é: “Como fazer com que os elementos de um vetor desordenado passem a condição de heap?”. As folhas da árvore (elementos n/2 até n-1) não tem descendentes e portanto já estão ordenados em relação a eles. Se acertarmos todos os nós internos (elementos 0 até n/2-1) em relação aos seus descendentes (rotina descer), o heap estará pronto. É preciso trabalhar de trás para frente desde n/2-1 até 0 pois as propriedades do heap são observadas apenas nos níveis mais baixos.
Construção de Heaps ConstroiHeap Implementação mais simples: void constroiHeap (Element heap[], int tam) { for (int i=tam/2-1; i>=0; i--) { descer (heap, i, tam); }
Construção de Heaps ConstroiHeap Implementação mais simples: void constroiHeap (no heap**, int tam) { int i; for (i = tam/2; i>=1; i--) { descer (heap, i, tam); }
Construção de Heaps Heapify 6
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Construção de Heaps Heapify
Inserção no Heap A inserção é feita na última posição do heap. Deve-se manter a propriedade do heap, ou seja, trocar o elemento inserido pelo pai se este for menor (em heaps mínimos) ou se este for maior (em heaps máximos). A inserção é bottom-up. Custo = O(log n), onde n é o número de elementos no heap.
Inserção no Heap
Inserção no Heap
Inserção no Heap
Inserção no Heap
Remoção no Heap A remoção é feita na primeira posição do heap. Coloca-se o último elemento na raiz. Deve-se manter a propriedade do heap, por isso, fazemos o heapify na raiz. A remoção é top-down. Custo = O(log n), onde n é o número de elementos no heap.
Remoção no Heap
Remoção no Heap
Remoção no Heap
Remoção no Heap
Sara Carvalho da Rocha Brito Tiago Carneiro Pessoa Canto Victor Barbosa de Oliveira Medeiros Vinícius Monteiro de Lira Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto Gomes Pereira Lima Rafael Loureiro de Carvalho