Professional Documents
Culture Documents
Programacin Dinmica
Programacin Dinmica
Solucin recursivo
int fib(int n){ if (n==0 || n==1) return 1; return fib(n-1)+fib(n-2); }
Fib(0) Fib(1)
Fib(0) Fib(1)
Programacin Dinmica
Fib(0)
3
Fib(0)
Solucin tabular
int fib(int n){ int * fibTab = new int[n]; fibTab[0]=fibTab[1]=1; for(int i=0;i<=n;i++) fibTab[i]=fibTab[i-1]+fibTab[i-2]; return fibTab[n]; }
Mucho ms eficiente!
Programacin Dinmica
Programacin Dinmica
Cmo multiplicar una secuencia de matrices de manera ptima? C = A*B A is d!e and B is e!f
e "1
f B
e e
O(def ) time d A
i,j f
6
Programacin Dinmica
Matrix Chain-Products
Producto encadenado de matrices:
! ! !
Calcular A=A0*A1**An-1 Ai es di ! di+1 Problema: Cmo agrupar (poner parntesis)? B es 3 ! 100 C es 100 ! 5 D es 5 ! 5 (B*C)*D necesita 1500 + 75 = 1575 ops B*(C*D) necesita 1500 + 2500 = 4000 ops
Ejemplo
! ! ! ! !
Programacin Dinmica
Estrategia exhaustiva
Algoritmo:
!
! !
Intentar todas las posibles formas de agrupar A=A0*A1**An-1 Calcular el nmero de ops para cada una Escoger la mejor El nmero de parentizaciones es igual al nmero de rboles binarios con n nodos. Esto es exponencial Aproximadamente 4n (nmeros de Cataln).
Programacin Dinmica 8
Tiempo de ejecucin
!
! !
Estrategia voraz
Idea #1: repetidamente seleccionar el producto que use el mayor nmero de ops. Contra-ejemplo:
! ! ! ! !
A is 10 ! 5 B is 5 ! 10 C is 10 ! 5 D is 5 ! 10 Idea voraz #1 da (A*B)*(C*D), que produce 500+1000+500 = 2000 ops A*((B*C)*D) produce 500+250+250 = 1000 ops
Programacin Dinmica 9
A is 101 ! 11 B is 11 ! 9 C is 9 ! 100 D is 100 ! 99 Idea voraz #2 da A*((B*C)*D)), el cual produce 109989+9900+108900=228789 ops (A*B)*(C*D) produce 9999+89991+89100=189090 ops
Encuentre la mejor parentizacin de Ai*Ai+1**Aj. Sea Ni,j el nmero de operaciones ptimas para este subproblema. La solucin ptima del problema total es es N0,n-1.
Subproblemas ptimos: La solucin ptima puede ser definida en trminos de subproblemas ptimos.
!
Tiene que haber una multiplicacin final (raz del rbol de la expresin) para la solucin ptima. Digamos que la multiplicacin final sea en el ndice i: (A0**Ai)*(Ai+1**An-1). La solucin ptima N0,n-1 es la suma de 2 subproblemas ptimos, N0,i and Ni+1,n-1 mas el nmero de operaciones de la ltima multiplicacin. S el ptimo global no tiene estos componentes ptimos nosotros podemos definir una mejor solucin ptima.
Programacin Dinmica 11
Ecuacin recursiva
El ptimo global se debe definir en trminos de subproblemas ptimos, dependiendo en el lugar de la ltima multiplicacin. Consideremos todas los posibles lugares para la multiplicacin final: ! Recuerde que Ai es una matriz di ! di+1.
!
12
Algoritmo en accin
La estrategia bottom-up llena la matriz N por diagonales Ni,j obtiene valores basados en valores previos en la i-sima fila y la j-sima columna La obtencin de la parentizacin ptima puede ser hecho recordando la k correspondiente a cada casilla
N
0 1 i
i !k < j
1 2
n-1
solucin
n-1
Programacin Dinmica
14
Subproblemas simples: los subproblemas puden ser definidos en trminos de pocas variables. Optimalidad de subproblemas: El ptimo global puede ser definido en trminos de subproblemas ptimos Sobrelapamiento de subproblemas: Los problemas no son independientes (por lo tanto, la solucin debe construirse de abajo hacia arriba).
Programacin Dinmica 15