Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C –...

34
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 1/34 Estruturas de Dados 2 Algoritmos Gulosos

Transcript of Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C –...

Page 1: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 1/34

Estruturas de Dados 2

Algoritmos Gulosos

Page 2: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 2/34

Algoritmos Gulosos● Introdução

● Técnica de Projeto de Algoritmos utilizada para Problemas de Otimização;

● Idéia: Quando é necessário fazer uma escolha durante o processo de otimização, escolher a opção que pareça ser a melhor no momento.

● Ou seja, fazer a escolha ótima local, esperando que isto leve à solução ótima global.

Page 3: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 3/34

Algoritmos Gulosos

● Introdução:● A escolha realizada por este algoritmo é, portanto,

dita “gulosa” (Greedy Algorithms)● Propriedade da escolha gulosa: deve garantir que a

cada iteração é tomada uma decisão que irá levar a um ótimo global.

● Em um algoritmo guloso uma escolha que foi feita nunca é revista, ou seja, não há qualquer tipo de reavaliação.

Page 4: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 4/34

Algoritmos Gulosos

● Introdução:● Em cada passo a escolha a ser feita deve ser:

– Possível, (satisfaz as restrições do problema);– Localmente ótima, (deve ser a melhor escolha

possível dentre as disponíveis neste passo);– Irreversível, (não pode ser alterada nos passos

subseqüentes do algoritmo).

Page 5: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 5/34

Algoritmos Gulosos

● Cuidados:● Nem sempre a abordagem “Gulosa” leva à uma solução “ótima” do problema (é muitas vezes considerada uma “Técnica Heurística”)

● Em algumas situações, entretanto, esta técnica resolve o problema, e de uma maneira muito eficiente;

● Alternativamente, a técnica de “Programação Dinâmica” pode ser utilizada, quando a abordagem gulosa não for adequada;

● Veremos as situações específicas mais adiante!

Page 6: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 6/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:

● O problema da Seleção de Atividades: dado um conjunto de atividades, definidas por seus tempos de início e fim, alocar o maior número possível de atividades em um período de tempo definido; (por exemplo, um conjunto de palestras que devem ser alocadas em um auditório)

Page 7: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 7/34

Algoritmos Gulosos

● Exemplo do problema da Seleção de Atividades

Page 8: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 8/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:

Page 9: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 9/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:

Page 10: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 10/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:●

Page 11: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 11/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:●

Page 12: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 12/34

Algoritmos Gulosos

● Exemplo de Aplicação da Técnica:

Page 13: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 13/34

Algoritmos Gulosos - Código de Huffman

● Outro Exemplo de Aplicação da Técnica:● Algoritmo “Guloso” de Huffman

– Técnica para compressão de dados.– A partir de uma tabela das freqüências em que

ocorrem os caracteres, elabora uma representação mínima para o caractere mais comum, um pouco maior para o segundo mais comum, e assim por diante....(Cada caractere é representado como uma cadeia binária).

– Ex. Compactar arquivos texto grandes

Page 14: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 14/34

Algoritmos Gulosos - Código de Huffman

● Exemplo: Armazenar um arquivo de 100.000 caracteres● Representando cada caractere:

– código de comprimento fixo (3 bits) = 300.000 bits– código de comprimento variável = 224.000 bits

Page 15: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 15/34

Algoritmos Gulosos - Código de Huffman

● Códigos de Prefixo– Códigos nos quais nenhuma palavra de código é

prefixo de alguma outra palavra de código.

– A codificação simples: concatenação das palavras de código que representam cada caractere do arquivo.

– Ex: codificação do arquivo de 3 caracteres abc como 0 .101 . 100 = 0101100, onde “.” indica concatenação.

Page 16: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 16/34

Algoritmos Gulosos - Código de Huffman

● Códigos de Prefixo– Como nenhuma palavra de código é um prefixo de

qualquer outra, a palavra de código que inicia um arquivo codificado, não é ambígua.

– Ex: A cadeia 001011101 = ????

– O processo de decodificação precisa de uma representação conveniente para o código de prefixo, de forma que a palavra de código inicial possa ser extraída com facilidade ...(Qual?)

Page 17: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 17/34

Algoritmos Gulosos - Código de Huffman

● Códigos de Prefixo– Como nenhuma palavra de código é um prefixo de

qualquer outra, a palavra de código que inicia um arquivo codificado, não é ambígua.

– Ex: A cadeia 001011101 = ????

– O processo de decodificação precisa de uma representação conveniente para o código de prefixo, de forma que a palavra de código inicial possa ser extraída com facilidade

– Árvore Binária

Page 18: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 18/34

Algoritmos Gulosos - Código de Huffman

Page 19: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 19/34

Algoritmos Gulosos - Código de Huffman

● Huffman criou um algoritmo guloso que produz um código de prefixo ótimo chamado código de Huffman.

– No pseudocódigo, C é um conjunto de n caracteres e cada caractere c ∈ C é um objeto com uma freqüência definida f [c].

– O algoritmo constrói de baixo para cima a árvore T correspondente ao código ótimo.

Page 20: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 20/34

Algoritmos Gulosos - Código de Huffman

