如何从n组不同大小中选择n个数字?

时间:2014-07-03 11:39:07

标签: java c++ c algorithm

我正在尝试实现一个应用程序。它需要以下逻辑。

Set1 {1,2,3,4}
Set2 {22,44}
Set3 {8,9,11}

我需要从每组中选择一个数字。所以总共会有3个数字。但是有很多种组合。每次运行我的应用程序必须选择不同的组合以获得更好的复我的意思是

First run : 1 22 8
Second run : 1 44 9
And so on...

所以我需要找出不同大小的集合之间的所有组合。我知道在单一集合{1,2,3,4}中找到的方法。

我不知道任何数学算法。在Java或C或C ++中是否有任何逻辑可用。一般的想法是什么?

修改

预期输出为:

1 22 8
1 22 9
1 22 11
1 44 8 
1 44 9 
1 44 11
2 22 8
2 22 9
and so on

3 个答案:

答案 0 :(得分:3)

您可以使用com.google.common.collect.SetsJava的集合中使用笛卡尔积“

例如

  Set<Integer> s1=new HashSet<Integer>();
  s1.add(1);s1.add(4);s1.add(5);

  Set<Integer> s2=new HashSet<Integer>();
  s2.add(2);s2.add(3);s2.add(6);

  Set<Integer> s3=new HashSet<Integer>();
  s3.add(7);s3.add(8);s3.add(8);

  Set<List<Integer>> set=Sets.cartesianProduct(s1,s2,s3);
  //Give type safety warning
  for(List<Integer> l:set){
      System.out.println(l);
  }

<强> 输出

[1, 2, 7]
[1, 2, 8]
[1, 3, 7]
[1, 3, 8]
....

注意

如果您希望确切输出为1 2 7,则只需要List <{1}}的方法

答案 1 :(得分:1)

假设您不关心订单,并且想要获得所有组合,您可以做一些简单的事情:

for (auto it1 : set1)
for (auto it2 : set2)
for (auto it3 : set3)
{
   //do stuff with *it1, *it2, *it3
   //e.g. printing them
   std::cout << *it1 << *it2 << *it3 << std::endl;
   //gives you exactly the listing you want
}

答案 2 :(得分:1)

你可以用三个for循环完成它,假设您想要的只是输出可能的组合。

for(int i = 0; i < set1.size; i++){
   for(int j = 0; j < set2.size; j++){
      for(int k = 0; k < set3.size; k++){
         System.out.println(set1.toArray()[i] + " " + set2.toArray()[j] + " " + set3.toArray()[k]);
         // toArray() represents the set as an array, allowing easy access to its indices
      }
   }
}

这会以简单的方式产生您列出的输出,您可能很容易看到它是如何工作的。对于set1set2的固定值,输出set3的所有可能性。然后从set2更改为另一个未使用的值,依此类推。