2009-12-08 4 views
1

J'ai n quantité de vecteurs, disons 3, et ils ont n quantité d'éléments (pas nécessairement la même quantité). Je dois choisir x nombre de combinaisons entre eux. Comme choisir 2 à partir de vecteurs [n]. Exemple:Combinaisons d'éléments vectoriels multiples sans répétition

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

Il ne peut pas être des combinaisons d'un vecteur lui-même, comme v1 [0] et v1 [1]. Comment puis-je faire ceci? J'ai tout essayé, mais je n'arrive pas à comprendre ça.

+0

Veuillez utiliser des noms de variables différents pour des choses différentes si ce n'est pas la même valeur. Vous utilisez n trois fois, et déclarez que dans deux cas ils ont des valeurs différentes. – Yacoby

+0

Avez-vous besoin de "N fois choisir 1 élément de M collections"? – xtofl

Répondre

1

Si je vous comprends bien vous avez des vecteurs N, chacun avec un nombre différent d'éléments (appel de la taille de le ième vecteur Si) et vous qui choisir M combinaisons d'éléments de ces vecteurs sans répétition. Chaque combinaison serait N éléments, un élément de chaque vecteur.

Dans ce cas, le nombre de permutations possibles est le produit des dimensions des vecteurs, qui, faute d'une certaine forme de mise en équation, je vais appeler P et calculer en 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]; 

Alors maintenant le problème devient de choisir M nombres distincts entre 0 et P-1, puis convertir chacun de ces M nombres en N indices dans les vecteurs originaux. Je peux penser à quelques façons de calculer ces nombres M, peut-être le plus simple est de continuer à dessiner des nombres aléatoires jusqu'à ce que vous obteniez M distincts (échantillonnage de rejet efficace de la distribution).

La partie légèrement plus compliquée est de transformer chacun de vos M nombres en un vecteur d'indices. Nous pouvons le faire avec

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]; 
} 

qui hache essentiellement m en morceaux pour chaque index, un peu comme vous le feriez lors de l'indexation d'un tableau 2D représentée comme un tableau 1D.

Maintenant, si nous prenons votre N = 3 exemple, nous pouvons obtenir les 3 éléments de notre permutation avec

v1 [index [0]] v2 [indices [1]] v3 [indices [2]]

générer autant de valeurs distinctes de m que nécessaire.

0

Probablement la confusion provient d'une mauvaise définition du problème. Devinant que vous devez N fois choisir 1 élément de 1 de vecteurs V, vous pouvez le faire:

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.