【问题标题】:Determining the number of possible combinations确定可能组合的数量
【发布时间】:2010-01-04 05:11:19
【问题描述】:

我试图弄清楚有多少种可能的方法可以组合这个字符串中的各种元素。

"{Hello|Hi|Hey} {world|earth}{!|.|?}"

从每个组 ({}) 中随机选择一个项目(由竖线/| 分隔)并组合成一个字符串。

所以上面的“模板”可以产生:

Hello world.
Hi earth?
Hey world.
Hi world?

我猜这是一种排列,但我想确保我做对了。

如果这也适用于“n”个嵌套项,那就太好了。

"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}"

如果可能的话,我更喜欢基于数学/统计的解决方案而不是蛮力循环来获得答案。

谢谢!

【问题讨论】:

    标签: python math statistics combinatorics


    【解决方案1】:

    嗯,在您的第一个示例中有 3 x 2 x 3 = 18 种组合。

    您的第二个示例是 3 x 4 x 2 x 3 = 72 种组合。

    我不完全确定您所说的 {a|b}|{c|d} 是什么意思,我假设您的意思是选择(a 或 b)或(c 或 d)中的一个,这是 4 个选项。

    您可能想了解herehere 的组合。


    更新:是的,就是这么简单。您的问题就像计算数字中数字组合的数量一样。例如,如果我想查找 ATM PIN 码(4 个十进制数字)的组合数,我设置了 {0-9}、{0-9}、{0-9}、{0-9}。第一个选择有 10 种可能性(= 10)。对于这些数字中的每一个,第二选择有 10 种可能性(= 10 × 10)。对于每一个,第三个有 10 个(= 10 × 10 × 10),第四个有 10 个(= 10 × 10 × 10 × 10 = 10,000)。应该直观地清楚,一个 4 位十进制数有 10,000 种可能性。

    您的示例使用单词集而不是数字集,但原理是相同的。组合数为集合 1 的项目数 × 集合 2 的项目数 × ... × 集合 n 的项目数,以此类推。

    当你开始设置限制,或者从同一个集合中选择多个项目时,它会变得更加复杂,等等。

    【讨论】:

    • 真的这么简单吗?我不需要使用某种排列? (en.wikipedia.org/wiki/Permutation)
    • 要做子选择 {world|earth}|{Goodbye|farewell} 只需递归运行解析算法以获取子部分值并继续处理。
    【解决方案2】:

    问题分解为两个简单的子问题:

    1. 计算每个大括号对中有多少组合在大括号内并在 vbar 内分隔
    2. 将这些数字相乘

    所以对于1,我会使用普通的正则表达式+循环方法:

    import re
    
    def docount(thestring):
        x = re.compile(r'{([^}]}')
        counts = [mo.group(0).count('|')+1 for mo in x.finditer(thestring)]
        result = 1
        for c in counts: result *= c
        return result
    

    我也嵌入了2,因为无论如何这是最微不足道的部分(如果您热衷于将reduce 用于此类目的,那也可以代替最后三行,我猜;-) .

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 2020-09-08
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多