본문 바로가기

알고리즘

멱집합 구하기

획기적인 방법이 있다 바로 비트마스크를 이용하는 방법이다 (나는 정말 획기적이라고 느꼈다.)


예를들면 원소의개수가 3개 (a, b, c)가 있다치면

이걸 비트마스크로 표현하면


000 // 공집합

001 // c

010 // b

011 // b, c

100 // a

101 // a, c

110 // a, b

111 // a, b, 


이런식으로 모든 부분집합 즉 멱집합을 구할수 있다


소스코드

def powerset(s): #배열생성이 generate 방식이다
x = len(s)
masks = [1 << i for i in range(x)]
print(masks)
for i in range(1, 1 << x):
print([(ss,mask) for mask, ss in zip(masks, s) if i & mask])
yield [ss for mask, ss in zip(masks, s) if i & mask]



'알고리즘' 카테고리의 다른 글

트리의 최대 지름  (0) 2017.11.21
LIS 최장 증가 수열  (0) 2017.11.15
펜윅트리로 최소값구하기  (0) 2017.08.25
알고리즘 기본지식  (0) 2016.11.24
소수 구하기  (0) 2016.11.19