Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- datamodel
- storagemanger
- json #typescript
- Implementation
- SW
- DP
- designpatternn
- db
- database
- kafka
- entityrelational
Archives
- Today
- Total
i.am.developer
[알고리즘] 멱집합 본문
유튜브의 권오흠 교수님 강의를 참고했습니다.
멱집합이란 어떤 집합의 모든 부분 집합의 집합이다.
우선 부분집합이 뭔지 생각해보자. data = {a,b,c,d} 라는 집합이 있을 때, 이 집합의 모든 부분집합의 개수는? 16개이다. n개의 원소를 가진 집합의 부분집합의 개수는 2^n개이다.
예를 들어 {a,b,c,d}의 모든 부분집합을 나열하려면
1. {a} 를 제외한 {b, c, d}의 모든 부분집합들을 나열하기
2. {a, b,c,d}의 모든 부분집합에 {a}를 추가한 집합들을 나열하기
위 두가지 작업이 이루어지면 된다.
즉, {a,b,c,d}의 부분집합은 아래의 두 집단으로 구성된다.
- {a}를 포함한 집합 ⇒ 2^3개
- {a}를 포함하지 않는 집합 ⇒ 2^3개
- => 둘이 합하면 2^4개!
이걸 계속 진행한다면 아래와 같이 반복되는 모습을 볼 수 있다.
- {a, b, c, d}의 모든 부분집합들을 나열하려면
- {b,c,d}의 모든 부분집합들을 나열하기.
- {b,c,d}의 모든 부분집합들에 {a}를 추가한 부분집합들을 나열하기.
- {b,c,d}의 모든 부분 집합들에 {a}를 추가한 집합을 나열하려면
- {c,d}의 모든 부분 집합들에 {a}를 추가한 집합들을 나열하기.
- {c,d}의 모든 부분집합들에 {a}를 추가한 집합들을 나열하려면
- {d}의 모든 부분집합들에 {a}를 추가한 부분집합들을 나열하기.
- {d}의 모든 부분집합들에 {a,c}를 추가한 부분집합들을 나열하기.
- {c,d}의 모든 부분집합들에 {a}를 추가한 집합들을 나열하려면
- {c,d}의 모든 부분 집합들에 {a,b}를 추가한 집합들을 나열한다.
- {c,d}의 모든 부분 집합들에 {a}를 추가한 집합들을 나열하기.
- {b,c,d}의 모든 부분 집합들에 {a}를 추가한 집합을 나열하려면
이것을 수도코드로 나타내면 아래와 같다.
PowerSet(S):
if S is an empty set: print nothing
else:
let t be the first element of S
find all subsets of S - {t} by calling PowerSet(S-{t})
print the subsets;
print the subsets with adding {t}
return all of them;
이렇게 표현할 수도 있다.
PowerSet(P, s): //S의 멱집합을 구한 후 각각에 집합 P를 합하여 출력
if S is an empty set: print P
else:
let t be the first element of S
PowerSet(P, S-{t})
PowerSet(P u {t}, S-{t})
아래는 C++로 구현해본 간단하게 알고리즘이다.
#include <iostream>
#include <string>
using namespace std;
int n;
string myData = "abcdef";
bool include[6];
void funPowerSet(int k) {
if (k == n) {
for (int i = 0; i < n; i++) {
if (include[i]) cout << myData[i] << " ";
}
cout << endl;
return;
}
// 포함하지 않는 부분
include[k] = false;
funPowerSet(k + 1);
// 포함하는 부분
include[k] = true;
funPowerSet(k + 1);
}
int main() {
n = myData.size();
funPowerSet(0);
}
'프로그래밍 > Algorithm' 카테고리의 다른 글
[자료구조] 큐 (0) | 2020.03.10 |
---|---|
[자료구조] 스택 (0) | 2020.03.10 |
[알고리즘] BFS - Breadth First Search (0) | 2020.03.06 |
[Problem] 백준 14940번 쉬운 최단거리 (0) | 2019.04.20 |
[Problem] 백준 14941번 호기심 (0) | 2019.04.04 |