我正在尝试一种蛮力的方法,试图找到一个拼图扩展的组合。
我正在尝试获得大量组合,然后测试每个组合,看它们是否符合某些标准。 我使用Python优秀的itertools生成组合,基本上这给了我一个迭代器,我可以过去测试每一个。
这会很快返回并给我 91390 组合来检查:
itertools.combinations(range(1, 40), 4)
这需要几分钟时间,然后给我 198792594 组合进行测试:
itertools.combinations(range(1, 122), 5)
当我进入下一个级别时,我需要答案:
itertools.combinations(range(1, 365), 6)
当我进入一组364的6路组合时......需要很长时间。的 AGES 即可。我天生就要求大量的组合吗?它如何扩展?
答案 0 :(得分:6)
你要求365选择6 =(365 * 364 * ... * 360)/(6 * 5 * ... * 2 * 1)= 3,151,277,509,380组合。这是很多。在Python中桌面上不会发生超过3万亿个元素的循环 - 没办法。
如果你只是在寻找应该有多少,那么直接计算它而不考虑所有这些的公式是on Wikipedia。
编辑:我只是看了一下问题,看起来你正试图通过考虑所有可能的权重组合来解决它,看看它们是否有效。在这种情况下,明确强制它不会起作用 - 你必须考虑一个更聪明的解决方案。
答案 1 :(得分:2)
你可以这样计算这些数字:
请参阅wikipedia了解实际公式。
它像阶乘函数一样缩放。
答案 2 :(得分:0)
根据itertools documentation,number of items returned is n! / r! / (n-r)! when 0 <= r <= n or zero when r > n
。
内存使用量很小 - 足以存储n项的池和r长度的结果元组。