2010-04-12 8 views
1

내 코드가리스트의 동적 수를 포함 INPUTS라는 목록을 가지고,의는 이벤트알고리즘

나는 것의 A, B, C가 .. N.이 목록에 포함 동적 번호를 부르 자 이벤트의 각 조합이있는 함수를 호출하려고합니다. (이 많거나 작을 수 입력 횟수가 세 파라미터 본 예에서, 동적이지만)

I 각 조합 내 기능이 여러 번 호출해야
INPUTS: A(0,1,2), B(0,1), C(0,1,2,3) 

: 일례로 설명하기 위해,
function(A[0],B[0],C[0]) 
function(A[0],B[1],C[0]) 
function(A[0],B[0],C[1]) 
function(A[0],B[1],C[1]) 
function(A[0],B[0],C[2]) 
function(A[0],B[1],C[2]) 
function(A[0],B[0],C[3]) 
function(A[0],B[1],C[3]) 

function(A[1],B[0],C[0]) 
function(A[1],B[1],C[0]) 
function(A[1],B[0],C[1]) 
function(A[1],B[1],C[1]) 
function(A[1],B[0],C[2]) 
function(A[1],B[1],C[2]) 
function(A[1],B[0],C[3]) 
function(A[1],B[1],C[3]) 

function(A[2],B[0],C[0]) 
function(A[2],B[1],C[0]) 
function(A[2],B[0],C[1]) 
function(A[2],B[1],C[1]) 
function(A[2],B[0],C[2]) 
function(A[2],B[1],C[2]) 
function(A[2],B[0],C[3]) 
function(A[2],B[1],C[3]) 

이것은 내가 지금까지 생각한 것입니다. 내 접근 방식은 지금까지 조합 목록을 작성하는 것입니다. 요소의 조합은 자체 입력 배열 A와 "인덱스"의 목록입니다, B와 C의 예를 들면 다음과 같습니다

내 목록 iCOMBINATIONS는 다음 iCOMBO이

(0,0,0) 
(0,1,0) 
(0,0,1) 
(0,1,1) 
(0,0,2) 
(0,1,2) 
(0,0,3) 
(0,1,3) 

(1,0,0) 
(1,1,0) 
(1,0,1) 
(1,1,1) 
(1,0,2) 
(1,1,2) 
(1,0,3) 
(1,1,3) 

(2,0,0) 
(2,1,0) 
(2,0,1) 
(2,1,1) 
(2,0,2) 
(2,1,2) 
(2,0,3) 
(2,1,3) 

그럼 내가 이런 짓을 했을까 나열 포함 :

foreach(iCOMBO in iCOMBINATIONS) 
{ 
     foreach (P in INPUTS) 
     { 
      COMBO.Clear() 
      foreach (i in iCOMBO) 
      { 
       COMBO.Add(P[ iCOMBO[i] ]) 
      } 
      function(COMBO) --- (instead of passing the events separately) 
     } 
} 

그러나 주어진 수의 입력 및 해당 이벤트에 대해 목록 iCOMBINATIONS를 작성하는 방법을 찾아야합니다. 어떤 아이디어?

실제로 이보다 나은 알고리즘이 있습니까? 나를 도와주는 의사 코드는 훌륭합니다.

C 번호 (또는 VB)

당신

+0

또한 대문자 규칙에 읽을 할 수 있습니다 ... http://msdn.microsoft.com/en-us/library/ ms229043.aspx –

+0

대문자 사용 규칙을 제외하고는 X 좌표와 Y 좌표를 취하고 모든 가능한 점 (X, Y)을 보는 것과 같은 "데카르트 제품"에 대해 이야기하고 있습니다. 문제의 정확한 이름에서 출발하면 약간의 진로가 있어야합니다. 아래 내 의견을 참조하십시오. – maxwellb

답변

0

배열을 사용하여 각 목록의 색인을 저장할 수 있습니다. 예 :

List<List<int>> lists = new List<List<int>> { 
    new List<int> { 0,1,2 }, 
    new List<int> { 0,1 }, 
    new List<int> { 0,1,2,3 } 
}; 

int[] cnt = new int[lists.Count]; 
int index; 
do { 
    Console.WriteLine(String.Join(",", cnt.Select((c,i) => lists[i][c].ToString()).ToArray())); 
    index = cnt.Length - 1; 
    do { 
    cnt[index] = (cnt[index] + 1) % lists[index].Count; 
    } while(cnt[index--] == 0 && index != -1); 
} while (index != -1 || cnt[0] != 0); 
0

매트릭스에 A, B, C를 넣습니다! M = [A, B, C]

recursive_caller(d,params): 
    if d == len(M): 
     function(params) 
     return 

    for i in M[d]: 
     params[d]=i 
     recursive_caller(d+1,params) 
0

당신이 정말 을 원하는, 순열,도 조합 자체도 아닌 것으로 보인다. 여러 세트의 cartesian product (here 참조)을보고 싶습니다.이 반복에는 개별 세트의 조합을 반복 할 수 있습니다.

그러나 각 조합에서 하나의 요소를 선택하는 방법을 찾고 있으므로 조합 문제와는 다릅니다. 이를 수행하는 방법의 수는 세트의 크기입니다. 문제들의 조합은 일반적 K = 1 또는 N는 사소한 N - 많은 것들의 집합, K - 많은 것들을 선택할 포함한다.

C#에서 반복자를 만드는 몇 가지 방법이 논의되었습니다. here. (존 스켓 (Jon Skeet) 포함).

.NET을 사용하는 경우 CodePlex에서 KwCombinatorics과 같은 개발 된 조합 모듈에 관심이있을 수 있습니다. LINQ와 구조에 이제

편집 :

private void cartesian1() 
{ 
    textAppend("Cartesian 1"); 
    var setA = new[] { "whole wheat", "white", "rye" }; 
    var setB = new[] { "cold cut", "veggie", "turkey", "roast beef" }; 
    var setC = new[] { "everything", "just mayo" }; 

    var query = 
     from bread in setA 
     from meat in setB 
     from toppings in setC 
     let sandwich = String.Format("{1} on {0} with {2}", 
      bread, meat, toppings) 
     select sandwich; 

    foreach(string sandwich in query) 
    { 
     textAppend(sandwich); 
    } 
}