集合子集的一个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类,保证元素没有重复。

求一个集合子集的算法示例

  • 2014年06月14日 21:26
  • 464KB
  • 下载

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

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

给定一个集合,输出它的所有子集(JAVA实现)

例如给定一个子集{1,2,3},则它的所有子集为 : {},   {1},   {2},  {3}, {1,2},   {1,3}, {2,3},, {1,2,3}。 代码如下:  /...

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

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

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

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

实现一个集合中最大递增子集

  • 2014年05月06日 14:05
  • 2KB
  • 下载

【LeetCode-面试算法经典-Java实现】【078-Subsets(子集)】

【078-Subsets(子集)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a set of distinct integers, nums, retur...

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

  • 2012年04月02日 17:26
  • 538B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合子集的一个Java算法
举报原因:
原因补充:

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