Question

Je n montant de vecteurs, disons 3, et ils ont n nombre d'éléments (pas forcément du même montant).J'ai besoin de choisir un montant x de combinaisons entre eux.Comme choisissez 2 à partir de vecteurs[n].Exemple:

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

Il ne peut y avoir des combinaisons à partir d'un vecteur de lui-même, comme v1[0] v1[1].Comment puis-je faire cela?J'ai tout essayé, mais ne peut pas comprendre cela.

Était-ce utile?

La solution

Si je vous comprends bien, vous avez des vecteurs N, chacun avec un nombre différent d'éléments (appel de la taille du vecteur ième Si) et vous permettant de choisir des combinaisons M 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 l'un des choix M nombres distincts entre 0 et P-1, puis en convertissant chacun de ces numéros de M en indices de N dans les vecteurs d'origine. Je peux penser à quelques façons de calculer ces chiffres M, est peut-être le plus facile à garder le dessin des nombres aléatoires jusqu'à ce que vous obtenez M des organes distincts (échantillonnage efficacement le rejet de la distribution).

La partie un peu plus alambiquée est de transformer chacun de vos numéros de M dans 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 selon les besoins.

Autres conseils

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

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top