Upload
dinhhuong
View
215
Download
0
Embed Size (px)
Citation preview
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 1/34
Estruturas de Dados 2
Algoritmos Gulosos
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.
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.
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).
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!
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)
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
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:
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:
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:●
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:●
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:
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
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
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.
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?)
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
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 18/34
Algoritmos Gulosos - Código de Huffman
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.
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.
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 21/34
Algoritmos Gulosos - Código de Huffman
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 22/34
Algoritmos Gulosos - Código de Huffman
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;
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!
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.
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.
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!
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.
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:
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:
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.
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.
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!
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!