問題如題,求數組的所有子集,如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]]