关闭

集合子集的一个Java算法

标签: javasocket算法outputcstring
1723人阅读 评论(1) 收藏 举报
分类:
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类,保证元素没有重复。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:206276次
    • 积分:3264
    • 等级:
    • 排名:第10393名
    • 原创:108篇
    • 转载:53篇
    • 译文:0篇
    • 评论:37条
    最新评论
    佛道玄学
    围棋
    学院