用于生成n个项的所有可能子集的算法

时间:2018-02-19 22:23:54

标签: algorithm math powerset set-theory

我有n个项目,我需要一个算法来制作这些项目的所有子集。

我真正需要的是一种算法,它将这n个项目的所有可能分区分成两个不相交的集合。但我认为所有可能的子集都是一个好的开始 - 然后对于每个子集我可以将所有剩余的项目放入其他不相交的集合中。

1 个答案:

答案 0 :(得分:1)

n个项目中有2 ^ n个可能的子集(包括空项目)。

因此,您可以对范围0..2^n-1中的所有整数进行循环,并将此范围内的每个整数M映射到相应的子集:如果k-,则第k项是子集M的一部分设置M的位。

for M = 0 to 2^n-1 do
   x = M
   k = 0 
   while x <> 0 do
       if (x and 1) then //check if kth bit is set in x
           ......
       x = x >> 1  //shift right
       k = k + 1

或者,您可以为相同范围创建二进制计数器 - 例如,对于集合[0 0 1 1],下一组将为[0 1 0 0]