2010-07-23 2 views
17

의 목록에서 모든 가능한 조합 방법 :내가 이것을 달성 할 수있는 효율적인 방법을 찾고 있어요 번호

  • 당신은 숫자 1의 목록을 가지고 ..... N (일반적으로 1 .. 5 또는 1..7 정도 - 합리적으로 작지만 사례에 따라 다를 수 있음)

  • 해당 숫자의 모든 길이의 모든 조합이 필요합니다. ({1}, {2}, ... {n})의 모든 조합을 사용하면 두 개의 고유 번호 ({1,2}, {1,3}, {1,4})의 모든 조합을 사용할 수 있습니다. .... {n-1, n}), 그 3 개의 숫자 ({1,2,3}, {1,2,4}) 등의 모든 조합

기본적으로, 그룹 내에서 순서는 관계가 없으므로 {1,2,3}은 {1,3,2}와 같습니다. x 목록의 모든 x 그룹을 가져 오는 것입니다.

이것에 대한 간단한 알고리즘 -하지만 지금까지 헛된 검색했습니다. 대부분의 조합론 및 순열 알고리즘은 a) 순서를 고려하여 (예 : 123은 132와 같지 않음) 항상 문자 또는 숫자의 단일 문자열로 작동하는 것처럼 보입니다. ...

누구나 훌륭한, 그들의 소매에 nice'n'quick 알고리즘 ??

감사합니다.

+2

당신은 기본적으로 [전원 설정]을 찾고 있습니다 (http://en.wikipedia.org/wiki/Power_set)의 구글은 나에게 t 일 것이 솔루션을 준 귀하의 목록 (모든 항목이 고유 한 경우 실제로 수학적으로 집합입니다). –

+0

여기도 참조하십시오. https://stackoverflow.com/questions/7802822/all-possible-combinations-of-a-list-of-values/41642733#41642733 – RenniePet

답변

38

이진수를 증가시키고 설정된 비트에 해당하는 요소를 가져옵니다.

00101101 인덱스 0, 2, 3의 요소를 가지고 의미 예를 들어

, 5. 목록은 단순히 1..N 때문에이 요소는 단순히 인덱스 + 1

이 생성 것이다 순차적 순열. 즉, {1, 2, 3} 만 생성됩니다. 아니 {1, 3, 2} 또는 {2, 1, 3} 또는 {2, 3, 1}

+0

@ Henri의 솔루션은이 아이디어를 구현 한 것으로, LINQ. –

+0

@Nate Kohl Yea 방금 그 점에 대해 논평했습니다. 꽤 영리한! +1을주었습니다. – jdmichal

+0

+1 : 주어진 크기 N의 부분 집합의 수가 2^N입니다. 좋은 결과입니다^N –

9

이것은 이전에 그런 작업을 수행하기 위해 작성한 것입니다. 등

List<T[]> CreateSubsets<T>(T[] originalArray) 
{ 
    List<T[]> subsets = new List<T[]>(); 

    for (int i = 0; i < originalArray.Length; i++) 
    { 
     int subsetCount = subsets.Count; 
     subsets.Add(new T[] { originalArray[i] }); 

     for (int j = 0; j < subsetCount; j++) 
     { 
      T[] newSubset = new T[subsets[j].Length + 1]; 
      subsets[j].CopyTo(newSubset, 0); 
      newSubset[newSubset.Length - 1] = originalArray[i]; 
      subsets.Add(newSubset); 
     } 
    } 

    return subsets; 
} 

그것의 int, 걷고, 문자열, FOOS을 위해 작동 할 수 있도록 그것은 일반의,

+3

어떻게 사용하나요? – MonsterMMORPG

31

하지 내 코드 있지만 파워 셋 찾고 있습니다.

public IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list) 
{ 
    return from m in Enumerable.Range(0, 1 << list.Count) 
       select 
        from i in Enumerable.Range(0, list.Count) 
        where (m & (1 << i)) != 0 
        select list[i]; 
} 

출처 : http://rosettacode.org/wiki/Power_set#C.23

+3

그냥 명확히하기 위해, 이것은 LINQ를 통해 구현 된 나의 대답입니다. 나는 꽤 똑똑하다는 것을 인정해야한다. – jdmichal

+0

네, 그렇습니다 :) 저는 여러분이 해결책을 원했기 때문에 코드를 좋아했습니다! – Henri

+2

Linq의 힘, 그 순간의 존경심. – Rev

관련 문제