【发布时间】:2012-05-01 22:02:06
【问题描述】:
我需要生成给定整数的所有partitions。
我发现 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 这样的输入,它几乎冻结了我的整个系统几秒钟,然后才给出它的输出。
如果它是一个递归算法,我会尝试用缓存函数或其他东西来装饰它以提高它的效率,但是我不知道该怎么做。
你对如何加速这个算法有什么建议吗?或者您能建议我另一种方法,或者另一种方法来从头开始制作另一种方法吗?
【问题讨论】:
-
仅仅因为计算 40 需要几秒钟,但这并不意味着它没有效率。
-
该算法不会产生组合,它会产生分区。但这是一个幸运的错误:有 40 首 549755813888 首乐曲,这会使任何人的电脑停顿。
-
请编辑您的问题,因为它会让那些真正在寻找整数compositions的人感到困惑。
标签: python combinatorics performance data-partitioning