生成`n`球的所有不同分区成为箱

时间:2016-11-23 08:44:35

标签: python algorithm partitioning

鉴于3个球,有3种方法将它们分成垃圾箱:

(1,2)

请注意(2,1)已涵盖n,因为我们并不关心垃圾箱的顺序。

我想编写一个能够获得球数from itertools import combinations from functools import reduce def all_partitions(n): n_bits_on=set([tuple(reduce(lambda x,y:x[:y]+[1]+x[y+1:],c,[0]*(2*n-1))) for c in combinations(range(2*n-1),n)]) return set([tuple(sorted(filter(lambda i:i>0,reduce(lambda x,y: x+[y] if y==0 else x[:-1]+[x[-1]+1,],p,[0])))) for p in n_bits_on]) 的函数并以有效的方式输出所有可能的分区。

这就是我提出的:

2n-1

代码的作用是:

  1. 生成所有大小为nitertools.combinations位的位数组(使用reduce
  2. 将零视为分区,将零视为球 - 将两个零之间的数量相加(使用set()
  3. 对所有选项进行排序,并使用_locales
  4. 删除重复项

    代码正常运行,但速度非常慢。

    任何想法如何改进?

0 个答案:

没有答案