排列组合问题以及其应用

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

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

 

posted on 2014-02-24 22:16  itat  阅读(363)  评论(0编辑  收藏  举报

导航