【问题标题】:How does itertools.combinations scale in Python?itertools.combinations 如何在 Python 中扩展?
【发布时间】:2011-10-29 22:15:21
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

标签: python combinations itertools


【解决方案1】:

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

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

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

【讨论】:

  • 确实是“蛮力”!对于原始解决方案工作得很好,但我可以看到它并没有超出它的范围。但是他们的“三的力量”一般解决方案对于超过 6 件的解决方案确实有意义。谢谢。
  • @deepgeek:从某种意义上说,这是一个令人惊讶的三元计数系统应用。你可以用 2 的幂的重量做同样的事情:1、2、4、8、16……只是所需的石头总和不会达到 40 公斤。 (相反,它们总和得到更好的数字模式:n 这样的石头总和的重量为 2^ n - 1。)
【解决方案2】:

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

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

具体公式见wikipedia

它像阶乘函数一样缩放。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 2013-03-09
      • 2019-02-05
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多