análise de algoritmos programação dinámica unisul ciência da computação prof. maria inés...
Post on 17-Apr-2015
117 Views
Preview:
TRANSCRIPT
Análise de algoritmos
Programação Dinámica
UNISUL
Ciência da Computação
Prof. Maria Inés Castiñeira, Dra.
2
Exemplo: Fibonacci
Números de FibonacciEntrada:Um número inteiro n.Saída:O número de Fibonacci Fn, definido
da seguinte forma:
F0 = 0, F1= 1, Fn= Fn-1+ Fn-2 para n ≥2
3
Fibonacci recursivo Solução clásica recursiva:
Fib(n)if n ≤1 then return n else return Fib(n – 1) + Fib(n - 2)
4
Análise de Fibonacci
• Análise através da resolução de uma relação de recorrência:
– T(n) = T(n – 1) + T(n – 2) + c– O(2^n)• Solução ineficiente.
Qual o motivo da ineficiência?
5
Solução para Fibonacci
Árvore espaço das soluçoes para Fibonacci
6
Solução ineficiente Cálculos repetidos!
7
Solução Fibonacci alternativa
• Solução alternativa:– Utilizar um array f[0, ..., n] para guardar os
valores calculados.– Inicialmente, f contém apenas símbolos
especiais ∞.Fib1(n)if f[n] ≠ ∞ then return f[n]if n ≤ 1 then return f[n] ←nreturn f[n] ← Fib1(n – 1) + Fib1(n - 2)
8
Fibonacci f1
F3F4
F5
% % % % % %
9
Fibonacci f1
F3F4
F5
% % % % % %
F2F3
10
Fibonacci f1
F3F4
F5
% % % % % %
F2F3
F1F2
11
Fibonacci f1
F3F4
F5
% % % % % %
F2F3
F1F2
F0F1
12
Fibonacci f1
F3F4
F5
0 1 % % % %
F2F3
F1F2
F0F1
13
Fibonacci f1
F3F4
F5
0 1 1 % % %
F2F3
F1F2
F0F1
14
Fibonacci f1
F3F4
F5
0 1 1 % % %
F2F3
F1F2
F0F1
15
Fibonacci f1
F3F4
F5
0 1 1 2 % %
F2F3
F1F2
F0F1
16
Fibonacci f2 Uma outra solução alternativa:
– Eliminar as chamadas recursivas.
– Utilizar o array para armazenar dados calculados.
– Estratégia bottom-up.
Fib2(n)f[0] ←0
f[1] ←1
For i ←2 to n do
f[i] ←f[i – 1] + f[i - 2]
return f[n]
17
Comparando soluçõesPodemos identificar que Fib2 é O(n).
Fib1 é também O(n). Ainda usa recursão.
Abordagem utilizada:
– Encontrar função recursiva apropriada.
– Adicionar memorização para armazenar resultados de subproblemas.
– Determinar uma versão bottom-up, iterativa
Programação dinâmica
• Fib2 é PROGRAMAÇÃO DINÂMICA!!!!!
• Programação dinâmica = resolver bottom-up, usar estrutura auxiliar (tabela ou array) para guardar valores intermediários
Programação DinámicaQuando a soma dos tamanhos dos
subproblemas é O(n) então é provável que o algoritmo recursivo tenha complexidade polinomial.
Quando a divisão de um problema de tamanho n resulta em n subproblemas de tamanho n-1 então é provável que o algoritmo recursivo tenha complexidade exponencial.
.
Programação DinámicaNesse caso, a técnica de programação dinâmica
pode levar a um algoritmo mais eficiente.
A programação dinâmica calcula a solução para todos os subproblemas, partindo dos subproblemas menores para os maiores, armazenando os resultados em uma tabela.
A vantagem é que uma vez que um subproblema é resolvido , a resposta é armazenada em uma tabela e nunca mais é recalculado .
Programação dinâmica
• Aplicado quando recursão produz repetição dos mesmos subproblemas.
• Proposta: reusar computação.• PD = DC + tabela.• Versão bottom-up é mais compacta e
fácil de efetuar análise.• Estratégia utilizada em problemas de
otimização.
22
Quando aplicar Prog. Dinâmica?Aplicar em problemas que, em princípio, parece
requerer muito tempo para ser resolvido (em geral é de ordem exponencial).
Principais características: Princípio da Otimalidade (subproblemas
ótimos): o valor ótimo global pode ser definido em termos dos valores ótimos dos subproblemas.
Overlap de Subproblemas:os subproblemas não são independentes. Existe um overlap entre eles (logo, devem ser construídos bottom-up).
Bibliografia
• Cormen, Leiserson e Rivest, ALGORITMOS: teoria e prática. Rio de Janeiro: Campus, 2002.
• FIGUEREDO, Jorge. Material didático de Técnicas e análise de algoritmos. UFCG. Disponível em www.dsc.ufcg.edu.br/~abrantes/
top related