Filas de Prioridade & Heaps

Documentos relacionados
Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Árvores Binárias de Busca

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Aplicação de Árvores: Código de Huffman

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Ordenação: HeapSort. Prof. Túlio Toffolo BCC202 Aula 17 Algoritmos e Estruturas de Dados I

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

Estruturas de Dados. Filas em que a prioridade de remoção não é cronológica. Maior prioridade não é do elemento que ingressou primeiro

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

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

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

INF 1010 Estruturas de Dados Avançadas

DAINF - Departamento de Informática

Filas Implementação Sequencial

Árvores binárias de busca

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores binárias de busca

ÁRVORE BINÁRIA DE BUSCA TDA-ABB

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Introdução a AVL: teoria e prática. 22/11, 25/11 e 30/11

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias de Busca

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvore Binária de Busca. Prof. César Melo

Árvores Binárias de Busca

Árvores Vermelho-Preto

UNIVERSIDADE DA BEIRA INTERIOR

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

INF 1010 Estruturas de Dados Avançadas

INF 1010 Estruturas de Dados Avançadas

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Árvores Binárias de Busca (ABB) 18/11

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Carlos Eduardo Batista. Centro de Informática - UFPB

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

INF 1620 P2-01/11/03 Questão 1 Nome:

Tabelas de hash Acabamos de estudar como implementar uma tabela hashing aberta e estudaremos agora como implementar uma tabela hashing fechada ou

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof a Karina Oliveira. Fonte: Prof a Ana Eliza

ÁRVORE BINÁRIA DE BUSCA

Árvores & Árvores Binárias

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Algoritmos, Estruturas de Dados e Tipos Abstratos de Dados (TADs)

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

UNIVERSIDADE DA BEIRA INTERIOR

Filas de Prioridades Letícia Rodrigues Bueno

Árvores Binárias de Busca

PAA-DCC-UFAM. Árvores. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Estruturas de Dados I

Ordenação Interna. Prof. Jonas Potros

Transcrição:

Filas de Prioridade & SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP) 11 de novembro de 2013

TAD Fila de Prioridade Sumário 1 TAD Fila de Prioridade 2 3 Implementação em Arranjo

TAD Fila de Prioridade Sumário 1 TAD Fila de Prioridade 2 3 Implementação em Arranjo

TAD Fila de Prioridade TAD Fila de Prioridade Armazena Itens Item: par (chave, informação) Operações principais remove(f): remove e retorna o item com maior (menor) prioridade da fila F insere(f, x): insere um item x = (k,i) com chave k Operações auxiliares proximo(f): retorna o item com maior (menor) chave da fila F, sem removê-lo conta(f), vazia(f), cheia(f)

TAD Fila de Prioridade TAD Fila de Prioridade Diferentes Realizações (implementações)

TAD Fila de Prioridade TAD Fila de Prioridade Diferentes Realizações (implementações) Estáticas Lista estática (arranjo) ordenada Lista estática (arranjo) não ordenada Heap em arranjo

TAD Fila de Prioridade TAD Fila de Prioridade Diferentes Realizações (implementações) Estáticas Lista estática (arranjo) ordenada Lista estática (arranjo) não ordenada Heap em arranjo Dinâmicas Lista dinâmica ordenada Lista dinâmica não ordenada Heap dinâmico

TAD Fila de Prioridade TAD Fila de Prioridade Diferentes Realizações (implementações) Estáticas Lista estática (arranjo) ordenada Lista estática (arranjo) não ordenada Heap em arranjo Dinâmicas Lista dinâmica ordenada Lista dinâmica não ordenada Heap dinâmico Cada realização possui vantagens e desvantagens

TAD Fila de Prioridade TAD Fila de Prioridade Uma das escolhas diretas seria usar uma fila ordenada inserção é O(n) remoção é O(1) próximo é O(1) Outra seria usar uma fila não-ordenada inserção é O(1) remoção é O(n) próximo é O(n) Portanto uma abordagem mais rápida precisa ser pensada quando grandes conjuntos de dados são considerados

Sumário 1 TAD Fila de Prioridade 2 3 Implementação em Arranjo

Um heap é uma árvore binária que satisfaz as propriedades Ordem: para cada nó v, exceto o nó raiz, tem-se que chave(v) chave(pai(v)) - heap máximo chave(v) chave(pai(v)) - heap mínimo

Um heap é uma árvore binária que satisfaz as propriedades Completude: é completa, i.e., se h é a altura Todo nó folha está no nível h ou h 1 O nível h 1 está totalmente preenchido As folhas do nível h estão todas mais a esquerda

