我需要生成给定整数的所有分区。
我发现 Jerome Kelleher 的这个算法据说是最有效的:
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
,我的整个系统几乎冻结了几秒钟,然后才给出它的输出。
如果它是一个递归算法,我会尝试用缓存函数或其他东西来装饰它以提高它的效率,但是我不知道该怎么做。
你对如何加速这个算法有什么建议吗?或者你能建议我另一个,或者另一种从头开始制作另一个的方法吗?