pcc104 - projeto e análise de algoritmos · 2019. 9. 10. · na aula de hoje 1 filasdeprioridade...

36
PCC104 - Projeto e Análise de Algoritmos Marco Antonio M. Carvalho (baseado nas notas de aula do prof. Túlio A. M. Toffolo) Departamento de Computação Instituto de Ciências Exatas e Biológicas Universidade Federal de Ouro Preto 10 de setembro de 2019 Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 1 / 36

Upload: others

Post on 22-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

PCC104 - Projeto e Análise de Algoritmos

Marco Antonio M. Carvalho

(baseado nas notas de aula do prof. Túlio A. M. Toffolo)Departamento de Computação

Instituto de Ciências Exatas e BiológicasUniversidade Federal de Ouro Preto

10 de setembro de 2019

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 1 / 36

Page 2: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Avisos

Visualização dinâmica de estruturas de dados e algoritos:I https://visualgo.net/en

Site da disciplina:I http://www.decom.ufop.br/marco/

Lista de e-mails:I [email protected]

Para solicitar acesso:I http://groups.google.com/group/pcc104

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 2 / 36

Page 3: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Na aula de hoje

1 Filas de PrioridadeDescriçãoFormas de ImplementaçãoOperações e ComplexidadeExemplos

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 3 / 36

Page 4: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Avisos

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 4 / 36

Page 5: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

DescriçãoSão uma abstração de dados em que a chave de cada elemento refletesua habilidade relativa de abandonar o conjunto de elementos rapidamente.

Aplicações:I Sistemas operacionais usam filas de prioridades, nas quais as chaves

representam o tempo em que eventos devem ocorrer.I Métodos numéricos iterativos são baseados na seleção repetida de um

elemento com maior (menor) valor.I Sistemas de gerência de memória usam a técnica de substituir a

página menos utilizada na memória principal por uma nova página.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 5 / 36

Page 6: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

OperaçõesI Construir uma fila de prioridades a partir de um conjunto com n

elementos.I Informar qual é o elemento do conjunto com maior prioridade.I Remover o elemento de maior prioridade.I Inserir um novo elemento.I Alterar o valor da chave do elemento i para um novo valor que indique

maior prioridade que a atual.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 6 / 36

Page 7: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

OperaçõesI Substituir o elemento de maior prioridade por um novo elemento, a

não ser que o novo elemento tenha maior prioridade.I Alterar a prioridade de um elemento.I Remover um elemento qualquer.I Agrupar duas filas de prioridades em uma única.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 7 / 36

Page 8: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Complexidade:Lista linear ordenadaI Construir é O(nlogn).I Inserir é O(n).I Remover é O(1).I Alterar é O(n).

Complexidade:Lista linear não ordenadaI Construir é O(n).I Inserir é O(1).I Remover é O(n).I Alterar é O(n).

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 8 / 36

Page 9: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

HeapA melhor representação de uma fila de prioridade é por meio de umaestrutura de dados chamada heap:I Neste caso, construir um heap tem custo O(n).I Operações de inserção, remoção, substituição e alteração possuem

custo O(logn).

Para implementar a operação agrupar de forma eficiente e ainda preservarum custo logarítmico para as demais operações, é necessário utilizarestruturas de dados mais sofisticadas, tais como árvores binomiais(Vuillemin, 1978).

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 9 / 36

Page 10: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

HeapUm heap é uma árvore binária em que a chave de um nó filho é sempre:

1 menor ou igual do que a chave do nó pai, em um MaxHeap.2 maior ou igual do que a chave do nó pai, em um MinHeap.

ou seja:1 chave(v) ≤ chave(pai(v)) em um MaxHeap.2 chave(v) ≥ chave(pai(v)) em um MinHeap.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 10 / 36

Page 11: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Heap - CaracterísticasI Árvore binária quase completa.I O primeiro nó é chamado raiz.I Os nós são numerados de 0 a n-1 ou de 1 a n, dependendo do autor.

Nó raiz igual a zeroI Os nós 2k+1 e 2k+2 são os filhos à esquerda e à direita do nó k, para

0 < k ≤ n/2.I O nó (k-1)/2 é o pai do nó k, para 0 < k < n.

Nó raiz igual a umI Os nós 2k e 2k+1 são os filhos à esquerda e à direita do nó k, para

1 < k ≤ n/2.I O nó (k)/2 é o pai do nó k, para 1 < k ≤ n.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 11 / 36

Page 12: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

HeapAs chaves na árvore satisfazem a condição do [Max, Min]Heap:I A chave em cada nó é maior do que as chaves em seus filhos

(MaxHeap).I A chave no nó raiz é a maior chave do conjunto (MaxHeap).I Uma árvore binária quase completa pode ser representada por um

arranjo, conforme abaixo (note que a primeira posição é 1 na figura).

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 12 / 36

Page 13: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

HeapEsta representação é extremamente compacta:I Permite caminhar pelos nós da árvore facilmente.I Os filhos de um nó i estão nas posições 2i e 2i+1.I O pai de um nó i está na posição (i) / 2.I Na representação do heap em um arranjo, a menor (ou maior) chave

está sempre na posição 1.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 13 / 36

Page 14: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

HeapUm algoritmo elegante para construir o heap foi proposto por Floyd em1964.

O algoritmo não necessita de nenhuma memória auxiliar.

