java学习-利用位运算求一个集合的子集

本文介绍了如何通过位运算求解一个集合的所有非空子集。首先介绍了右移(>>)和位与(&)运算,接着阐述了算法原理,即一个包含n个元素的集合有2^n - 1个非空子集。最后提供了基于二进制位运算的编程思路,并提到利用右移运算逐位进行位与操作来生成子集。
摘要由CSDN通过智能技术生成

 在学习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进行位与运算,(因此我们需要借助右移运算来逐一把β的各位依次移动到β的最后一位上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值