Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Programação Dinámica Análise de algoritmos UNISUL
Ciência da Computação Prof. Maria Inés Castiñeira, Dra.
2
Exemplo: Fibonacci Números de Fibonacci Entrada: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 232
3
Fibonacci recursivo Solução clásica recursiva: Fib(n)
if n ≤1 then return n else return Fib(n – 1) + Fib(n - 2) 235
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? 236
5
Solução para Fibonacci
Árvore espaço das soluçoes para Fibonacci 237
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] ←n return f[n] ← Fib1(n – 1) + Fib1(n - 2)
8
Fibonacci f1 F5 F3 F4 % % % % % %
9
Fibonacci f1 F5 F4 F3 F3 F2 % % % % % %
10
Fibonacci f1 F5 F4 F3 F3 F2 F2 F1 % % % % % %
11
Fibonacci f1 F5 F4 F3 F3 F2 F2 F1 F1 F0 % % % % % %
12
Fibonacci f1 F5 F4 F3 F3 F2 F2 F1 F1 F0 1 % % % %
13
Fibonacci f1 F5 F4 F3 F3 F2 F1 F2 F1 F0 1 1 % % %
14
Fibonacci f1 F5 F4 F3 F3 F2 F1 F2 F1 F0 1 1 % % %
15
Fibonacci f1 F5 F4 F3 F3 F2 F1 F2 F1 F0 1 1 2 % %
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ções Podemos 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
18
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
19
Programação Dinámica Quando 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. .
20
Programação Dinámica Nesse 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 .
21
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). 273
23
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.