2009-12-08 2 views
1

벡터의 양이 n, 예를 들어 3이고 n 요소가 (반드시 같은 양 일 필요는 없음) 있습니다. 나는 그 (것)들 사이 x 조합의 양을 선택할 필요가있다. 벡터 [n]에서 2를 선택하는 것과 같습니다. 예 : V1 추천 한 벡터 자체반복이없는 다중 벡터 요소의 조합

std::vector<int> v1(3), v2(5), v3(2); 

있을 수없는 조합 [0] V1 [1]. 어떻게해야합니까? 나는 모든 것을 시도했지만 이것을 알아낼 수는 없습니다.

+0

서로 다른 값을 사용하면 서로 다른 변수 이름을 사용하십시오. n을 세 번 사용하고 두 경우에 서로 다른 값을 가짐을 설명합니다. – Yacoby

+0

"N 회 M 컬렉션에서 요소 1 개를 가져와야합니까?" – xtofl

답변

1

내가 제대로 이해 경우 N 벡터를 가지고, 요소 다른 수의 (와 각각의 크기를 호출 i 번째 벡터 Si)와 반복없이 이러한 벡터로부터 요소의 M 개의 조합을 선택해야합니다. 각 조합은 N 개의 요소가되며, 각 벡터의 요소 중 하나입니다. 이 경우

는 가능한 순열의 수는 벡터의 크기의 제품입니다 ++ 나는 P를 호출하고 C에서 계산됩니다 설정 방정식의 어떤 형태의 부족, 이는 : 그래서

std::vector<size_t> S(N); 
// ...populate S... 
size_t P = 1; 
for(size_t i=0;i<S.size();++i) 
    P *= S[i]; 

이제 문제는 0과 P-1 사이의 M 개의 고유 번호를 선택하고, 그 각각의 M 번호를 N 개의 색인으로 변환하여 원래 벡터로 변환하는 것입니다. M 번호를 계산하는 몇 가지 방법을 생각해 볼 수 있습니다. 아마도 가장 쉬운 방법은 M 개의 다른 숫자를 얻을 때까지 난수를 그려 두는 것입니다.

약간 더 복잡한 부분은 각 M 번호를 인덱스 벡터로 바꾸는 것입니다. 당신이 1 차원 배열로 표현되는 2 차원 배열을 인덱싱 할 때 훨씬처럼 우리는 기본적으로 각 인덱스에 대한 조각으로 m의 최대 갈비

size_t m = /* ... one of the M permutations */; 
std::vector<size_t> indices_m(N); 

for(size_t i=0; i<N; ++i) 
{ 
    indices[i] = m % S[i]; 
    m /= S[i]; 
} 

이 작업을 수행 할 수 있습니다. 이제 우리는 우리가

V1 [인덱스 [0] v2와 함께 우리의 순열의 3 개 요소를 얻을 수있는 N = 3 예를 가지고가는 경우에

[인덱스 [1]] V3 [인덱스 [2]

은 m만큼의 고유 한 값을 필요에 따라 생성합니다.

0

아마 혼란은 문제의 부적절한 정의로 인해 발생합니다. N 시간은 V 벡터의 1에서 1 개 요소를 선택하는 당신이 필요로하는 것을 추측, 당신은이 작업을 수행 할 수 있습니다

select N of the V vectors you want to pick from (N <= V) 
for each of the selected vectors, select 1 of the vector.size() elements.