遍历数组的所有子集

 

 

问题如题,求数组的所有子集,如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]]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章