● Começa com um conjunto de |C| folhas e executa uma seqüência de |C|–1 operações de intercalação para criar a árvore final.

● Uma fila de prioridade mínima Q, tendo f como chave, é usada para identificar os dois objetos menos freqüentes a serem intercalados. O resultado da intercalação é um novo objeto cuja freqüência é a soma das freqüências dos 2 objetos que foram intercalados.

Page 21: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 21/34

Algoritmos Gulosos - Código de Huffman

Page 22: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 22/34

Algoritmos Gulosos - Código de Huffman

Page 23: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 23/34

Algoritmos Gulosos

● Outro Exemplo de Aplicação da Técnica:● O problema do câmbio: como trocar uma determinada quantidade de dinheiro no menor número de moedas possíveis;

Page 24: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 24/34

Algoritmos Gulosos

● Outro Exemplo de Aplicação da Técnica:● O problema da mochila fracional:Você é um ladrão, que consegue entrar no cofre de um banco carregando uma mochila com capacidade para X quilos. Dados “sacos” contendo X,Y e Z quilos de “pó” de metais valiosos (ouro, prata, bronze), maximize seu “roubo”, colocando o maior valor possível em sua mochila!

Page 25: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 25/34

Algoritmos Gulosos

● Problema da Mochila Fracional– Podemos pegar uma fração de um item.– Ambos possuem uma subestrutura ótima.– O problema da mochila fracional tem a propriedade

da escolha gulosa.– Para resolver o problema fracional, ordenar itens

pelo valor/peso: vi /w

i .

– Seja vi /w

i ≥ v

i+1 /w

i+1 para todo i.

Page 26: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 26/34

Algoritmos Gulosos● O problema da mochila fracional:

●Tempo: O(n lg n) para ordenar, O(n) daí em diante.

Page 27: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 27/34

Algoritmos Gulosos

● Outro Exemplo (é possível aplicar da Técnica?)● O problema da mochila binária(Não fracionável):Você é um ladrão, que consegue entrar no cofre de um banco carregando uma mochila com capacidade para X quilos(ou x metros cúbico). No cofre há X, Y e Z barras de metais valiosos (ouro, prata, bronze), cada um a com tamanho X1, Y1, Z1). Maximize seu “roubo”, colocando o maior valor possível em sua mochila!

Page 28: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 28/34

Algoritmos Gulosos

● Outro Exemplo (é possível aplicar da Técnica?)● O problema da mochila binária(Não fracionável): Como não é possível pegar apenas uma “parte” de uma barra, para preencher o espaço restante da mochila, este problema não possui a propriedade da escolha gulosa, não gerando solução ótima ao aplicar esta técnica.

Page 29: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 29/34

Algoritmos Gulosos

●Exemplo do problema da mochila binária:

Page 30: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 30/34

Algoritmos Gulosos

●Exemplo do problema da mochila binária:

Page 31: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 31/34

Algoritmos Gulosos - Resumo● 1. Formule o problema como um problema de otimização no qual uma escolha é feita, restando-nos então um único subproblema a resolver.● 2. Provar que existe sempre uma solução ótima do problema que atende à escolha gulosa, ou seja, a escolha feita pelo algoritmo guloso é segura.● 3. Demonstrar que, uma vez feita a escolha gulosa, o que resta a resolver é um subproblema tal que se combinarmos a resposta otina deste subproblema com o(s) elemento(s) da escolha gulosa, chega-se à solução ótima do problema original.● Esta é a parte que requer mais engenhosidade ! Normalmente a

prova começa com uma solução ótima genérica e mostra que ela pode ser modicada (possivelmente após vários passos) até que ela inclua o(s) elemento(s) identificado(s) pela escolha gulosa.

Page 32: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 32/34

Algoritmos Gulosos - Agradecimentos

● Estes slides são baseados no material disponibilizado pelos profs. Cid Carvalho de Souza e Cândida Nunes da Silva, da UNICAMP.

● Qualquer incorretude é, entretanto, de inteira responsabilidade do prof. João Alberto Fabro, da UTFPR.

Page 33: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 33/34

Algoritmos Gulosos - Exercícios● Apagando e Ganhando: ● Apagando e Ganhando é um programa de auditório

muito inteligente. Os participantes são selecionados por sorteio, e o apresentador escreve em uma lousa um número de N dígitos. O participante deve então apagar D dígitos do número que está na lousa. Os números que restarem equivalem ao prêmio em dinheiro que ele leva para casa!

● Exemplo: Número na lousa: 1 2 3 1 2 3 9● Dígitos a serem apagados: 3● Total a ser levado para casa: 1 2 3 1 2 3 9 = 3239!

Page 34: Estruturas de Dados 2 - dainf.ct.utfpr.edu.brfabro/ensino/Estrutura_de_Dados_2/... · IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro

IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 34/34

Algoritmos Gulosos - Exercícios● Apagando e Ganhando: ● Outro Exemplo: Número na lousa: 1 0 0 0 0 0 1 9Dígitos a serem apagados: 4Total a ser levado para casa: 1 0 0 0 0 0 1 9= 1019!

Desenvolva um algoritmo utilizando a abordagem “gulosa” para resolver este problema!