在学习FP-Growth的时候,有一个部分是需要求一个集合的全部非空子集。因此结合spmf平台上fp-frowth的源代码和其他csdn上源代码的学习,总结一下如何使用位与运算求一个集合的子集。
一:基础介绍
1.右移( >>)
java中,整数默认就是int类型,也就是32位.因此我们先把数字转换为二进制的,然后进行右移。
2.位与( & )
操作数是两个换成二进制的,对应位数为1则位与的结果为1.
二:算法原理
一个集合里面含有元素,eg: {1,2,3}, {a,b,c,d}.假设一个集合含有n个元素,那么该集合含有的子集个数:2的n次方个。非空子集的个数为(2的n次方-1)个。
利用二进制位的性质,我们可以用二进制一一对应子集。例如(000),(001),(010),(011),(100),(101),(110),(111)刚好对应含有3个元素的集合它的8个子集。
编程思路:把0,1,2,3,4,5,6,7换成二进制(假设用β表示)。换成二进制后,逐一把β的最后一位与1进行位与运算,(因此我们需要借助右移运算来逐一把β的各位依次移动到β的最后一位上。