集合子集的一个Java算法

原创 2006年05月26日 01:24:00
A={a,b,c},集合A中,产生所有A的子集{},{a},{b},{c},{a,b},{b,c},{a,c}{a,b,c}。
子集产生算法比较直观的有递归算法。

这里介绍另一种算法。
思路是,N个元素的集合S的子集个数为 2n, 直观上看,就是N个固定位置(socket0,socket1.....socketN-1),对应S[0],S[1]...S[N-1];
每个socket里面有两种状态(1: Full/ 0: Null),如此便有2n种可能组合;
按照此思路并结合编程语言的位操作,便能产生简洁的算法程序。通过移位操作,得到所有的位置组合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类,保证元素没有重复。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

算法3:给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合

给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合样例字符数组ahia,输出如下: a h i ah ai hi ahi解题思路如下:1、首先算出字符数据中所包含的字符,使...
  • pplin
  • pplin
  • 2017-03-03 13:32
  • 173

java中获取一个集合(Set)的子集的方法

想获取一个链表(List)的子集,可以直接使用subList方法,但是集合(Set)并没有类似的subSet的方法。 有些应用场景需要获取一个集合的子集,这时候该怎么做呢? 最容易想到的方式,就是构造...

JAVA流式组合数算法--集合取子集

package com.kejin.lafite.util; import java.util.ArrayList; import java.util.Collection; import java...

C/C++ 求一个集合的子集

  • 2012-04-02 17:26
  • 538B
  • 下载

输出一个集合的所有子集

输出字符串的所有子集 如:对“abc” 输出:  c b bc a ac ab abc 代码如下: // // main.cpp // 输出一个集合的所有子集 // // Created b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)