Baixe 11 - programação - dinamica e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity!
Análise e Técnicas de Algoritmos
Tiago Massoni Jorge Figueiredo
Projeto de Algoritmos
Programação Dinâmica
Programação dinâmica
• Quando “programação” significava
método tabular
– também chamado planejamento dinâmico
• não é programação de computadores
• usado em problemas de otimização
– Achar solução com valor ótimo
– Minimização ou maximização
Sobre a Solução Apresentada
• Análise através da resolução de uma
relação de recorrência
– T(n) = T(n – 1) + T(n – 2) + c
– O(
n
Qual o motivo da ineficiência?
Solução alternativa para
Fibonacci
- Eliminar as chamadas recursivas
- Utilizar um vetor para armazenar dados calculados
- Estratégia bottom-up
- Armazena soluções para subproblemas
- aos poucos, vai definindo o resultado do problema a partir dos resultados dos subproblemas armazenados FibPD(n) f[0] 0 f[1] 1 for i 2 to n do f[i] f[i – 1] + f[i - 2] return f[n] Exemplo: n=
Análise
• É fácil identificar que FibPD é O(n)
• Abordagem utilizada
– Encontrar função recursiva apropriada
– memorização para armazenar resultados de
subproblemas
– Determinar uma versão bottom-up, iterativa
FibPD é PROGRAMAÇÃO DINÂMICA!
Programação Dinâmica
• Aplicado quando recursão produz
repetição dos mesmos subproblemas
• Proposta: reusar computação
• PD = D-C + tabela
• usar quando ocorre a resolução de um
mesmo subproblema (cálculo) muitas
vezes
– Então, melhor armazenar as soluções
Exercício PD
Número de Combinações (coeficiente binomial) Entrada: Dois números inteiros n e k, em que n indica o número de elementos dos quais tenho que escolher k. Saída: O número possível de combinações de k itens.
• Para escolher k itens de n, podemos
proceder de duas formas:
- Escolher o primeiro item. Depois escolher k-1 itens dos n-1 itens restantes
- Não escolher o primeiro item. Escolher, então, k itens dos n-1 itens restantes
Análise do Algoritmo D-C
T(n) = 2.T(n-1) + c T(n) = O( n )
• Cálculos repetidos
- Ex: C(5,3) por C(4,2) e C(4,3), e ambos usam C(3,2)
• Solução: Programação Dinâmica
Exercicio
• fazer o algoritmo PD bottom-up para
calcula C(n,k)
• Dica: tabela é um triângulo de Pascal
n/k 0 1 2 3 … k 0 1 1 1 1 2 1 2 1 3 1 3 3 1 … n C(n-1,k-1) C(n-1,k)
C(n,k)
PD em otimização
Sobreposição de subproblemas
O problema pode ser quebrado em
subproblemas que são reutilizados várias
vezes
Subestrutura ótima
Uma solução ótima pode ser construída a partir
de soluções ótimas para seus subproblemas
solução com subestrutura ótima
Subconjunto máximo em S a partir de
{1...n}
se X é máximo e contém um elemento n
então X−{n} é um elemento máximo de S/n
troco agora em PD
6c 4c 1c
total: US$ 0,
ótima!
greedy
subestrutura ótima
para um valor N do troco desejado
- se existe um moeda de N cents, então uma moeda é o mínimo
- senão, para um valor x < N e moeda i, considerar dois subproblemas - mínimo número de moedas sem incluir moeda i - mínimo número de moedas incluindo a moeda i
- Escolher o menor resultado!