Dado um vetor A[0], A[1], ..., A[n-1]:I Os elementos A[n/2], A[n/2 + 1], ..., A[n-1] formam um heap válido

pois são nós folhas (nós que não possuem filhos).I Neste intervalo não existem dois índices i e j tais que j = 2i+1 ou j

= 2i+2.I O princípio do algoritmo é então incluir os elementos A[n/2 -1], A[n/2

-2], ..., A[0] no heap um a um, e, se necessário, reconstruir apropriedade do heap trocando os nós de lugar.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 14 / 36

Page 15: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Exemplo 1Vejamos a construção de um MinHeap a partir de um arranjo [9, 5, 6, 8, 3,2, 7].

0 1 2 3 4 5 69 5 6 8 3 2 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 15 / 36

Page 16: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - ConstruçãoOs elementos de A[3] a A[6] formam um heap válido.

0 1 2 3 4 5 69 5 6 8 3 2 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 16 / 36

Page 17: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - ConstruçãoI O heap é estendido para a esquerda (Esq = 2), englobando o

elemento 6 (A[2]), pai dos elementos A[5] e A[6].I A condição de heap é violada:

I O heap é refeito trocando os elementos A[2] e A[5].

0 1 2 3 4 5 69 5 6 8 3 2 7

0 1 2 3 4 5 69 5 2 8 3 6 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 17 / 36

Page 18: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - ConstruçãoI O heap é estendido para a esquerda (Esq = 1), englobando o

elemento 5 (A[1]).I A condição de heap é violada:

I O heap é refeito trocando os elementos A[1] e A[4].

0 1 2 3 4 5 69 5 2 8 3 6 7

0 1 2 3 4 5 69 3 2 8 5 6 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 18 / 36

Page 19: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - ConstruçãoI O heap é estendido para a esquerda (Esq = 0), englobando o

elemento 9 (A[0]).I A condição de heap é violada:

I O heap é refeito trocando os elementos A[0] e A[2].

0 1 2 3 4 5 69 3 2 8 5 6 7

0 1 2 3 4 5 62 3 9 8 5 6 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 19 / 36

Page 20: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - ConstruçãoI Como a condição ainda está sendo violada:

I O heap é refeito trocando os elementos A[2] e A[5].

I Como resultado, o heap foi construído.

0 1 2 3 4 5 62 3 6 8 5 9 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 20 / 36

Page 21: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Exemplo 2 - MaxHeap

1 2 3 4 5 6 7 8 9 104 1 3 2 16 9 10 14 8 7

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 21 / 36

Page 22: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

O nó A[4] viola a propriedade do heap, já que o pai é menor do que osfilhos.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 22 / 36

Page 23: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

O nó A[3] viola a propriedade do heap, já que o pai é menor do que osfilhos.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 23 / 36

Page 24: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

O nó A[2] viola a propriedade do heap, já que o pai é menor do que osfilhos.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 24 / 36

Page 25: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

O nó A[1] viola a propriedade do heap, já que o pai é menor do que osfilhos.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 25 / 36

Page 26: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Ao trocar A[1] por A[2], a propriedade do heap é novamente violada.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 26 / 36

Page 27: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

Ao trocar A[2] por A[4], a propriedade do heap é novamente violada.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 27 / 36

Page 28: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

A troca de A[4] por A[9] não gera mais violações e temos um heap válido.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 28 / 36

Page 29: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - InserçãoÉ necessário comparar o nó inserido com os pais e refazer enquanto ele formenor que o pai ou até que ele seja o nó raiz.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 29 / 36

Page 30: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - InserçãoNa pior das hipóteses o custo de uma inserção será O(logn), equivalente àaltura da árvore.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 30 / 36

Page 31: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - RemoçãoÉ necessário trocar o nó raiz pelo último nó do heap e remover o último nó.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 31 / 36

Page 32: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

MinHeap - RemoçãoÉ necessário refazer o heap! Na pior das hipóteses o custo de uma remoçãoserá O(logn), equivalente à altura da árvore

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 32 / 36

Page 33: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Construção

void heapConstroi(Telemento *v, int n) {int esq;esq = (n / 2) - 1; // esq = antecessor do primeiro

no folha do heapwhile (esq >= 0) {

heapRefaz(v, esq , n-1);esq --;

}}

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 33 / 36

Page 34: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Reconstrução

void heapRefaz(Telemento *v, int esq , int dir) {int i = esq;int j = i*2 + 1; // j = primeiro filho de i

Telemento aux = v[i]; // aux = no i (pai de j)

while (j <= dir) {if (j < dir && v[j].chave < v[j+1]. chave)

j++; // j recebe o outro filho de iif (aux.chave >= v[j].chave)

break; // o heap foi refeito corretamentev[i] = v[j];i = j;j = i*2 + 1; // j = primeiro filho de i

}v[i] = aux;

}

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 34 / 36

Page 35: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Filas de Prioridade

ExercícioDada a sequência de números 3 4 9 2 5 1 8, construa um max heap,passo-a-passo.

Em seguida, remova os 3 elementos prioritários.

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 35 / 36

Page 36: PCC104 - Projeto e Análise de Algoritmos · 2019. 9. 10. · Na aula de hoje 1 FilasdePrioridade Descrição FormasdeImplementação OperaçõeseComplexidade Exemplos Marco Antonio

Dúvidas?

Marco Antonio M. Carvalho (UFOP) PCC104 10 de setembro de 2019 36 / 36