1

我正在尝试一种蛮力方法来尝试找到一个谜题扩展的组合。

我正在尝试获得大量组合,然后测试每个组合以查看它们是否符合某些标准。我使用 Python 优秀的 itertools 生成组合,本质上这给了我一个迭代器,我可以遍历并测试每个迭代器。

这会很快返回并给我91390 个组合来检查:

itertools.combinations(range(1, 40), 4)

这需要几分钟,然后给我198792594种组合进行测试:

itertools.combinations(range(1, 122), 5)

当我进入下一个级别时,我需要这个答案:

itertools.combinations(range(1, 365), 6)

当我进入一组 364 的 6 路组合时……需要很长时间。年龄。我是否天生就要求大量的组合?它是如何扩展的?

4

3 回答 3

6

您要求 365 选择 6 = (365 * 364 * ... * 360) / (6 * 5 * ... * 2 * 1) = 3,151,277,509,380 组合。那是很多。在你的桌面上用 Python 循环超过 3 万亿个元素是不会发生的——不可能。

如果您只是在寻找应该有多少,那么直接计算而不考虑所有这些的公式在 Wikipedia 上

编辑:我刚刚查看了这个问题,似乎您正在尝试通过考虑所有可能的权重组合并查看它们是否有效来解决它。在这种情况下,暴力破解显然是行不通的——你必须想出一个更聪明的解决方案。

于 2011-10-29T22:26:51.483 回答
2

您可以像这样计算这些数字:

  1. 访问 google.com
  2. 输入“40 选择 4”
  3. 输入“121选5”
  4. 输入“ 364选6

有关实际公式,请参阅维基百科

它像阶乘函数一样缩放。

于 2011-10-29T22:25:04.533 回答
0

根据itertools 文档number of items returned is n! / r! / (n-r)! when 0 <= r <= n or zero when r > n.

内存使用量很小——仅足以存储 n 项池和 r 长度结果元组。

于 2011-10-30T00:11:04.547 回答