产生可能集合

理论:

给定一组数字或符号,產生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合為:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。

解法;

如果不考虑字典顺序,则有个简单的方法可以產生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所產生的就是一个集合,例如:

 

000 {}
001 {3}
010 {2}
011 {2,3}
100 {1}
101 {1,3}
110 {1,2}
111 {1,2,3}


瞭解这个方法之后,剩下的就是如何產生二进位数?有许多方法可以使用,您可以使用unsigned型别加上&位元运算来產生,这边则是使用阵列搜寻,首先阵列内容全為0,找第一个1,在还没找到之前将走访过的内容变為0,而第一个找到的0则变為 1,如此重复直到所有的阵列元素都变為1為止,例如:

000 => 100 => 010 => 110 => 001 => 101 => 011 => 111
 
package 经典;

public class PossibleSet2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        char[] b={'a','b','c'};
        possibleSet(b);
    }
    
    public static void possibleSet(char[] b){
        
        int[] a=new int[b.length];
        
        for(int each:a)
            each=0;
        
        while(true)
        {
            int i;
            
            System.out.print("{");
            for(int k=0; k<a.length; k++)
            {
                if(a[k]==1)
                    System.out.print(b[k]);
            }
            System.out.println("}");
            
            for(i=0; i<a.length && a[i]==1; a[i]=0, i++)
                ;
            
            if(i==a.length)
                break;
            else
            {
                a[i]=1;
            }
        }
    }
}

 

posted @ 2014-10-06 16:41  凡尘里的一根葱  阅读(228)  评论(0编辑  收藏  举报