算法:将一组元素分成两组的所有可能方法?

时间:2011-08-09 16:21:46

标签: algorithm combinations set

我在集合U中有n个元素(假设由大小为n的数组表示)。我想找到将集合U分成两组A和B的所有可能方法,其中| A | + | B | = n。

因此,例如,如果U = {a,b,c,d},则组合将是:

  1. A = {a} - B = {b,c,d}
  2. A = {b} - B = {a,c,d}
  3. A = {c} - B = {a,b,d}
  4. A = {d} - B = {a,b,c}
  5. A = {a,b} - B = {c,d}
  6. A = {a,c} - B = {b,d}
  7. A = {a,d} - B = {b,c}
  8. 请注意,以下两种情况被认为是相同的,只应计算一种情况:

    案例1:A = {a,b} - B = {c,d}

    案例2:A = {c,d} - B = {a,b}

    另请注意,A或B集合都不能为空。

    我正在考虑实现它的方法是只跟踪数组中的索引并逐步移动它们。索引的数量将等于集合A中的元素数量,集合B将包含所有剩余的未索引元素。

    我想知道是否有人知道更好的实施。我正在寻找更高的效率,因为这段代码将在相当大的数据集上执行。

    谢谢!

1 个答案:

答案 0 :(得分:4)

取所有整数从1到2 ^(n-1),不包含。因此,如果n = 4,则整数从1到7。

这些数字中的每一个都以二进制编写,表示集合A中存在的元素。集合B由剩余的元素组成。注意,因为我们只是2 ^(n-1)而不是2 ^ n,所以总是为set B设置高位;我们总是将第一个元素放在集合B中,因为您希望顺序无关紧要。