我有 n 个 vector ,比如 3 个,它们有 n 个元素(不一定相同)。我需要在它们之间选择 x 个组合。比如从 vectors[n] 中选择 2。 示例:
std::vector<int> v1(3), v2(5), v3(2);
不能有一个 vector 本身的组合,比如 v1[0] 和 v1[1]。我怎样才能做到这一点? 我已经尝试了一切,但无法解决这个问题。
最佳答案
如果我理解正确的话,你有 N 个 vector ,每个 vector 有不同数量的元素(称为第 i 个 vector Si 的大小),你可以从这些 vector 中选择 M 个元素组合而不重复。每个组合都是 N 个元素,每个元素来自一个 vector 。
在这种情况下,可能排列的数量是 vector 大小的乘积,由于缺少某种形式的方程设置,我将调用 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 个索引到原始 vector 中。我可以想出几种方法来计算这 M 个数字,也许最简单的方法是不断绘制随机数,直到获得 M 个不同的数字(有效地拒绝从分布中抽样)。
稍微复杂一些的部分是将 M 个数字中的每一个转换为索引 vector 。我们可以这样做
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];
}
这基本上将 m 分成每个索引的 block ,就像您在索引表示为一维数组的二维数组时所做的那样。
现在,如果我们以 N=3 为例,我们可以得到我们排列的 3 个元素
v1[指数[0]] v2[指数[1]] v3[指数[2]]
根据需要生成尽可能多的不同 m 值。
关于c++ - 多个 vector 元素的无重复组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1867030/