我有n个向量,比如说3,它们有n个元素(不一定是相同的量)。我需要选择x之间的组合数量。喜欢从矢量[n]中选择2。 例如:
std::vector<int> v1(3), v2(5), v3(2);
一个载体本身不能有组合,如v1 [0]和v1 [1]。我怎样才能做到这一点? 我已经尝试了一切,但无法弄明白。
答案 0 :(得分: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数转换为索引向量。我们可以用
来做到这一点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];
}
基本上为每个索引切换成块,就像索引表示为1D数组的2D数组一样。
现在,如果我们采用你的N = 3例子,我们可以用
得到我们排列的3个元素V1 [指数[0]] V2 [指数[1]] V3 [指数[2]]
根据需要生成m个不同的m值。
答案 1 :(得分:0)
可能由于对问题的不正确定义而引起的混乱。猜测你需要N次从V向量中选择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.