集合子集的一个Java算法

A={a,b,c},集合A中,产生所有A的子集{},{a},{b},{c},{a,b},{b,c},{a,c}{a,b,c}。
子集产生算法比较直观的有递归算法。

这里介绍另一种算法。
思路是,N个元素的集合S的子集个数为 2 n, 直观上看,就是N个固定位置(socket 0,socket 1.....socket N-1),对应S[0],S[1]...S[N-1];
每个socket里面有两种状态(1: Full/ 0: Null),如此便有2 n种可能组合;
按照此思路并结合编程语言的位操作,便能产生简洁的算法程序。通过移位操作,得到所有的位置组合Pattern
0000..0  to  1111..1,  在通过与(&) 操作,分析每个组合pattern中的"1"的情况,并打印出此"1",对应的元素S[i].

/**
 * Author:Dragondwy
 * Date:2006/05/26
 */
package dragondwy.dataStructure;

public class SubSet {
   
    public SubSet(){};
    public void displaySubSet(char setN[])
    {
        int length = setN.length;
        int i;
       
        for( i=0;i<(1<<length);i++){
            System.out.print("{");
            for(int j=0;j<length;j++){
               
                if((i&(1<<j))!=0){
                    System.out.print(setN[j]);                   
                }
            }
                System.out.print("}  ");   
               
        }   
        System.out.println();
        System.out.println("Total: "+ i + " Sub sets");
    }
   
    /**
     * @param args
     */
    public static void main(String[] args) {
        SubSet ss = new SubSet();
        char setN[] = {'a','b','c','d'};
       
        //Assert Result is "{}  {a}  {b}  {ab}  {c}  {ac}  {bc}  {abc}  {d}  {ad}  {bd}  {abd}  {cd}  {acd}  {bcd}  {abcd} "
        ss.displaySubSet(setN);
    }

}



Output Result:

{}  {a}  {b}  {ab}  {c}  {ac}  {bc}  {abc}  {d}  {ad}  {bd}  {abd}  {cd}  {acd}  {bcd}  {abcd} 
Total: 16Sub sets



补充:
集合要求元素不能相同。所以这里使用char[] 数组并不严禁。只是为了示例方便才使用。
正常情况应该使用java的Set类,保证元素没有重复。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值