递归方法从m个元素中取出n个元素的算法 ------分析

package mbbc.test.second;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 递归方法从m个元素中取出n个元素的算法 ------分析
 * 
 * @author update_java
 *
 */
public class Main_92{  


    public static void main(String[] args) {
        test1();
    //  test2();
    }

    //***********************方法一*************************************
    /**
     * 每次都创建一个ArrayList对象,所以比较占用内存。
     * 每递归一次都需要,创建一个ArrayList对象,所以比较占用内存。
     * total : 362880
     * time:2800毫秒
     * @param s
     * @param iL
     * @param m
     */

    private static char[] is = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9'};  
    private static int total;  
    private static int m = 9; 


    //核心算法代码
    private void plzh(String s, List<Integer> iL, int m) {  
        if(m == 0) {  
            System.out.println(s);  
            total++;  
            return;  
        }  
        List<Integer> iL2;  
        for(int i = 0; i < is.length; i++) {  
            iL2 = new ArrayList<Integer>(iL);       
            //每递归一次都新创建一个ArrayList对象来保存当前List中存在的字符,所以比较占用内存。
            //    iL2.addAll(iL);  
            if(!iL.contains(i)) {  
                //定义一个字符,方便输出 其他没什么作用
                String str = s + is[i];             
                iL2.add(i);                         
                //利用i的来标示当前List中是否存在待加入元素
                plzh(str, iL2, m-1);  
            }  
        }  
    }  
    public static void test1() {  
        long startTime = System.currentTimeMillis();

        List<Integer> iL = new ArrayList<Integer>();  
        new Main_92().plzh("", iL,  m);  
        System.out.println("total : " + total);  
        long endTime = System.currentTimeMillis();

        int  custTime= (int)(endTime-startTime);
        System.out.println( custTime+"毫秒");
    }  

//*************************方法二**************************************
      static int count = 0;
      /**
       * 平均运行时间为4800毫秒 ,每次都要还原List对象,所以比较占用时间
       * 总个数:362880
       * @param lis
       * @param start
       */
    public static void f(List<Integer> lis,int start){  
        if(start>=lis.size()){  
            System.out.println(lis);    // 输出排列组合   
            count++;                    // 计数   
            return ;  
        }  
        for(int i=1;i<=9;i++){  
            if(!lis.contains(i)){           
                lis.set(start, i);      //如List中不包含当前数字,则修改元素   
            }else{  
                continue;  
            }  
            f(lis,start+1);         // 用递归方式修改每个元素   
            lis.set(start, -1);     // 每次都要还原List对象,所以比较占用时间
        }  
    }  
    public static void test2(){  

    long startTime = System.currentTimeMillis();

        int n = 9;  // 1~9个数中选n个全排列   
        List<Integer> lis = new ArrayList<Integer>();  
        for(int i=0;i<n;i++){    // 初始化lis长度   
            lis.add(-1);  
        }  
        f(lis,0);   // 全排列   
        System.out.println("总个数:"+count);  
        long endTime = System.currentTimeMillis();
         int  custTime= (int)(endTime-startTime);
        System.out.println( custTime+"毫秒");
    }  
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值