Análise de algoritmos Programação Dinámica UNISUL Ciência da Computação Prof. Maria Inés...

Post on 17-Apr-2015

120 views 10 download

Transcript of Análise de algoritmos Programação Dinámica UNISUL Ciência da Computação Prof. Maria Inés...

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/