gpt4 book ai didi

c++ - 多个 vector 元素的无重复组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:08 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com