• 排列组合问题以及其应用


    排列组合问题在实际生活当中有很多的应用,比如八皇后问题中要求出符合要求的皇后布局,首先要有能力进行可能布局的枚举,而枚举的过程就是一个全排列的过程,而排列组合问题的代码递归式是很容易迷惑人的,我参考了很多的实现,觉得下面的实现比较好,当然我自己重写并测试了。主要是实现了全排列,排列,以及组合的递归实现,有些迷惑性。不过看了一下还有非递归实现的版本,下次再补充上吧。

    //to permutate the data in an array
    //author:sdy
    //creation-time:2014/2/24-17:18
    
    public class permutation{
        
        private int permutationNum;
    
        public permutation(){
            this.permutationNum=0;
        }
    
        public void permutateAll(int[] data){
            this.permutationNum=0;
            this.permutateCoreAll(data,0);
        }
    
        private void permutateCoreAll(int[] data,int index){
            if(data==null||data.length==0){
                return;
            }
            if(index==data.length){
                this.permutationNum=this.permutationNum+1;
                System.out.println(this.permutationNum+":"+this.printArray(data));
            }
            else{
                for(int i=index;i<data.length;i++){
                    int temp;
                    temp=data[index];
                    data[index]=data[i];
                    data[i]=temp;
    
                    this.permutateCoreAll(data,index+1);
    
                    temp=data[index];
                    data[index]=data[i];
                    data[i]=temp;
                }
            }
        }
    
        public void permutate(int[] data,int k){
            this.permutateCore(data,0,k);
        }
        private void permutateCore(int[] data,int index,int k){
    
            if(index==k){
                System.out.println(this.printArray(data,k));
                return;
            }
            for(int i=index;i<data.length;i++){
                int temp;
                temp=data[index];
                data[index]=data[i];
                data[i]=temp;
    
                this.permutateCore(data,index+1,k);
    
                temp=data[index];
                data[index]=data[i];
                data[i]=temp;
    
            }
    
    
        }
    
        private String printArray(int[] data,int length){
            String str="[";
            for(int i=0;i<length;i++){
                str+=data[i]+" ";
            }
            return str+"]";
        }
    
        private String printArray(int[] data){
            String str="[";
            for(int i=0;i<data.length;i++){
                str=str+data[i];
                if(i!=data.length-1){
                    str+=",";
                }
            }
            str=str+"]";
            return str;
        }
    
        public void combine(int[] data,int k){
            int[] subData=new int[k];
            this.combineCore(data,data.length,k,subData);
        }
    
        private void combineCore(int[] data,int n,int k,int[] subData){
            if(k<1||n<1||n<k)
            {
                System.out.println("the input value or their combination is illegal");
            }
    
            for(int i=n;i>=k;i--){
                subData[k-1]=data[i-1];
                if(k>1){
                    this.combineCore(data,i-1,k-1,subData);
                }else{
                    System.out.println(this.printArray(subData));
                }
            }
    
        }
    
        public static void main(String[] args){
    
            permutation per=new permutation();
            int[] data=new int[]{1,2,3,4,5,6,7};
            per.permutate(data,2);
            System.out.println("----------------------");
            per.combine(data,2);
        }
    }
  • 相关阅读:
    mysql中的跨库关联查询【转】
    原本就有mysql,安装phpstudy使用里面自带的mysql导致原来的没服务【转】
    iframe页面刷新问题【转】
    linux重启网络服务出错Shutting down interface eth0: Device state: 3 (disconnected);Active connection path: /org/freedeskto
    Linux下文件(文件夹)的压缩和解压
    用yum安装命令出现报错Another app is currently holding the yum lock解决方法
    一天24小时每隔15分钟96个点操作(二、展示)
    一天24小时每隔15分钟96个点操作(一)
    HTTP请求的GET与POST方式的区别
    css之block,inline和inline-block概念和区别
  • 原文地址:https://www.cnblogs.com/dongyuanshi/p/3565262.html
Copyright © 2020-2023  润新知