我在集合U中有n个元素(假设由大小为n的数组表示)。我想找到将集合U分成两组A和B的所有可能方法,其中| A | + | B | = n。
因此,例如,如果U = {a,b,c,d},则组合将是:
请注意,以下两种情况被认为是相同的,只应计算一种情况:
案例1:A = {a,b} - B = {c,d}
案例2:A = {c,d} - B = {a,b}
另请注意,A或B集合都不能为空。
我正在考虑实现它的方法是只跟踪数组中的索引并逐步移动它们。索引的数量将等于集合A中的元素数量,集合B将包含所有剩余的未索引元素。
我想知道是否有人知道更好的实施。我正在寻找更高的效率,因为这段代码将在相当大的数据集上执行。
谢谢!
答案 0 :(得分:4)
取所有整数从1到2 ^(n-1),不包含。因此,如果n = 4,则整数从1到7。
这些数字中的每一个都以二进制编写,表示集合A中存在的元素。集合B由剩余的元素组成。注意,因为我们只是2 ^(n-1)而不是2 ^ n,所以总是为set B设置高位;我们总是将第一个元素放在集合B中,因为您希望顺序无关紧要。