一组中所有子集的数量

时间:2011-03-07 13:05:30

标签: python algorithm

这就是我想出来计算长度为n,1,...,n的所有子集,其中长度为n的单个元素加倍。很难描述......

def subsets(seq, *args):

    seqstart = [[seq[i] for i in args], ]

    if len(args) == 0:
        for i in range(len(seq)):
            seqstart += subsets(seq, i)
    elif len(args) < len(seq):
        for i in range(args[-1], len(seq)):
            seqstart += subsets(seq, *args + (i, ))

    return seqstart

示例:

>>> subsets(['x', 'y'])
[[], ['x'], ['x', 'x'], ['x', 'y'], ['y'], ['y', 'y']]

>>> subsets(['x', 'y', 'z'])
[[], ['x'], ['x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'y'], ['x', 'x', 'z'], ['x', 'y'], ['x', 'y', 'y'], ['x', 'y', 'z'], ['x', 'z'], ['x', 'z', 'z'], ['y'], ['y', 'y'], ['y', 'y', 'y'], ['y', 'y', 'z'], ['y', 'z'], ['y', 'z', 'z'], ['z'], ['z', 'z'], ['z', 'z', 'z']]

依赖于序列长度的子集(序列)的长度是多少? (我在50小时后用n = 14杀死了这个过程)

谢谢

迈克尔

编辑:谢谢大家。所以它是2n的二项式系数。

要获取所有子集而不是多个集合(所以总长度为2 ^ n)我需要替换

for i in range(args[-1], len(seq)):

for i in range(args[-1] + 1, len(seq)):

3 个答案:

答案 0 :(得分:9)

大小为n的多个集合的数量,大小为n,等于二项式系数

/ 2n \
|    |
\ n  /

接下来,将k的number of combinations with repetition从0总结为n。

对于n = 14,这会产生40116600多个集合。

答案 1 :(得分:1)

对于具有N个元素的给定集合A,子集的数量等于2 ^ N

答案 2 :(得分:0)

一组的许多(正常)子集是2 ^ N

长度为K且具有重复的多个子集是N ^ K.把你的元素想象成某个数字系统的数字。如果N是10,那么你的元素只是数字0..9。

如果你想重复子集的大小是从1到N的任何一个,那么将有N ^ 1 + N ^ 2 + N ^ 3 + ... + N ^ N集。