Convenciona-se aqui Último nó: nó interno mais à direita de profundidade h

Altura de um Heap Teorema Um heap armazenando n nós possui altura h de ordem O(log n).

Altura de um Heap Prova Dado que existem 2 i chaves na profundidade i = 0,..., h 1 e ao menos 1 chave na profundidade h, tem-se n 1 + 2 + 4 +... + 2 h 1 + 1

Altura de um Heap Prova Dado que existem 2 i chaves na profundidade i = 0,..., h 1 e ao menos 1 chave na profundidade h, tem-se n 1 + 2 + 4 +... + 2 h 1 + 1 Isso é uma Progressão Geométrica (PG) com razão q = 2, dado que a soma de um PG pode ser calculada por S k = ak q a 1, temos n (2 h 1 2 1) + 1 = 2 h q 1

Altura de um Heap Prova Dado que existem 2 i chaves na profundidade i = 0,..., h 1 e ao menos 1 chave na profundidade h, tem-se n 1 + 2 + 4 +... + 2 h 1 + 1 Isso é uma Progressão Geométrica (PG) com razão q = 2, dado que a soma de um PG pode ser calculada por S k = ak q a 1, temos n (2 h 1 2 1) + 1 = 2 h q 1 Logo, n 2 h, i.e., h log 2 n h é O(log n)

Filas de Prioridade com Armazena-se um Item (chave, informação) em cada nó Mantém-se o controle sobre a localização do último nó (w) Remove-se sempre o Item armazenado na raiz, devido à propriedade de ordem do heap Heap mínimo: menor chave na raiz do heap Heap máximo: maior chave na raiz do heap

Inserção Método insere do TAD fila de prioridade corresponde à inserção de um Item no heap O algoritmo consiste de 3 passos 1 Encontrar e criar nó de inserção z (novo último nó depois de w) 2 Armazenar o Item com chave k em z 3 Restaurar ordem do heap (discutido a seguir)

Restauração da Ordem (fix-up) Após a inserção de um novo Item, a propriedade de ordem do heap pode ser violada

Restauração da Ordem (fix-up) Após a inserção de um novo Item, a propriedade de ordem do heap pode ser violada A ordem do heap é restaurada trocando os itens caminho acima a partir do nó de inserção Termina quando o Item inserido alcança a raiz ou um nó cujo pai possui uma chave maior (ou menor)

Inserção Algoritmo Inserir(F,x) inserirnofim(f) //insere na última posição fix_up(f) //restaura ordem do heap

