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; }



  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7086572.html
Copyright © 2011-2022 走看看