En las
ciencias de la computación, el término divide y vencerás (DYV)
hace referencia a uno de los más importantes paradigmas de diseño
algorítmico. El método está basado en la resolución recursiva de
un problema dividiéndolo en dos o más subproblemas de igual tipo o
similar. El proceso continúa hasta que éstos llegan a ser lo
suficientemente sencillos como para que se resuelvan directamente. Al
final, las soluciones a cada uno de los subproblemas se combinan para
dar una solución al problema original.
Esta técnica es la base de los
algoritmos eficientes para casi cualquier tipo de problema como, por
ejemplo, algoritmos de ordenamiento, multiplicar números grandes,
análisis sintácticos y la transformada discreta de Fourier.
¿En que problemas se utiliza?
- Multiplicacion rapida de enteros largos
- multiplicacion rapida de matrices
- Ordenacion por mezcla y ordenacion rapida
- Problema de seleccion.
Multiplicación de enteros grandes
Enunciado del problema
las operaciones aritméticas entre números enteros suelen considerarse operaciones elementales siempre y cuando los números que intervienen no superen los límites de representación. Cuando esto ocurre, hay que acudir a otro tipo de representación, por ejemplo los arrays, y utilizar los algoritmos clásicos de las operaciones aritméticas. El problema planteado consiste en saber si existe alguna forma de reducir el coste en el caso de la multiplicación, ya que el algoritmo clásico de multiplicación es de orden cuadrático. Como alternativa, se podría utilizar el esquema de multiplicación por duplicación, pero no ofrece mejoras en cuanto a tiempo de ejecución.
Solución
considérense dos números enteros, u y v, de n dígitos cada uno.
1. Algoritmo básico: la idea a
seguir es descomponer los dos números en la suma de otros dos. Más
concretamente, sea S la parte entera de n/2, la descomposición
consiste en dividir los números entre 10S:
u → w representa el
cociente y x el resto → u = 10S·w + x
v → y representa el
cociente y z el resto → v = 10S·y + z
Luego:
u·v = (10S·w + x)·(10S·y + z) =
102S·w·y + 10S·(w·z + x·y) + x·z
A continuación, se calculan las
suboperaciones w·y, w·z, x·y y x·z. Si
los operandos (w, x, y, z) son:
- “pequeños”, entonces se
multiplican de la forma clásica.
- “suficientemente grandes”, se
aplica de nuevo el algoritmo y se calculan recursivamente las
multiplicaciones de los respectivos sumandos.
2. Algoritmo mejorado: al
realizar cuatro multiplicaciones de tamaño mitad en cada llamada, el
coste resultante es T(n) = 4·T(n/2) + g(n), donde g(n) es el
tiempo invertido en sumas, desplazamientos y operaciones adicionales
sencillas, por lo que el algoritmo sigue siendo de orden cuadrático.
Dado que se necesitan realizar
cuatro multiplicaciones de tamaño mitad, no se mejora el tiempo de
ejecución respecto a los algoritmos clásicos. Para intentar
reducirlo, es preciso evitar alguna de esas multiplicaciones. La
clave de la mejora consiste en advertir que no es necesario calcular
w·z y x·y, si no la suma de ambos. Así, se considera r = (w +
x)·(y + z) = w·y + (w·z + x·y) + x·z , con los que las
multiplicaciones a realizar son:
p = w·y
q = x·z
r = (w + x)·(y + z)
, hallando la suma de la siguiente
forma:
(w·z + x·y) = r – p - q
Así, volviendo al producto
anterior:
u·v = (10S·w +
x)·(10S·y + z) = 102S·w·y + 10S·(w·z + x·y) + x·z = 102S·p +
10S·(r – p - q) + q
, teniendo que calcular las
multiplicaciones p, q y r. Si sus operandos (w, x, y, z) son:
- “pequeños”, entonces se
multiplican de la forma clásica.
- “suficientemente grandes” se
aplica de nuevo la descomposición anterior, y calculamos
recursivamente las multiplicaciones de los respectivos sumandos.
¿Cuando conviene utilizarlo y cuando no?
Principalmente este método nos
conviene utilizarlo en problemas muy complejos, ya que como se
menciona en la descripción se divide un problema en varios
sub-problemas para hacerlo más sencillo y estos a su vez se pueden
dividir si es necesario.
No nos conviene utilizarlo cuando el
resultado final del problema original no es la suma de los resultados
de los sub-problemas.
El método
esta diseñado para problemas complejos pero no es conveniente
sub-dividir tanto el original ya que el método es muy lento y entre
más dividamos el problema más tiempo tomara llegar a la solución.
Ejemplo
Primeramente lo que tenemos que hacer en ese caso de divide y venceras es lo siguiente
- Sabes de lo que se tratara el problema que tenemos que resolver y después sacar ciertos subproblemas (mas pequeños ) pero que sea el mismo resultado.
- Resolver cada problema de manera independiente
- Por ultimo hacer las combinaciones posibles , hasta que el resultado sea el buscado







0 comentarios:
Publicar un comentario