Necesito generar todos los partitions de un número entero dado.
me encontré con este algoritmo por Jerome Kelleher para el que se dice que es el más eficiente uno:python: generación de particiones enteras
def accelAsc(n):
a = [0 for i in range(n + 1)]
k = 1
a[0] = 0
y = n - 1
while k != 0:
x = a[k - 1] + 1
k -= 1
while 2*x <= y:
a[k] = x
y -= x
k += 1
l = k + 1
while x <= y:
a[k] = x
a[l] = y
yield a[:k + 2]
x += 1
y -= 1
a[k] = x + y
y = x + y - 1
yield a[:k + 1]
referencia: http://homepages.ed.ac.uk/jkellehe/partitions.php
Por cierto, no es muy eficiente. Para una entrada como 40
, congela casi todo el sistema durante unos segundos antes de dar su salida.
Si fuera un algoritmo recursivo, trataría de decorarlo con una función de almacenamiento en caché o algo para mejorar su eficacia, pero siendo así no puedo imaginar qué hacer.
¿Tiene alguna sugerencia sobre cómo acelerar este algoritmo? ¿O puede sugerirme otro, o un enfoque diferente para hacer otro desde cero?
El hecho de que tome unos segundos calcular 40 no significa que no sea eficiente. –
Ese algoritmo no produce composiciones, produce particiones. Pero ese fue un error afortunado: hay 549755813888 composiciones de 40, que podrían paralizar la computadora de cualquiera. – DSM
Por favor, edite su pregunta, ya que confunde a los que realmente buscan enteros _compositions_. –