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

标签 c++ algorithm selection combinatorics

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

相关文章:

c++ - BST 树中节点的正确结构是什么

c++ - 如何知道 CMakeLists 的库变量名?

algorithm - 找到唯一二进制向量数量的有效解决方案

javascript - Highcharts : On drillup, 如何取消选择我选择的点?

Android ListView高亮显示多个项目

java - 选择排序中的交换

c++ - 查看对象是什么类

c++ - 编译器不识别实现文件中的类成员函数类型,但在接口(interface)文件中识别

algorithm - 检查是否存在圆

arrays - 根据对该数组有效的一组元素将列表拆分为数组的算法