Recurrencias y funciones generadoras en algoritmos

18

La combinatoria juega un papel importante en la informática. Con frecuencia utilizamos métodos combinatorios tanto en el análisis como en el diseño de algoritmos. Por ejemplo, un método para encontrar un conjunto de portadas de k vértices en un gráfico podría inspeccionar todos los subconjuntos posibles . Mientras que las funciones binomiales crecen exponencialmente, si es una constante fija, terminamos con un algoritmo de tiempo polinómico mediante análisis asintótico. k(nortek)k

Muchas veces los problemas de la vida real requieren mecanismos combinatorios más complejos que podemos definir en términos de recurrencias. Un ejemplo famoso es la secuencia de Fibonacci (ingenuamente) definida como:

F(norte)={1Si norte=10 0Si norte=0 0F(norte-1)+F(norte-2)de otra manera

Ahora calcular el valor del º plazo crece exponencialmente el uso de esta recurrencia, pero gracias a la programación dinámica, podemos calcular que en un tiempo lineal. Ahora, no todas las recurrencias se prestan a DP (por supuesto, la función factorial), pero es una propiedad potencialmente explotable cuando se define un recuento como una recurrencia en lugar de una función generadora.norte

Las funciones de generación son una forma elegante de formalizar algún recuento para una estructura dada. Quizás la más famosa es la función de generación binomial definida como:

(X+y)α=k=0 0(αk)Xα-kyk

Afortunadamente, esto tiene una solución de forma cerrada. No todas las funciones generadoras permiten una descripción tan compacta.

Ahora mi pregunta es esta: ¿con qué frecuencia se utilizan las funciones generadoras en el diseño de algoritmos? Es fácil ver cómo pueden ser explotados para comprender la tasa de crecimiento requerida por un algoritmo a través del análisis, pero ¿qué pueden decirnos sobre un problema al crear un método para resolver algún problema?

Si muchas veces el mismo recuento puede reformularse como una recurrencia, puede prestarse a la programación dinámica, pero quizás la misma función generadora tenga una forma cerrada. Por lo tanto, no está tan uniformemente cortado.

Nicholas Mancuso
fuente
Si la función generadora proporciona una fórmula (por ejemplo, la fórmula de Binet para números de Fibonacci) que se puede usar para calcular el número en lugar de usar la recurrencia (quizás de manera más eficiente), ¿lo considera como una respuesta?
Aryabhata

Respuestas:

11

Generar funciones es útil cuando diseña algoritmos de conteo. Es decir, no solo cuando busca el número de objetos que tienen una determinada propiedad, sino también cuando busca una forma de enumerar estos objetos (y, tal vez, generar un algoritmo para contar los objetos). Hay una muy buena presentación en el capítulo 7 de Matemáticas concretas por Ronald Graham, Donald Knuth y Oren Patashnik . Los siguientes ejemplos son de estos libros (los errores y la falta de claridad son míos).

Suponga que está buscando formas de hacer cambios con un conjunto de monedas dado. Por ejemplo, con denominaciones comunes de EE. UU., Las monedas posibles son . Para dar ¢ 42 en cambio, una posibilidad es ; otra posibilidad es . Escribiremos . De manera más general, podemos escribir una función generadora para todas las formas de dar cambio: En términos más técnicos, es un término en el espacio de series de potencia sobre las cinco variables[ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] [ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ] 42 [ 25 ] [ 10 ][1],[5 5],[10],[25],[100][25][10][5 5][1][1][10][10][10][10][1][1]H = Σ h 0 Σ q 0 Σ d 0 Σ n 0 Σ p 0 [ 100 ] h [ 25 ] q [ 10 ] d [ 5 ] n [ 1 ] p42[25][10][5 5][1]2=[10]4 4[1]2

H=h0 0q0 0re0 0norte0 0pag0 0[100]h[25]q[10]re[5 5]norte[1]pag
[ 100 ] , [ 25 ] , [ 10 ] , [ 5 ] , [ 1 ] [ 100 ] h [ 25 ] q [ 10 ] d [ 5 ] n [ 1 ] p= 100 h + 25 q + 10 d + 5 n + p v v H PH[100],[25],[10],[5 5],[1]. Defina la valoración de un monomio en este espacio mediante Entonces, las formas de dar centavos en cambio son el número de monomios cuya valoración es . Podemos expresar de manera incremental, primero escribiendo las formas para dar cambio solo en centavos, luego las formas para dar cambio en centavos y monedas de cinco centavos, y así sucesivamente. ( decir moneda)
[100]h[25]q[10]re[5 5]norte[1]pag=100h+25q+10re+5 5norte+pag
vvHPAGI P = I + [ 1 ] + [ 1 ] 2 + [ 1 ] 3 + = Inorteyo
PAG=yo+[1]+[1]2+[1]3+...=yoyo-[1]norte=(yo+[5 5]+[5 5]2+[5 5]3+...)PAG=PAGyo-[5 5]re=(yo+[10]+[10]2+[10]3+...)norte=norteyo-[10]Q=(yo+[25]+[25]2+[25]3+...)re=reyo-[25]H=(yo+[100]+[100]2+[100]3+...)Q=Qyo-[100]
Si quieres contar y no solo enumerar las formas de dar cambio, entonces hay una manera simple de usar la serie formal que hemos obtenido. Aplique el homomorfismo El coeficiente de en es el número de formas de dar centavos en cambio.
S:[1]X,[5 5]X5 5,[10]X10,[25]X25,[100]X100
XvS(C)v

Un ejemplo más difícil: suponga que desea estudiar todas las formas de mosaico de rectángulos con dominó 2 × 1. Por ejemplo, hay dos formas de colocar un rectángulo de 2 × 2, ya sea con dos fichas de dominó horizontales o con dos fichas de dominó verticales. Contar el número de formas de enlosar un rectángulo es bastante fácil, pero el caso rápidamente no se hace evidente. Podemos enumerar todas las posibles inclinaciones de una banda horizontal de altura 3 al unir las fichas de dominó, lo que produce rápidamente patrones repetitivos: 2×norte3×norte

{U=o+LV+ΓΛ+UV=yoU+=-VΛ=yoU+-=Λ
donde las formas divertidas representan arreglos de dominó elementales: no es domino, es un dominó vertical en la parte superior de la parte izquierda de un dominó horizontal, es un dominó vertical alineado con la parte inferior de la banda de altura 3, es un dominó horizontal alineado con la parte superior de la banda más dos fichas de dominó horizontales debajo y un paso a la derecha, etc. Aquí, la multiplicación representa la concatenación horizontal y no es conmutativa, pero hay ecuaciones entre los patrones elementales que forman variables en esta serie de potencias. Como antes con las monedas, podemos sustituir por cada ficha de dominó y obtener una serie generadora para el número de tiros de unoLyo-=X3×(2norte/ /3)Rectángulo (es decir, el coeficiente de es la cantidad de formas de enlosar un rectángulo de área , que contiene fichas de dominó y tiene un ancho de ). La serie también se puede utilizar de formas más versátiles; por ejemplo, al distinguir las fichas de dominó verticales y horizontales, podemos contar las inclinaciones con un número determinado de fichas de dominó verticales y horizontales.X3k6 6k3k2k

Nuevamente, lea Matemáticas concretas para una presentación menos apresurada³.

¹ Sé que mi lista está incompleta; suponga un EE. UU. simplificado adecuado para ejemplos matemáticos.²
² Además, si aparece, suponga monedas esféricas.
³ Y mejor composición tipográfica.

Gilles 'SO- deja de ser malvado'
fuente
8

Recuerdo un problema que tuve que resolver durante un concurso de programación estudiantil en 2001. El problema era este:

Dadas masas de 1, 7, 13, ... (no recuerdo qué masas, pero había un conjunto finito y determinado de masas), diseñe una función que determine si un peso dado se puede pesar en una báscula con esto conjunto de masas

Comencé con bucles anidados, pero rápidamente golpeé una pared. Luego me di cuenta de que tenía que comenzar enumerando lo que se podía hacer con las masas más ligeras antes de continuar con las más pesadas. Podría resolver el problema con muchos bucles sin procesar.

Si no hubiera sido jovenmente arrogante y autosuficiente en ese momento (y si hubiera sabido y practicado la generación de funciones), podría haber definido el problema de generar funciones como tal:

Defina como el OGF para la cantidad de formas en que se puede pesar un peso dado el conjunto de masas.F(X)norte

¿Qué peso en la bandeja derecha puedo pesar con una sola masa de 1?

Tres posibilidades:

  • Si pongo la masa en la bandeja izquierda, puedo pesar 1.
  • Si pongo la masa en la bandeja derecha, puedo pesar -1.
  • Si no uso la masa, puedo pesar 0.

Entonces, hay una forma de pesar , una forma de pesar y una forma de pesar . La función generadora de esta masa es algo así como , que corresponde a:-10 01X-1+1+X

1-X3X(1-X)

La función generadora para una sola masa es , que es:metroX-metro+1+Xmetro

1-X3metroXmetro(1-Xmetro)

Dado un conjunto múltiple de masas, se expresa como el producto de las funciones generadoras de masa individuales:METROF

F(X)=metroMETRO(1-X3metro)XmetroMETROmetrometroMETRO(1-Xmetro)

Ahora, dado un paquete que puede realizar operaciones en polinomios, solo tiene que:

  • Calcule ambos productos.
  • Realice la división de estos productos, comenzando con el grado más bajo. (que termina)
  • Desplaza el polinomio (división euclidiana por , manteniendo el cociente y volcando el resto)Xk

Y tu estas listo. Ahora su polinomio tiene la cantidad de formas de pesar en el índice . La única entrada es el conjunto múltiple de masas .w Mw0 0wMETRO

Diseñé el algoritmo usando componentes matemáticamente sólidos. La parte principal del algoritmo, que es una división polinómica con el grado más bajo primero, es lineal y puede implementarse mediante un paquete estándar. Puede que no sea óptimo, pero ciertamente funciona mejor que lo que hice en el concurso, y de una manera menos propensa a errores.

Si observa detenidamente el proceso de división, verá rápidamente que el resto puede verse como el "estado oculto actual" en cada estado del proceso, y el cociente como resultado. El proceso finaliza cuando el "estado oculto actual" llega a cero en todas partes.

Puede implementar polinomios como matrices o, si son realmente escasos, como listas ordenadas de coeficientes de índice, y esto no cambiará el algoritmo.

Laurent LA RIZZA
fuente
3

γ+1(metro)=(2-metro)γ(metro)+(metro-+1)γ-1(metro),γ0 0(metro)=1,γmetro+1(metro)=mi.
γ(metro)=metro(γ(metro-1)-γ-1(metro-1))γ(0 0)γ(metro), de nuevo utilizando funciones generadoras. Puede encontrar la solución en el documento si tiene curiosidad, aunque nunca nos molestamos en incluir esta derivación.
Yuval Filmus
fuente
0

Quizás el estudio extenso de Quicksort, y sus muchas variantes, es el ejemplo más claro. Hay consideraciones combinatorias que rigen la consideración de alternativas, y analizar las soluciones a ecuaciones bastante complejas muestra ventajas de rendimiento (o no) de ellas.

vonbrand
fuente