没有重复的多个向量元素的组合

时间:2009-12-08 13:38:40

标签: c++ algorithm selection combinatorics

我有n个向量,比如说3,它们有n个元素(不一定是相同的量)。我需要选择x之间的组合数量。喜欢从矢量[n]中选择2。 例如:

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

一个载体本身不能有组合,如v1 [0]和v1 [1]。我怎样才能做到这一点? 我已经尝试了一切,但无法弄明白。

2 个答案:

答案 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.