首页 > 代码库 > 产生可能集合

产生可能集合

理论:

给定一组数字或符号,產生所有可能的集合(包括空集合),例如给定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;            }        }    }}

 

产生可能集合