Está en la página 1de 14

Ing.

Ciro Saguay
Facultad de Ciencias de la Ingeniería e Industrias
.
Agenda:
• Introducción.
• Algoritmos Divide y Vencerás.

www.ute.edu.ec
Anteriormente se resaltó la importancia de aplicar los conceptos matemáticos
al análisis de algoritmos. Al mimo tiempo es necesario reconocer que la
construcción de un algoritmo debe planearse adecuadamente de acuerdo a los
parámetros definidos para tal fin. La selección de un método de
implementación de forma correcta es fundamental pues de ello dependerá su
desempeño en cuanto a eficiencia y efectividad.

Para seguir aplicando técnicas correctas, se muestra a continuación técnicas


conocidas para el diseño de algoritmos.
• Algoritmos divide y vencerás,
• Algoritmos voraces y
• La programación dinámica.

www.ute.edu.ec
La técnica divide y vencerás se utiliza dentro de la algoritmia cuando es necesario
descomponer un conjunto de datos en subconjuntos de ese mismo tamaño de
entrada. Cada uno de los subconjuntos se resuelve de forma independiente y
finalmente de sus resultados se construye la solución final del conjunto de datos
original. Esta técnica resuelve los problemas aplicando la recursividad.

En toda definición recursiva de un problema se debe establecer un estado base, es


decir, un estado en el cual la solución no se presente de manera recursiva sino
directamente.
• Problema: Determinar si es posible utilizar el método de programación divide y
vencerás
• Caso base: El problema se resuelve directamente (generalmente valores pequeños).
• Subdivisión - Paso recursivo: Se divide el problema en varias partes, luego se
resuelve cada una de ellas, obteniendo soluciones parciales y finalmente
www.ute.edu.ec
• Integración: finalmente se combinan las soluciones de las partes para dar una
solución al problema.
www.ute.edu.ec
boolean binariaRecursiva ( int arreglo[], int dato )
{
return binRecursiva ( arreglo, dato, 0, arreglo.length-1);
}

boolean binRecursiva (int arreglo[], int dato, int limInf, int limSup) Cuando se realiza una comparación en la cual se busca
{ el número, se encuentra en caso de no ser cierto, que
int centro = (int)( (limSup + limInf) / 2);
if ( limInf > limSup )
el conjunto de datos se divide a la mitad. Si el tamaño
{ del arreglo es n, se va reduciendo por cada
return false; comparación a n/2,n/4,n/8… n/2n, hasta llegar a
} cualquiera de los límites del arreglo, por lo anterior se
else
{
puede deducir que el algoritmo de búsqueda lineal
if ( arreglo [ centro ] > dato ) tiene un orden de complejidad de orden O(log(n)).
{
return binRecursiva(arreglo, dato, limInf, centro-1 ); La anterior implementación se basa en la técnica
}
else divide y vencerás ya que para solucionar el problema
{ necesariamente se tienen que realizar llamadas
if (arreglo [centro]<dato) recursivas al método de implementación.
{
return binRecursiva(arreglo,dato,centro+1,limSup );
}
else
{
return true;
} www.ute.edu.ec
}
}
}
Este método se basa en la técnica de “Divide y Vencerás” ya que toma el arreglo original de datos y lo divide en dos partes del mismo
tamaño, lo sigue dividiendo hasta que sólo se tenga un elemento. Cada una de estas divisiones es ordenada de manera separada y
posteriormente fusionadas para formar el conjunto original ya ordenado. Este algoritmo divide inicialmente el arreglo hasta su mínimo
valor y luego si ordena el arreglo.

