Vous êtes sur la page 1sur 21

Universidad

Da Vinci Dr. Vicente Cubells (vcubells@udavinci.edu.mx)

Temario
Tcnicas de diseo de algoritmos Divide y Vencers Programacin dinmica

Introduccin
Al desarrollar un algoritmo computacional que nos

permita resolver un problema, podemos tomar ventaja de diferentes tcnicas Estas tcnicas nos dan una gua para poder desarrollar de manera ms rpida, una buena solucin

Divide y Vencers
Divide and Conquer Es una tcnica para el diseo de algoritmos. El principio en el que se basa es el siguiente:
Es ms fcil resolver varios casos pequeos de un problema que un

solo caso grande.

El enfoque de divide y vencers est formado por etapas:


Dividir el problema en ejemplares ms pequeos. Resolver los problemas pequeos. Combinar las soluciones parciales para obtener la solucin al

problema original.

Se resuelve directamente para un caso simple o se divide el problema en 2 o ms subproblemas.

Divide y Vencers
Ejemplo de diseo de algoritmo del problema I:

resolver(I) { n = tamao(I); if( n <= pequeo ) solucion = resolverDirecto(I); else { dividir I en I1, I2, ...Im. Para toda i: si = resolver(Ii); solucion = combinar(s1, s2,..., sm); } return solucion; }

Divide y Vencers
Ejemplo donde se quieren dibujar las divisiones de

una regla de la siguiente manera:

Se comienza por ejemplo con una regla que va de 0 a

30 cms, que se divide a la mitad y se hace una marca de altura h.

Divide y Vencers
Luego cada mitad, es decir de 0 a 15cms. y de 15 a 30

cms, se vuelve a dividir a la mitad y se hacen marcas con una altura h1.

Otra vez cada seccin se divide a la mitad y se marca.


Se deja de marcar cuando la altura de la raya sea

menor o igual a cero.

Divide y Vencers
Algoritmo:
pintarRegla( int inicio, int final, int altura ) {
if( altura <= 0 ) return; else {
posicion = (inicio + final)/2; marcar( posicion, altura ); h1 = altura / 2; pintarRegla( inicio, posicion, h1); pintarRegla( posicion, final, h1);

Divide y Vencers
Algoritmo recursivo de bsqueda
int buscar( int a[], int valor, int ini, int n ) { int medio; if ( n < ini ) return -1; medio = ( ini + n ) / 2; if ( a[medio] > valor ) return buscar( a, valor, ini, medio-1); else if ( a[medio] < valor ) return buscar( a, valor, medio+1, n ); else return medio; }

binaria

Divide y Vencers
Algoritmo iterativo de bsqueda

binaria

int buscar( int a[], int valor, int ini, int n ) { int medio; while ( ini <= n ) { medio = ( ini + n ) / 2; if ( a[medio] > valor ) n = medio - 1; else if ( a[medio] < valor ) ini = medio + 1; else return medio; } return -1; }

Programacin dinmica
El inconveniente se presenta cuando los

subproblemas obtenidos no son independientes sino que existe solapamiento entre ellos
es cuando una solucin recursiva no resulta eciente

por la repeticin de clculos que conlleva

En estos casos es cuando la Programacin Dinmica

nos puede ofrecer una solucin aceptable.

La eciencia de esta tcnica consiste en resolver los

subproblemas una sola vez, guardando sus soluciones en una tabla para su futura utilizacin.

Programacin dinmica
Donde tiene mayor aplicacin la Programacin Dinmica

es en la resolucin de problemas de optimizacin

En este tipo de problemas se pueden presentar distintas

soluciones, cada una con un valor, y lo que se desea es encontrar la solucin de valor ptimo (mximo o mnimo)

Se basa en el llamado principio de ptimo enunciado por

Bellman en 1957 y que dice:

En una secuencia ptima de decisiones, toda subsecuencia ha de ser tambin ptima

Programacin dinmica
El diseo de un algoritmo de Programacin Dinmica

consta de los siguientes pasos:

Planteamiento de la solucin como una sucesin de

decisiones y vericacin de que sta cumple el principio de ptimo Denicin recursiva de la solucin Clculo del valor de la solucin ptima mediante una tabla en donde se almacenan soluciones a problemas parciales para reutilizar los clculos Construccin de la solucin ptima haciendo uso de la informacin contenida en la tabla anterior

Programacin dinmica
Serie de Fibonacci:

Ver algoritmo recursivo Analizar utilizacin de una tabla

Fib(0)

Fib(1)

Fib(2)

Fib(n)

Programacin dinmica
int FibonacciIterativo(int n) { int tabla[n]; if (n <= 1) return 1; else { T[0] = 1; T[1] = 1; for (int i=2 ; i < n ; i++) { T[i] = T[i-1] + T[i-2]; } return T[n]; } }

Programacin dinmica
int FibonacciIterativo(int n) { int suma, x, y; if (n <= 1) return 1; else { x = 1; y = 1; for (int i=2 ; i < n ; i++) { suma = x + y; y = x; x = suma; } return suma; } }

Programacin dinmica
Clculo de coecientes binomiales

Programacin dinmica
Clculo de coecientes binomiales

Programacin dinmica
int CoefIter(int n, int k) { int i,j; int C[n][k];
for (i=0 ; i < n ; i++) { C[i,0] = 1; } for (i=1 ; i < n ; i++) { C[i,1] = i; } for (i=2 ; i < k ; i++) { C[i,i] = 1; } for (i=3 ; i < n ; i++) { for (j=2 ; j < i-1 ; j++) if (j<=k) { C[i,j] = C[i-1,j-1]+C[i-1,j]; } } }

return C[n,k]; }

Programacin dinmica
Funcin de Ackerman

En cada paso m del algoritmo hay que actualizar los Ack[i] (1 i n)

Ack[] sucientemente grande pues m crece muy rpido

Resumiendo
La tcnica Divide y Vencers puede aplicarse para

resolver problemas descomponiendo en subproblemas ms pequeos


Funciona cuando existe un independencia total entre

las subsoluciones

Si no existe independencia entre las subsoluciones,

lo mejor es utilizar Programacin Dinmica, siempre y cuando se cumpla el principio del ptimo