El algoritmo "divide y vencerás" reduce un problema complejo en subproblemas más pequeños, resuelve los subproblemas de forma independiente, y luego combina las soluciones para resolver el problema original. Este enfoque es la base de algoritmos eficientes para problemas de ordenamiento, multiplicación de números grandes, análisis sintáctico y transformadas discretas de Fourier.
2. El nombre divide y vencerás también se aplica a veces a algoritmos que reducen
cada problema a un único subproblema, como la búsqueda binaria, computación
numérica, el algoritmo de bisección para búsqueda de raíces.
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.
3.
4.
5. Diseño e implementación
• Plantearse el problema de forma que pueda ser descompuesto en k
subproblemas del mismo tipo.
• Resolver independientemente todos los subproblemas.
• Combinar las soluciones obtenidas en el paso anterior.
6. Recursión
Los algoritmos de “divide y vencerás” están naturalmente implementados, como
procesos recursivos.
Los algoritmos de divide y vencerás también pueden ser implementados por un
programa no recursivo que almacena los subproblemas parciales en alguna
estructura de datos explícita
7. En implementaciones recursivas de algoritmos de DyV, debe asegurarse que hay
suficiente memoria libre para la pila de recursión,
Los desbordamientos de pila podrían ser difíciles de evitar cuando usamos
procedimientos recursivos,
Los compiladores pueden también asignar más información en la pila de recursión
que la estrictamente necesaria
8. Eligiendo los casos base
En cualquier algoritmo recursivo, hay una libertad considerable para elegir los
casos bases, los subproblemas pequeños que son resueltos directamente para
acabar con la recursión.
Por otra parte, la eficiencia normalmente mejora si la recursión se para en casos
relativamente grandes, y estos son resueltos no recursivamente.
9. Método general “divide y vencerás”
DV(x)
if (x es suficientemente pequeño) {
return algoritmo_específico algoritmo_específico(x);
} else {
descomponer x en {x1,…, xk}
for i = 1 to k yi ← DV(xi) y ← recombinar (y1, …, yk)
return y;
}
10. Acceso a memoria
Los algoritmos que siguen el paradigma Divide y vencerás, tienden naturalmente
a hacer un uso eficiente de las memorias cachés.
La misma ventaja existe en lo que respecta a otros sistemas jerárquicos de
memoria, por ejemplo NUMA o memoria virtual.
11. Tiempo de ejecución
El tiempo de ejecución de un algoritmo de divide y vencerás,T(n), viene dado por
la suma de dos elementos:
• El tiempo que tarda en resolver los A subproblemas en los que se divide el
original, A·T(n/B), donde n/B es el tamaño de cada sub-problema.
• El tiempo necesario para combinar las soluciones de los sub-problemas para
hallar la solución del original; normalmente es O(nk).
13. Desventajas
• Lentitud en la repetición del proceso recursivo.
• Dificultad o incluso inconveniencia de aplicar el método a situaciones en las que
la solución al problema general no se deriva de la suma directa y simple de los
subproblemas.