Método Análisis
public void mergesort( int a[] ) for( int i = 0 ; i < len ; i++ ) Se tienen las siguientes expresiones de base y de
{ { inducción.
mergesort ( a, 0, a.length -1 ); if( m2 <= alto - bajo ) T(1) = a
} { T(n) = 2T(n/2) + O(n)
public void mergesort(int a[],int bajo, int alto ) if( m1 <= pivote - bajo )
Reemplazando el caso base por una constante, tenemos
{ {
if( temp[ m1 ]>temp[ m2 ] )
que:
int len, pivote, m1, m2;
if ( bajo == alto ) { T(1) = a
{ a[i+bajo]=temp[ m2++ ]; T(n) = 2T(n/2) + bn
return; } Utilizando el reemplazo de la base en la inducción:
} else T(1) = a
else { T(2) = 2T(1) + 2b = 2a + 2b
{ a[i+bajo]=temp[ m1++ ]; T(4) = 2T(2) + 4b = 4a + 8b
len = alto - bajo + 1; } T(8) = 2T(4) + 8b = 8a + 24b
pivote = (bajo + alto) / 2; } T(16) = 2T(8) + 4b = 16a + 64b
mergesort( a, bajo, pivote ); else
mergesort( a, pivote + 1, alto ); {
Por lo tanto el tiempo de ejecución está dado por:
int temp[] = new int[ len ]; a[i+bajo] = temp[ m2++ ];
for( int i = 0 ; i < len ; i++ ) } T(n) = an + nlog(n)b
{ } www.ute.edu.ec
temp[ i ] = a[bajo + i]; else
} {
m1 = 0; a[i+bajo] = temp[ m1++ ];
Método Análisis
int[] Mult(int Num[],int tam1,int Num2[],int tam2)
{
El orden de complejidad de este
int l=tam1+tam2-1,pos=tam1+tam2-1;; método de multiplicación es O(n^2),
int res[]= new int[tam1+tam2];
for(int y=0;y<=tam1+tam2-1;y++) esto teniendo en cuenta que los ciclos
{ anidados iteran completamente
res[y]=0;
} desde una posición inicial hasta una
for( int i=tam1-1;i>=0;i--)
{ posición final.
for( int j=tam2-1;j>=0;j--)
{
res[l]+=Num[i]*Num2[j];
if(res[l]>9)
{
res[l-1]+=res[l]/10;
res[l]=res[l]%10;
}
l--;
}
l=pos;
pos--;
l--;
} www.ute.edu.ec
return res;
}
La forma en la cual se lleva a cabo esta multiplicación, sugiere varias metodologías. La más común de
ellas es crear dos columnas en la cual se escriben los dos números a multiplicar. Se debe repetir la
siguiente secuencia hasta que el número de la columna izquierda sea un 1. Por lo tanto la secuencia
es la siguiente:
1. Dividir el número de la columna izquierda por dos, esta división es una división entera.
2. Una vez realizado el paso 1, duplicar el número de la columna derecha, sumándolo consigo mismo.
3. Eliminar todas las filas en las cuales el número de la izquierda sea par.
4. Sumar los números que quedan en la columna de la derecha.

www.ute.edu.ec
Método Análisis
int multiplicacion(int m,int n) La ventaja de este algoritmo es que solo se realizan
{ operaciones de suma y de división por 2.
int resultado = 0;
do{
if(m%2!=0)
Este método se repite n, pero solo se realiza en los casos en los
{ cuales el multiplicador es un número impar. El orden de
resultado = resultado + n; complejidad para este caso es de O(n2).
}
m = m/2;
n = n+n;
} while(m>=1);
return resultado;
}

www.ute.edu.ec
Este algoritmo cuando se aplica la técnica de divide y vencerás, consiste de dividir tanto
multiplicando como multiplicador en dos mitades, ambas con el mismo número de cifras y
además que este número de cifras sea potencia de dos (si no los tienen, se rellenan con ceros
a la izquierda). El objetivo final de este algoritmo es efectuar a los más 4 multiplicaciones,
siguiendo los pasos que a continuación se listan:

1. Multiplique la mitad izquierda del multiplicando (w), por la mitad izquierda del
multiplicador (y), el resultado desplácelo a la izquierda, tantas cifras tenga el
multiplicador.
2. Multiplique la mitad izquierda del multiplicando (w), por la mitad derecha del
multiplicador (z), el resultado desplácelo a la izquierda, la mitad de las cifras que tenga el
multiplicador.
3. Multiplique la mitad derecha del multiplicando (x), por la mitad izquierda del
multiplicador (y), el resultado desplácelo a la izquierda, la mitad de las cifras que tenga el
multiplicador.
4. Multiplique la mitad derecha del multiplicando (x), por la mitad derecha del multiplicador
(z), el resultado no lo desplace.
www.ute.edu.ec
Actividad

Método Análisis

www.ute.edu.ec
Tarea

Método Análisis

www.ute.edu.ec
Tarea

Método Análisis

www.ute.edu.ec

También podría gustarte