【问题标题】:test all combination (c++)测试所有组合(C++)
【发布时间】:2015-05-04 14:45:31
【问题描述】:

我认为这是一个经典问题,但我没有找到适合我的问题的答案。 我有两个“MyObject”向量,我想遍历第一个向量元素与第二个向量元素的所有可能组合,并分别处理所有情况。 (第二个向量可能比第一个包含更多元素)。 这是我目前正在做的伪代码

select_assignement(vector1, vector2, assignement){
    vector1_memory = copy(vector1);
    vector2_memomry = copy(vector2);

    foreach(element1 in vector1){
        foreach(element2 in vector2){
            assignement[element1] = element2;
            vector1_memory.remove(element1);
            vector2_memory.remove(element2);
            if(vector1_memory.size()>0)
                select_assignement(vector1_memory, vector2_memory, assignement);
            else
                print_assignment(assignment); // Here I finally get one possible assignement
        }
    }
}

这里我假设vector1小于或等于vector2。因此,我在两个向量之间分配了每一对“MyObject”,如果还有一些元素,我会递归地再次执行。我的问题是我必须在每次递归时复制向量,因为在向量的循环期间我无法删除 的对象... 我的问题是:这样做是正确的方法,还是我完全疯了?

感谢您的帮助

编辑:[a,b,c][1,2,3,4] 两个列表的输出将是:

assignement : [a1,b2,c3]
assignement : [a1,b2,c4]
 ... 
assignement : [a4,b3,c2]

【问题讨论】:

  • 做一个普通的 double for 有什么问题?为什么要递归?
  • 双 for 循环会给我 vector1 的一个元素与 vector2 的一个元素之间的所有组合,但不是vector1 的整个元素集与vector2 的整个元素集的所有组合。 (或者也许我设计得不好)
  • 您的意思是连接vec1vec2,然后改组生成的vec3 吗?或者也许洗牌然后连接?我无法理解您的目标。
  • 我的意思是如果有两个列表 [a,b,c][1,2,3,4] 我不想作为输出:{[a1],[a2],...[c3],[c4]}{[a1,b2,c3], [a1,b2,c4], ... , [a4,b3,c2]}
  • 你能用两个简单的向量在你的问题中添加一个简单的例子吗?例如三个和两个元素?

标签: c++ combinations


【解决方案1】:

实际上我认为使用 next_permutation 会更好,正如你所说:

void Part::select_assignement(std::vector<MyObject> & vector1, std::vector<MyObject> & vector2 ){
    std::map<MyObject,MyObject> assignement;
    do {
        j++;
        assignement.clear();
        for (size_t i = 0; i < vector1.size(); ++i)
            assignement[vector1[i]] = vector2[i];
        treat_this_case(assignement);
    }while(std::next_permutation(vector2.begin(), vector2.end()));
}

在我看来,它的作用与以前完全相同,但方式要简单得多。

【讨论】:

  • 这里唯一的事情是,如果vector2.size() > vector1.size(),我会得到几次相同的组合(当我得到一个超出赋值范围的排列时).. . 但这在我的场景中不是问题。而且我的测试表明它似乎比第一种递归方式快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2017-02-06
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
相关资源
最近更新 更多