查找分为两组的数字列表的每种可能组合

时间:2015-10-02 11:12:18

标签: algorithm set filtering

我有一个数字列表,例如。

  • 120
  • 233
  • 197
  • 400
  • 276
  • 356
  • 121

出于我的计划的目的,这些数字必须分为两组。根据集合中的数字,程序计算每组的效率。然后它结合了两组组合的效率商。然后将这两组及其效率商保存在一个数组中。

目标是找到两个集合效率最高的集合组合。

我的问题:目前,我似乎无法绕过检查每个可能的组合组合所需的算法。就我所知,它似乎需要一种递归形式。

如果您需要更多信息,请告诉我们!提前谢谢!

1 个答案:

答案 0 :(得分:0)

要迭代可以形成两个集合的所有可能方式,您应该迭代初始列表的所有可能子集。为此,您可以使用大小为n的位掩码,其中n是初始列表中的元素数。

要生成大小为n的所有可能的位掩码,您可以使用一个简单的循环(应该很容易移植到其他语言的c ++代码):

for (int mask = 0; mask < (1 << (n - 1)); ++mask) {
  for (int i = 0; i < n; ++i) {
     if (mask & (1 << i)) {
       // element i is in the first sub set
     } else  {
       // element i is in the second sub set
     }
   }
   // compute efficiency quotient for these subsets
}

总体复杂性是2 n * efficiency_quotient计算,除非你有关于效率商的其他信息,否则你可以做到最好。

注意:这里我循环到1 << (n - 1)以避免考虑子集A和B,然后考虑B和A.如果效率商关注订单,则需要将其更改为1 << n