2013-07-02 7 views
-1

k -elements 집합의 경우 가능한 모든 n -element 하위 집합 (n < k)을 찾아야합니다.가능한 모든 n 요소 집합을 찾는 방법은 무엇입니까?

이 문제는 어떻게 해결해야합니까?

그냥 도움이 될 것입니다. 감사합니다!

+4

라고'어떻게이 problem.' 접근해야 펜과 종이는 알고리즘을 생각할 때 가장 잘 작동합니다. –

+1

@nickecarlo 정말 도움이 되셨습니다. 감사합니다 ... – user1315305

+0

@ user1315305 잘못된 태그와 질문이 나에게도 일반적이기 때문에 질문이 있습니다. –

답변

4

톱 코더의 알고리즘 자습서에서이 부분을 보았습니다. 어떻게 작동하는지 이해하십시오. 모든 K 개의 요소 서브 세트를 통해

대하여 반복 {0, 1, ... N-1}

int s = (1 << k) - 1; 
    while (!(s & 1 << N)) 
    { 
    // do stuff with s 
    int lo = s & ~(s - 1);  // lowest one bit 
    int lz = (s + lo) & ~s;  // lowest zero bit above lo 
    s |= lz;      // add lz to the set 
    s &= ~(lz - 1);    // reset bits below lz 
    s |= (lz/lo/2) - 1;  // put back right number of bits at end 
    } 
+1

대개 매우 효율적이지만 비트 마술은 알고리즘 아이디어를 전달하기에 좋지 않은 방법입니다. –

+0

@ G.Bach : 문제를 천천히 해결하는 알고리즘보다 신속하게 문제를 해결하는 알고리즘을 전달하는 것이 좋습니다. 특히 이해할 수 있도록 댓글을 달았습니다. 아니? – tmyklebu

+0

@tmyklebu 물론, 더 나은 복잡성을 갖는 알고리즘이 바람직하며 주석이 도움이됩니다. 그러나이 코드가 무엇을 성취해야하는지 알지만, 나는 그것이 어떻게 작동하는지 이해하지 못합니다. –

2

Java에서 String ArrayList의 모든 조합 (또는 하위 집합)을 가져와야 할 때이 메서드를 사용했습니다.

public static List<List<String>> powerset(ArrayList<String> list) { 
     List<List<String>> ps = new ArrayList<List<String>>(); 
     ps.add(new ArrayList<String>()); 

     // for every item in the original list 
     for (String item : list) { 
      List<List<String>> newPs = new ArrayList<List<String>>(); 

      for (List<String> subset : ps) { 
       // copy all of the current powerset's subsets 
       newPs.add(subset); 

       // plus the subsets appended with the current item 
       List<String> newSubset = new ArrayList<String>(subset); 
       newSubset.add(item); 
       newPs.add(newSubset); 
      } 

      // powerset is now powerset of list.subList(0, list.indexOf(item)+1) 
      ps = newPs; 
     } 
     return ps; 
} 

이것은 값 비싼 작업이며 상황에 맞는 완벽한 솔루션이 아닙니다. 그러나 솔루션을 신속하게 마련하려고한다면이 라인을 따라 뭔가를 할 것입니다. newSubsetn보다 작 으면 원하는 하위 집합의 크기를 확인하고 보다 작은 경우 item 만 추가 할 수 있습니다. 그러면 n보다 큰 부분 집합이 생성되지 않습니다. 마지막으로 ps을 반복하고 n보다 작은 arraylist를 제거 할 수 있습니다. 다시 말하지만,이 솔루션은 완벽한 방법은 아닙니다. 그러나 트릭을해야합니다.

+0

나는이 조합 접근법을 좋아하고, 그것이 당신이 건설하고있는 힘의 집합이라고 생각할 때, 나에게 그렇게 나쁘지 않게 보입니다. 그러나 작업이 고정 된 수의 요소로 서브 세트를 얻는 것만이라면 파워 세트를 구성하는 것이 기하 급수적으로 더 비쌉니다. –

+0

@ sunrize920 감사합니다! – user1315305

+0

아쉽게도 하위 집합 크기 = 21로 메모리가 부족하여 크기를 60으로 설정하여 좀 더 나은 솔루션을 찾아야합니다. – user1315305

0

구문 : 집합 A가 이하로 작성 10

보다 정수의 설정 :

A={0,1,2,3,4,5,6,7,8,9} 

이 목록 또는 명부 방법