Sei sulla pagina 1di 4

Calculando la serie de

Fibonacci
1,1,2,3,5,8,13,21,.
Programacin Dinmica
Adaptado de
Algorithm Design Goodrich and Tamassia
1 si n = 0,1
fib(n) =
fib(n -1) + fib(n - 2) o.c.

Programacin Dinmica 1
Programacin Dinmica 2

Solucin recursivo Solucin tabular


int fib(int n){ int fib(int n){
if (n==0 || n==1) return 1; int * fibTab = new int[n];
return fib(n-1)+fib(n-2); fibTab[0]=fibTab[1]=1;
} for(int i=0;i<=n;i++)
Muy ineficiente pues recalcula el mismo resultado fibTab[i]=fibTab[i-1]+fibTab[i-2];
muchas veces. return fibTab[n];
}
Fib(5)

Fib(4) Fib(3)
Mucho ms eficiente!
Fib(3) Fib(2) Fib(2) Fib(0)

Fib(2) Fib(0) Fib(1) Fib(0) Fib(1) Fib(0)

Fib(1) Fib(0)
Programacin Dinmica 3 Programacin Dinmica 4
Multiplicacin ptima de
Solucin usando memoizacin Matrices
Problema:
int fib(int n){ n Cmo multiplicar una secuencia de matrices
int * fibTab = new int[n]; de manera ptima?
for(int i=0;i<=n;i++)
f
Repaso: Multiplicacin de matrices
fibTab[i]= -1;
n C = A*B B
return lookupFib(fibTab,n);
}
n A is de and B is e f
j
int lookupFib(int fibTab[],int n){ e -1 e
if (fibTab[n]!= -1) return fibTab[n]; C[i, j ] = A[i, k ] * B[k , j ]
fibTab[n]=lookupFib(fibTab,n-1)+ k =0
lookupFib(fibTab,n-2); e
return fibTab[n]; n O(def ) time
} A C
d i i,j d

Programacin Dinmica 5 Programacin Dinmica f 6

Matrix Chain-Products Estrategia exhaustiva


Producto encadenado de matrices: Algoritmo:
n Calcular A=A0*A1**An-1 n Intentar todas las posibles formas de
n Ai es di di+1 agrupar A=A0*A1**An-1
n Problema: Cmo agrupar (poner parntesis)? n Calcular el nmero de ops para cada una
Ejemplo n Escoger la mejor
B es 3 100
n
Tiempo de ejecucin
n C es 100 5
n El nmero de parentizaciones es igual al
n D es 5 5
nmero de rboles binarios con n nodos.
n (B*C)*D necesita 1500 + 75 = 1575 ops
n Esto es exponencial
n B*(C*D) necesita 1500 + 2500 = 4000 ops
n Aproximadamente 4n (nmeros de
Cataln).
Programacin Dinmica 7 Programacin Dinmica 8
Estrategia voraz Otra estrategia voraz
Idea #1: repetidamente seleccionar el Idea #2: repetidamente seleccionar el producto que use
producto que use el mayor nmero de ops. el menor nmero de ops.
Contra-ejemplo: Contra-ejemplo:
n A is 10 5 n A is 101 11
B is 11 9
n B is 5 10 n

n C is 9 100
n C is 10 5
n D is 100 99
n D is 5 10
n Idea voraz #2 da A*((B*C)*D)), el cual produce
n Idea voraz #1 da (A*B)*(C*D), que produce 109989+9900+108900=228789 ops
500+1000+500 = 2000 ops n (A*B)*(C*D) produce 9999+89991+89100=189090 ops
n A*((B*C)*D) produce 500+250+250 = 1000 ops Una estrategia voraz definitivamente no funciona.

Programacin Dinmica 9 Programacin Dinmica 10

Una estrategia Recursiva Ecuacin recursiva


Defina subproblemas: El ptimo global se debe definir en trminos de
n Encuentre la mejor parentizacin de A i*A i+1 **Aj. subproblemas ptimos, dependiendo en el lugar de la
n Sea N i,j el nmero de operaciones ptimas para este subproblema. ltima multiplicacin.
n La solucin ptima del problema total es es N 0,n-1 . Consideremos todas los posibles lugares para la
Subproblemas ptimos: La solucin ptima puede ser definida multiplicacin final:
en trminos de subproblemas ptimos.
n Recuerde que A i es una matriz d i di+1 .
n Tiene que haber una multiplicacin final (raz del rbol de la expresin)
para la solucin ptima. n De manera que una definicin recursiva de Ni,j es la siguiente:
n Digamos que la multiplicacin final sea en el ndice i:
(A 0**A i)*(A i+1 **An-1 ).
La solucin ptima N 0,n-1 es la suma de 2 subproblemas ptimos, N 0,i
N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}
n i k < j
and Ni+1,n-1 mas el nmero de operaciones de la ltima multiplicacin.
n S el ptimo global no tiene estos componentes ptimos nosotros
podemos definir una mejor solucin ptima. Note que los subproblemas son no independientes --
los subproblemas se sobreponen.
Programacin Dinmica 11 Programacin Dinmica 12
Un algoritmo de
programacin dinmica Algoritmo en accin
Puesto que los N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}
subproblemas se La estrategia bottom-up i k < j
Algorithm matrixChain(S): solucin
sobreponen, no se usa
Input: sequence S of n matrices to be multiplied llena la matriz N por N 0 1 2 j
n-1
recursin.
Output: number of operations in an optimal diagonales 0
En cambio, se
construyen los paranethization of S Ni,j obtiene valores 1

subproblemas ptimos for i 1 to n-1 do basados en valores
de abajo hacia arriba previos en la i-sima fila i
Ni,i 0
bottom-up.
for b 1 to n-1 do y la j-sima columna
Los N i,i s son fciles,
de manera que se for i 0 to n-b-1 do La obtencin de la
empieza con ellos. j i+b parentizacin ptima
Seguir con Ni,j +infinity puede ser hecho
subproblemas de recordando la k
longitud 2,3, etc. for k i to j-1 do n-1
correspondiente a cada
Tiempo de ejecucin: Ni,j min{Ni,j , Ni,k +Nk+1,j +di dk+1 dj+1}
casilla
O(n3)

Programacin Dinmica 13 Programacin Dinmica 14

Tcnica General de
Programacin Dinmica
Aplica a un problema que inicialmente pareciera
requerir una gran cantidad de tiempo
(posiblemente exponencial) y que debe
cumplir:
n Subproblemas simples: los subproblemas puden
ser definidos en trminos de pocas variables.
n Optimalidad de subproblemas: El ptimo global
puede ser definido en trminos de subproblemas
ptimos
n Sobrelapamiento de subproblemas: Los
problemas no son independientes (por lo tanto, la
solucin debe construirse de abajo hacia arriba).

Programacin Dinmica 15

Potrebbero piacerti anche