Restauração da Ordem (fix-up) Para um heap máximo, temos 1 Algoritmo fix_up(f) 2 w = F.ultimo 3 while(!isroot(f,w)) && (key(f,w) > key(f,parent(f,w))) { 4 swap(f,w,parent(f,w)) 5 w = parent(f,w) //sobe 6 }

Remoção Método remove do TAD fila de prioridade corresponde à remoção do Item da raiz O algoritmo de remoção consiste de 3 passos 1 Armazenar o conteúdo do nó raiz do heap (para retorno) 2 Copiar o conteúdo do w no nó raiz e remover o nó w 3 Restaurar ordem do heap (discutido a seguir)

Remoção Utilizar o último nó para substituição da raiz na remoção possui várias vantagens, entre elas

Remoção Utilizar o último nó para substituição da raiz na remoção possui várias vantagens, entre elas Completude garantida (passo 2)

Remoção Utilizar o último nó para substituição da raiz na remoção possui várias vantagens, entre elas Completude garantida (passo 2) Implementação em tempo constante através de arranjo (discutida posteriormente)

Restauração da Ordem (fix-down) Após a remoção, a propriedade de ordem do heap pode ser violada

Restauração da Ordem (fix-down) Após a remoção, a propriedade de ordem do heap pode ser violada A ordem do heap é restaurada trocando os itens caminho abaixo a partir da raiz

Restauração da Ordem (fix-down) O algoritmo fix-down Termina quando o Item movido para a raiz alcança um nó que não possui filho com chave maior que sua

Restauração da Ordem (fix-down) O algoritmo fix-down Termina quando o Item movido para a raiz alcança um nó que não possui filho com chave maior que sua Quando ambos os filhos possuem chave maior que o Item inserido, a troca é feita com o filho de maior chave

Remoção Algoritmo Remover(F,x) x = inicio(f) //retorna o primeiro nó inicio(f) = fim(f) //copia fim no início fix_down(f) //restaura ordem do heap

Restauração da Ordem (fix-up) Para um heap máximo, temos 1 Algoritmo fix_down(f) 2 w = inicio(f) 3 while(tem_filho(w)) { 4 m = maior_filho(w) 5 if(chave(w) >= chave(m)) break 6 swap(f,w,m) 7 w = m //desce 8 }

Implementação em Arranjo Sumário 1 TAD Fila de Prioridade 2 3 Implementação em Arranjo

Implementação em Arranjo Implementação em Arranjo Vetores podem ser empregados para representar árvores binárias Caminha-pela árvore nível por nível, da esquerda para direita armazenando os nós no vetor O primeiro nó fica na posição 0 do vetor, seu filho a esquerda fica na posição 1, e assim por diante...

Implementação em Arranjo Implementação em Arranjo Nessa definição, dado o indice de um item, podemos encontrar seu filho a esquerda : 2 indice + 1 filho a direita : 2 indice + 2 pai: (indice 1)/2

Implementação em Arranjo Implementação em Arranjo Como o Heap é uma árvore completa, o vetor não vai ter buracos faltando itens Os itens que faltam sempre ficam no fim do vetor

Implementação em Arranjo Implementação em Arranjo - Estrutura 1 typedef struct heap_estatica HEAP_ESTATICA; 2 3 #define TAM 100 4 5 struct heap_estatica { 6 ITEM * vetor[tam]; 7 int fim; 8 };

Implementação em Arranjo Implementação em Arranjo - Métodos Básicos 1 HEAP_ESTATICA *criar_heap() { 2 HEAP_ESTATICA *heap = (HEAP_ESTATICA*)malloc(sizeof(HEAP_ESTATICA)); 3 if (heap!= NULL) { 4 heap->fim = -1; 5 } 6 return heap; 7 } 8 9 int cheia(heap_estatica *heap) { 10 return (heap->fim == TAM - 1); 11 } 12 13 int vazia(heap_estatica *heap) { 14 return (heap->fim == -1); 15 }

Implementação em Arranjo Implementação em Arranjo - Inserção 1 int enfileirar(heap_estatica *heap, ITEM *item) { 2 if (!cheia(heap)) { 3 heap->fim++; 4 heap->vetor[heap->fim] = item; 5 fix_up(heap); 6 return 1; 7 } 8 9 return 0; 10 }

Implementação em Arranjo Implementação em Arranjo - Inserção 1 void swap(heap_estatica *heap, int i, int j) { 2 ITEM *tmp = heap->vetor[i]; 3 heap->vetor[i] = heap->vetor[j]; 4 heap->vetor[j] = tmp; 5 } 6 7 void fix_up(heap_estatica *heap) { 8 int pos = heap->fim; 9 int pai = (pos - 1) / 2; 10 11 while (pos > 0 && 12 heap->vetor[pos]->chave > heap->vetor[pai]->chave) { 13 swap(heap, pos, pai); 14 pos = pai; 15 pai = (pai - 1) / 2; 16 } 17 }

Implementação em Arranjo Implementação em Arranjo - Remoção 1 ITEM *desenfileirar(heap_estatica *heap) { 2 if (!vazia(heap)) { 3 ITEM *item = heap->vetor[0]; 4 heap->vetor[0] = heap->vetor[heap->fim]; 5 heap->fim--; 6 fix_down(heap); 7 return item; 8 } 9 return NULL; 10 }

Implementação em Arranjo Implementação em Arranjo - Remoção 1 void fix_down(heap_estatica *heap) { 2 int pos = 0; 3 4 while (pos <= heap->fim / 2) { 5 int filhoesq = 2 * pos + 1; 6 int filhodir = 2 * pos + 2; 7 8 int maiorfilho; 9 if (filhodir <= heap->fim && 10 heap->vetor[filhoesq]->chave < heap->vetor[filhodir]->chave ) { 11 maiorfilho = filhodir; 12 } else { 13 maiorfilho = filhoesq; 14 } 15 16 if (heap->vetor[pos]->chave >= heap->vetor[maiorfilho]->chave) { 17 break; 18 } 19 20 swap(heap, pos, maiorfilho); 21 pos = maiorfilho; 22 } 23 }

Implementação em Arranjo Comparação de Filas de Prioridade Via Lista Não-Ordenada Operação próximo insere remove Tempo O(n) O(1) O(n) Via Lista Ordenada Operação próximo insere remove Tempo O(1) O(n) O(1) Via Operação Tempo proximo O(1) insere O(log n) remove O(log n)

Implementação em Arranjo Exercício Implemente uma fila de prioridade que use um Heap dinâmico