Potrzebuję wygenerować wszystkie partitions danej liczby całkowitej.
znalazłem ten algorytm Jerome Kelleher, dla których jest określona jako najskuteczniejszy jeden:python: Generowanie partycji liczb całkowitych
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]
referencyjny: http://homepages.ed.ac.uk/jkellehe/partitions.php
Nawiasem mówiąc, nie jest dość skuteczny. Dla wejścia takiego jak 40
zamarza on prawie cały mój system na kilka sekund przed podaniem jego wyjścia.
Jeśli był to algorytm rekursywny, spróbowałbym udekorować go funkcją buforowania lub czymś, co poprawiłoby jej efektywność, ale w ten sposób nie wiem, co robić.
Czy masz jakieś sugestie, jak przyspieszyć ten algorytm? Czy możesz zaproponować mi inny, lub inne podejście, aby zrobić kolejny od zera?
Tylko dlatego, że obliczenie 40 trwa kilka sekund, nie oznacza to, że nie jest wydajne. –
Algorytm ten nie daje kompozycji, daje partycje. Ale to był szczęśliwy błąd: istnieje 549755813888 kompozycji 40, które zatrzymywałyby czyjś komputer. – DSM
Edytuj pytanie, ponieważ jest mylące dla tych, którzy faktycznie szukają liczby całkowitej _compositions_. –