在数组中查找元素的排列和元素组合,每个元素包含2个元素

时间:2018-02-04 12:39:09

标签: c++ algorithm

我试图找到每个有2个对象的元素的排列和组合--nC2或nP2。我可以通过以下代码找到这些组合。有没有优雅的方法来重写这个?另外,有没有办法找到排列?以下只是一个例子,我的数据集由近2000个元素组成。所以,速度也是一个因素。

#include <iostream>
#include <vector>
#include <string>
int main() {

  std::vector<std::string> array = {"a", "b", "c", "d", "e"};
  std::vector<std::string>::iterator it = array.begin();
  for ( ; it < array.end(); it++ ) {
    for (std::vector<std::string>::iterator it_next = it+1 ; it_next < array.end(); it_next++ ) {
        std::cout << *it << *it_next << "\n";
    }
  }
}

节目输出 -

gcc版本4.6.3

AB AC 广告 AE 公元前 BD 是 光盘 CE 德

2 个答案:

答案 0 :(得分:0)

好吧,如果您只想要所有组合的排列,那么它非常简单,因为每个组合中只有两个项目。所以简单地反转打印 - 如:

  std::vector<std::string> array = {"a", "b", "c", "d", "e"};
  std::vector<std::string>::iterator it = array.begin();
  for ( ; it < array.end(); it++ ) {
    for (std::vector<std::string>::iterator it_next = it+1 ; it_next < array.end(); it_next++ ) {
        std::cout << *it << *it_next << "\n";

        // Print the permutation - simply swap the order
        std::cout << *it_next << *it << "\n";
    }
  }
}

旧答案,我误解了OP想要的内容

  

另外,有没有办法找到排列?

是的,它可以通过多种方式完成,但std::next_permutation似乎很合适。

#include <algorithm>
#include <string>
#include <iostream>
#include <vector> 

// Print the vector
void pv(const std::vector<std::string>& v)
{
    for (const auto& s : v)
    {
        std::cout << s << " ";
    }
    std::cout << std::endl;
}

int main()
{
    std::vector<std::string> array = {"a", "b", "c"};
    std::sort(array.begin(), array.end());
    do 
    {
        pv(array);
    } while(std::next_permutation(array.begin(), array.end()));
}

输出:

a b c 
a c b 
b a c 
b c a 
c a b 
c b a 

答案 1 :(得分:0)

相对于组合的初始代码,您可以通过使用[]而不是迭代器遍历向量来提高性能:

#include <iostream>
#include <vector>
#include <string>
#include <chrono>

int main() {

    std::vector<std::string> array = { "a", "b", "c", "d", "e" };

    int current;
    int next;

    for (current = 0; current < array.size(); ++current)
    {
        for (next = current + 1; next < array.size(); ++next)
        {
            std::cout << array[current] << array[next] << "\n";
        }
    }

    return 0;
}