Powerset

집합 S 의 모든 부분집합을 구하라.

step 1

  • {a,b,c,d,e,f} 의 모든 부분집합을 나열하려면
    • a를 제외한 {b,c,d,e,f}의 모든 부분집합들을 나열하고
    • {b,c,d,e,f}의 모든 부분집합에 {a}를 추가한 집합들을 나열한다.

step2

  • {b,c,d,e,f}의 모든 부분집합에 {a}를 추가한 집합들을 나열하려면
    • {c,d,e,f}의 모든 부분집합들에 {a}를 추가한 집합들을 나열하고
    • {c,d,e,f,}의 모든 부분집합에 {a,b}를 추가한 집합들을 나열한다.

step3

  • {c,d,e,f}의 모든 부분집합들에 {a}를 추가한 집합들을 나열하려면
    • {d,e,f}의 모든 부분집합들에 {a}를 추가한 집합들을 나열하고
    • {d,e,f}의 모든 부분집합들에 {a,c}를 추가한 집합들을 나열한다.

Mission : 집합 S의 PowerSet 을 출력하라

powerSet(s) 
    if S is an empty set
        print nothing;
    else
        let t be the first element of S;
        find all subset of S-{t} by calling powerSet(S-{t});
        print the subset;
        print the subsets with adding t;
powerSet(P, S) 
    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});

recursion 함수가 두개의 집합을 매개변수로 받도록 설계해야한다. 두번째 집합의 모든 부분집합들에 첫번째 집합을 합집합하여 출력한다.

private static char data[] = {'a', 'b', 'c', 'd', 'e', 'f'};
private static int n=data.length;
private static boolean [] include = new boolean [n];

public static void powerSet(int k) {
    if (k==n) {
        for (int i=0; i<n; i++)
            if (include[i]) System.out.print(data[i] + " ");
        System.out.println();
        return;
    }

    include[k] = false;
    powerSet(k+1);
    include[k] = true;
    powerSet(k+1);
}

k : 트리상에서 현재 나의 위치를 표현한다.

if (k==n) : 만약 내 위치가 리프노드라면

include[k] = false : 먼저 왼쪽으로 내려 갔다가

include[k] = true : 이번엔 오른쪽으로 내려 간다

results matching ""

    No results matching ""