Мне нужно сгенерировать все разделы заданного целого числа.
Я нашел этот алгоритм Джерома Келлехера, для которого он считается наиболее эффективным:
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]
ссылка: http://homepages.ed.ac.uk/jkellehe/partitions.php
Кстати, это не совсем эффективно. Для ввода, такого как 40
, он замораживает почти всю мою систему на несколько секунд, прежде чем выдать свой вывод.
Если бы это был рекурсивный алгоритм, я бы попытался украсить его функцией кэширования или чем-то еще, чтобы повысить его эффективность, но в таком случае я не могу понять, что делать.
Есть ли у вас какие-либо предложения о том, как ускорить этот алгоритм? Или вы можете предложить мне другой или другой подход, чтобы сделать еще один с нуля?