集合中的组合算法
Java 没有自带的求一个集合的所有子集的方法,我们可以通过集合的子集规律来求。
思路:
对集合中所有元素进行标记,0表示未选中,1表示选中。
示例:
集合{1,2,3,4},长度为4,则 0000
表示一个都不选,0001
表示选数集合中第一个元素 {1},0010
表示选中集合中第二个元素 {2},0011表示选中第一,第二元素 {1,2} …
以此类推,集合{1,2,3,4}的所有集合,包括空集,可以表示为0000
-1111
这样的二进制位码。
我们可以看出集合的所有子集的个数,是2^3=8
个。
由此,可以推理,如果我们需要输出所有的子集,只需要将每个子集用0001
这样的二进制编码表示,然后按照此二进制码输出选中的元素即可,十进制0
-15
,恰巧可以表示为二进制0000
-1111
,这样求集合的所有子集就比较简单了,所有的子集就是:0
-(2^元素数-1)
表示为二进制编码所对应的集合元素的选择。
于是,根据上面的规律,代码可以这样写,先取集合的长度,求出2^该集合的长度
是多少,比如上面的16,然后从0遍历到16-1。
遍历的时候,对0、1、2…每一个数据进行位运算,逐一判断其对应的位数,也就是二进制的表示方式,是1表示选中,0表示未选中。