我有 n 个向量,比如 3 个,它们有 n 个元素(不一定是相同的数量)。我需要在它们之间选择 x 数量的组合。就像从vectors[n]中选择2一样。例子:
std::vector<int> v1(3), v2(5), v3(2);
一个向量本身不能有组合,例如 v1[0] 和 v1[1]。我怎样才能做到这一点?我已经尝试了一切,但无法弄清楚这一点。
我有 n 个向量,比如 3 个,它们有 n 个元素(不一定是相同的数量)。我需要在它们之间选择 x 数量的组合。就像从vectors[n]中选择2一样。例子:
std::vector<int> v1(3), v2(5), v3(2);
一个向量本身不能有组合,例如 v1[0] 和 v1[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];
}
它基本上将 m 分成每个索引的块,就像您在索引表示为 1D 数组的 2D 数组时所做的那样。
现在,如果我们以 N=3 为例,我们可以得到排列的 3 个元素
v1[索引[0]] v2[索引[1]] v3[索引[2]]
根据需要生成尽可能多的不同 m 值。
混淆可能源于对问题的不正确定义。猜测您需要 N 次从 V 个向量中的 1 个中选择 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.