问题如题,求数组的所有子集,如items = [1, 2, 3, 4, 5],求所有items的子集
方法一:二进制,思想是n个元素的所有自己有2**n个,而n 位数的二进制数刚好也有2 ** n个,遍历n位数的所有二进制排序,0代表存在,1代表不存在
def PowerSetBinary(items):
n = len(items)
s = np.array(items)
for i in range(2**n):
e = list(bin(i))[2:]
print('before e:', e)
e = np.array(e) == '1'
print('=======================')
print('after e:', e)
print(s[n-len(e):][e])
部分结果如下,选出来结果为True的元素
before e: ['0']
=======================
after e: [False]
[]
before e: ['1']
=======================
after e: [ True]
[5]
before e: ['1', '0']
=======================
after e: [ True False]
[4]
before e: ['1', '1']
=======================
after e: [ True True]
[4 5]
before e: ['1', '0', '0']
=======================
after e: [ True False False]
[3]
方法二:遍历 思想:元素每增加一个,子集为新加的元素与原来子集的组合再加上原来的子集
item为1时 子集为[[],[1]]
item为[1,2]时 新的子集为原来的子集+[2] 即[[2],[1,2]],在加上原来的子集[[],[1]],以此类推
def PowerSetRecursive(items):
result = [[]]
for x in items:
result.extend([subset + [x] for subset in result])
print('========', result)
print(result)
return result
部分结果为
======== [[], [1]]
======== [[], [1], [2], [1, 2]]
======== [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]