Documente Academic
Documente Profesional
Documente Cultură
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
problema original.
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
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.
Se
deja
de
marcar
cuando
la
altura
de
la
raya
sea
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
subproblemas una sola vez, guardando sus soluciones en una tabla para su futura utilizacin.
Programacin
dinmica
Donde
tiene
mayor
aplicacin
la
Programacin
Dinmica
soluciones, cada una con un valor, y lo que se desea es encontrar la solucin de valor ptimo (mximo o mnimo)
Programacin
dinmica
El
diseo
de
un
algoritmo
de
Programacin
Dinmica
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:
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
Resumiendo
La tcnica Divide y Vencers puede aplicarse para
las subsoluciones
lo mejor es utilizar Programacin Dinmica, siempre y cuando se cumpla el principio del ptimo