【问题标题】:Combinations of Multiple Vector's Elements Without Repetition不重复的多个向量元素的组合
【发布时间】:2009-12-08 13:38:39
【问题描述】:

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

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

一个向量本身不能有组合,例如 v1[0] 和 v1[1]。我怎样才能做到这一点? 我已经尝试了所有方法,但无法解决这个问题。

【问题讨论】:

  • 如果它们的值不同,请为不同的事物使用不同的变量名。您使用 n 三次,并声明在两个实例中它们具有不同的值。
  • 你需要“N次从M个集合中挑选1个元素”吗?

标签: c++ algorithm selection combinatorics


【解决方案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 值。

【讨论】:

    【解决方案2】:

    这种混淆可能源于对问题的不正确定义。猜测您需要 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多