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

Preview:

Citation preview

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/

Recommended