Fundamentos teóricos de divide y vencerás

22

Cuando se trata del diseño de algoritmos, a menudo se emplean las siguientes técnicas:

  • Programación dinámica
  • La codiciosa estrategia
  • Divide y conquistaras

Si bien para los primeros dos métodos, existen fundamentos teóricos bien conocidos, a saber, el Principio de Optimidad de Bellman y la teoría matroide (resp. Greedoid), no pude encontrar un marco tan general para algoritmos basados ​​en D&C.

En primer lugar, soy consciente de algo que nosotros (o más bien, el profesor) introdujimos en una clase de programación funcional, llamada "esqueleto algorítmico", que surgió en el contexto de los combinadores. Como ejemplo de esto, le dimos un esqueleto para algoritmos de D&C de la siguiente manera:

Definición : Sean conjuntos no vacíos. Llamamos a los elementos de las soluciones , y los elementos de (es decir, los subconjuntos de ) se denominan problemas . Entonces, un esqueleto D y C es una tupla de 4 , donde:A,SS P:=P(A)A(Pβ,β,D,C)

  • Pβ es un predicado sobre el conjunto de problemas y decimos que un problema es básico si se cumple .pPβ(p)
  • β es un mapeo que asigna una solución a cada problema básico.PβS
  • D es un mapeo que divide cada problema en un conjunto de subproblemas.PP(P)
  • C es un mapeo que une las soluciones (dependiendo del tipo de "problema de pivote") de los subproblemas para producir una solución.P×P(S)S

Luego, para un esqueleto dado y un problema , la siguiente función genérica calcula una solución (en el formal sentido) para :s=(Pβ,β,D,C)pfs:PSp

fs(p)={β(p)if p is basicC(p,f(D(p)))otherwise

donde en la segunda línea usamos la notación para los subconjuntos del codominio de un mapeo .f(X):={f(x):xX}Xf

Sin embargo, no examinamos más a fondo las propiedades "estructurales" subyacentes de los problemas que pueden formularse de esta manera (como dije, era una clase de programación funcional y esto era solo un pequeño ejemplo). Lamentablemente, no pude encontrar más referencias sobre este mismo enfoque. Por lo tanto, no creo que las definiciones anteriores sean bastante estándar. Si alguien reconoce lo que he dicho anteriormente, estaría encantado de los artículos relacionados.

En segundo lugar, para la estrategia codiciosa tenemos el famoso resultado de que el algoritmo codicioso general resuelve correctamente un problema si y solo si sus soluciones constituyen un matroide ponderado. ¿Existen resultados similares para los algoritmos D y C (no necesariamente basados ​​en el método descrito anteriormente)?

Marca Cornelius
fuente

Respuestas:

5

Un tratamiento formal (algo parecido al modelo propuesto en la pregunta) del sujeto utilizando lo que se llama pseudo-morfismos (es decir, funciones que son casi morfismos, con algunos cálculos previos y posteriores realizados), así como consideraciones de complejidad El análisis y la implementación paralela de tales algoritmos se dan en:

Un modelo algebraico para dividir y conquistar y su paralelismo por Zhijing G. Mou y Paul Hudak (en The Journal of Supercomputing , Volumen 2, Número 3, pp. 257-278, noviembre de 1988)

Marca Cornelius
fuente
1

No conozco algo tan concreto como el Principio de Optimidad de Bellman para los algoritmos Divide and Conquer. Sin embargo, la base subyacente de divide y vencerás me parece una definición recursiva (o inductiva) de la entrada del problema y luego un medio para combinar soluciones al problema en soluciones más grandes. La idea clave aquí es pensar en las entradas de problemas de forma recursiva y aprovechar eso en algoritmos recursivos de D&C.

Tome mergesort como ejemplo. Comencemos con la entrada, una matriz de elementos. Uno puede definir recursivamente la estructura de la matriz de la siguiente manera:n

  • Para , la matriz está vacía.n=0
  • Para , la matriz es un elemento singletonn=1
  • Para , la matriz es la concatenación de una matriz de tamaño ( izquierda ) y tamaño ( derecha )n>1n2n2

Luego nos acercamos al algoritmo mergesort y luego asignamos el ordenamiento a esta estructura. Los casos base, donden1 se ordenan trivialmente. El caso recursivo comienza ordenando recursivamente dónde los datos son recursivos , es decir, izquierda y derecha . Entonces, esencialmente encontramos un reemplazo para concatenar , que termina siendo la fusión . Entonces, observe que básicamente tomamos la estructura recursiva de los datos y la asignamos a una solución recursiva.

Es importante tener en cuenta que esto no necesariamente conduce a lo que espera de los algoritmos de D&C. Podríamos definir la estructura de la matriz de la siguiente manera:

  • n=0
  • n>0n1

Seguir la misma estrategia que usamos para mergesort aquí conduce a una ordenación de inserción recursiva. Por lo tanto, normalmente desarrollamos definiciones recursivas que involucran múltiples elementos recursivos, es decir, reducen el conjunto de datos a la mitad o al tercero.

Ahora, existe el Master Theorem para analizar algoritmos de D&C y esto arroja algo de luz sobre las expectativas de eficiencia para los subcomponentes de un algoritmo de D&C con una eficiencia general particular del tiempo de ejecución.

Logan Mayfield
fuente
Los ejemplos que da encajan en el contexto general que doy en mi pregunta (y de hecho, podría ser útil que brinde una aplicación concreta). Sin embargo, mi pregunta era si existe un criterio (como BOP o estructura matroide) para que los problemas puedan resolverse mediante algoritmos que se ajusten a este patrón.
Cornelius Brand