昨天看到有人在TL里说一个面试题 : 不用递归法 求一个固定集合内的所有子集。经 @miloyip 指出,这是个power set 的问题,在中文中称为幂集。这个中学数学里就学过了,不过如何用计算机求幂集还真没考虑过,就索性找了找求幂集的算法。根据wiki上的介绍和我自己的理解( http://en.wikipedia.org/wiki/Power_set),给定一个包含n个元素的集合s,我用python实现了三种计算幂集的算法。如果没有额外说明,下文中的 union表示取两个集合的合集。
1. 利用二进制数与幂集之间的对应关系
在[0,2^(n-1)]的整数区间上任取一个值x,x的二进制表示可以用来表示s的一个子集:对于x的第i位,如果为1,则此子集包含s的第i个元素,否则不包含。因此,只要遍历 [0,2^(n-1)]的整数区间,就能列举出s的所有子集,这些子集的集合就是s的幂集。这个方法陈硕老大也指出来了。代码如下:
def power_set(s):
n = len(s)
test_marks = [ 1<
for k in range(0, 2**n):
l = []
for idx, item in enumerate(test_marks):
if k&item:
l.append(s[idx])
yield set(l)
#A simple test
def __test__():
s = [1,2,3,4]
for e in power_set(s):
print e
__test