zoukankan      html  css  js  c++  java
  • 9.9递归和动态规划(四)——返回某集合的全部子集

    /**
     * 功能:返回某集合的全部子集。
     */

    三种方法:
    方法一:迭代
    	//迭代
    	/**
    	 * 注意:每次增加集合后会改变原来的集合,无法继续从集合中取出元素。

    * 必须通过一个中间參数moreSubsets来保存中间结果,最后增加allSubsets。

    * @author Lynne * @param set * @param index * @return */ public static ArrayList<ArrayList<Integer>> getSubsets2(ArrayList<Integer> set,int index){ ArrayList<ArrayList<Integer>> allSubsets=new ArrayList<ArrayList<Integer>>(); allSubsets.add(new ArrayList<Integer> ());//增加空集合 while(index<set.size()){ int item=set.get(index); ArrayList<ArrayList<Integer>> moreSubsets=new ArrayList<ArrayList<Integer>>(); for(ArrayList<Integer> subsets:allSubsets){ ArrayList<Integer> newSubsets=new ArrayList<Integer>(); newSubsets.addAll(subsets); newSubsets.add(item); moreSubsets.add(newSubsets); } allSubsets.addAll(moreSubsets); index++; } return allSubsets; }



    方法二:递归
    	//递归法
    	/**
    	 * 思路:简单构造法
    	 * 		计算P(n-1),复制一份结果,然后在每一个复制后的集合中增加an。

    * @param set * @param index * @return */ public static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set,int index){ ArrayList<ArrayList<Integer>> allSubsets; if(set.size()==index){//终止条件。增加空集合 allSubsets=new ArrayList<ArrayList<Integer>>(); allSubsets.add(new ArrayList<Integer>());//空集合 }else{ allSubsets=getSubsets(set, index+1); int item=set.get(index); ArrayList<ArrayList<Integer>> moreSubsets=new ArrayList<ArrayList<Integer>>(); for(ArrayList<Integer> subsets:allSubsets){ ArrayList<Integer> newSubsets=new ArrayList<Integer>(); newSubsets.addAll(subsets); newSubsets.add(item); moreSubsets.add(newSubsets); } allSubsets.addAll(moreSubsets); } return allSubsets; }



    方法三:组合数学
    	//组合数学
    	/**
    	 * 思路:迭代訪问1到2^n的全部数字,再转化为集合
    	 * 每一个元素有两个选择:1)在集合中(“yes”);2)不在集合中(“no”)。

    即每一个子集都是一串yes和no。

    * 总共同拥有2^n个子集,将每一个yes看做1,每一个no看做0,即能够表示为一个二进制串。

    * 所以。构造全部的子集就等同于构造全部的二进制数。迭代訪问1到2^n的全部数字。再转化为集合。

    * @param set * @return */ public static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set){ ArrayList<ArrayList<Integer>> allSubsets=new ArrayList<ArrayList<Integer>>(); int size=1<<set.size();//集合的子集个数。计算2^n。

    for(int i=0;i<size;i++){ ArrayList<Integer> subsets=new ArrayList<Integer>(); subsets=convertIntToSet(i); allSubsets.add(subsets); } return allSubsets; } public static ArrayList<Integer> convertIntToSet(int x){ ArrayList<Integer> subsets=new ArrayList<Integer>(); for(int i=x;i>=1;i>>=1){ if((i&1)==1) subsets.add(i); } return subsets; }



  • 相关阅读:
    java怎样将一组对象传入Oracle存储过程
    android webview内容压线问题解决方法
    BS和CS对比
    【OpenCV-Python】Python Extension Packages for Windows
    hdu4462 Scaring the Birds
    tomcat安全配置之证书密码加密存储
    UVA 10714 Ants 蚂蚁 贪心+模拟 水题
    一个不喜欢读书的Javaer的读书单
    二叉树可视化--Graphviz
    [置顶] mmog游戏开发之业务篇
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7086572.html
Copyright © 2011-2022 走看看