Sei sulla pagina 1di 4

Estructuras de Datos.

Programacion Dinamica

2009

Programaci
on Din
amica

Una desventaja de la tecnica de Divide & Conquer es que cuando se resuelven por separado
varios subproblemas puede suceder que surjan los mismos suproblemas en ramas separadas
y se calcule mas de una vez su solucion.
La idea de la tecnica de Programacion Dinamica es evitar resolver un subproblema mas
de una vez. Esto se logra manteniendo una tabla con las soluciones de subproblemas ya
encontradas.
En general, los algoritmos de programacion dinamica construyen la solucion del problema
original de manera bottom-up, primero resuelven los subproblemas de tama
no mnimo, y
usando los resultados construyen soluciones a problemas de tama
no progresivamente mayor.

A veces la tecnica Divide & Conquer termina resolviendo un mismo subproblema


mas de una vez.
Se puede evitar esto recordando la solucion de cada subproblema resuelto.
Para muchos problemas solo existe una cantidad de orden polinomial de subproblemas
posibles.
En esos casos es factible resolver todos los subproblemas y recordar sus soluciones.
La tecnica de Programacion Dinamica resuelve problemas de tama
no progresivamente
mayor comenzando con los subproblemas de tama
no mnimo.
Es menos general que las otras tecnicas vistas: no tiene aplicaciones practicas a los
problemas de b
usqueda y ordenacion,

1.1

C
alculo de N
umeros Combinatorios

El problema es calcular


n
k


=

n!
(0 k n)
k!(n k)!

Sabiendo que


1.1.1

n
k


 

n1
n1

+
0<k<n
k1
k
=

1
k =0k =n

Algoritmo Divide & Conquer

1 procedure comb ( n , k )
2
i f k = 0 or k = n then
3
return 1;
4
else
5
r e t u r n comb ( n1, k1) + comb ( n1, k ) ;
6
end
7 end
 
n
k

n2
k2

n1
k1

n1
k






n2
n2
n2
k1
k1
k
| {z }
| {z }
subproblema repetido subproblema repetido

Un mismo subproblema se repite mas de una vez.



T (n, k): Cantidad de llamadas al procedimiento comb para calcular


n
k


.

1
k =0k =n
1 + T (n 1, k 1) + T (n 1, k) 0 < k < n
 
 
n
n
Se puede probar que T (n, k) = 2
1=O
k
k
T (n, k) =

1.1.2

Programaci
on Din
amica

Figure 1: Tabla que usa el algoritmo



Se construye progresivamente una tabla con todos los valores de

i
j


para i 0 . . . n, j

0 . . . k, siguiendo el procedimiento siguiente:


1. Se completan con unos las entradas correspondientes a j = 0 y la entrada para
i=j=1
2. Se calculan las entradas siguientes en orden progresivo del valor i + j
Como (i 1) + (j 1) < (i 1) + j < i + j, una vez completada la tabla hasta las entradas
con suma i+ j 1, 
es posible
 completar
 las entradas con suma i + j porque se conocen los
i1
i1
valores de
y de
.
j1
j
1 procedure comb ( n , k )
2
for i :=1 to n do
3
c ( i , 0 ) := 1 ;
4
end
5
c ( 1 , 1 ) := 1 ;
6
7
sum := 3 ; i := 2 ; j := 1 ;
8
while sum <= n+k do
9
c ( i , j ) := c ( i 1, j 1)+c ( i 1, j ) ;
10
i := i 1; j := j +1;
3

11
i f i < j or j > k then
12
sum := sum + 1 ;
13
i f sum <= n+1 then
14
i := sum1; j := 1 ;
15
else
16
i := n ; j := sumn ;
17
end
18
end
19
end
20
end
21
22
return c (n , k)
23 end
La condicion del if dentro del bucle se cumple cuando se llega al final de la diagonal
correspondiente a la sum, bien porque se llego a la diagonal de la tabla o bien porque se
alcanzo el valor de k.
Dentro del if, se incrementa la suma y se actualizan los ndices i y j. Hay dos casos, cuando
la diagonal correspondiente a sum comienza por arriba de n, y cuando comienza por debajo.
Sea T (n, k) la cantidad de actualizaciones de entradas de la tabla que realiza el algoritmo.
T (n, k) =

n
X

i = n(k + 1) k(

i=nk

k+1
) = O(nk)
2

La mejora

es significativa, para n = 20, k = 10, el algoritmo Divide & Conquer real20
iza
= 184756 llamadas recursivas, mientras que el algoritmo de Programacion
10
Dinamica realiza solo 165 actualizaciones a la tabla.

Referencias
[AHU83] Alfred V. Aho, J. E. Hopcroft, and Jeffrey D. Ullman. Data Structures and
Algorithms. Addison-Wesley, 1983.
[CSRL01] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson.
Introduction to Algorithms. McGraw-Hill Higher Education, 2nd edition, 2001.
[Sed92]

Robert Sedgewick. Algorithms in C++. Addison-Wesley, 1992. ISBN: 0-20151059-6.

Potrebbero piacerti anche