排列組合算法(Java)

網上搜排列組合算法,搜索結果一堆,但極少能說清楚排列和組合的區別,算法也糊里糊塗糊弄人的居多。因爲工作中有一個邏輯需要用到組合算法,花了小半天時間弄好了,記錄在這裏供有需要的人使用。

先看定義

排列組合:permutation and combination

combination組合,表示字母爲C,是無序的;從n個不同的元素中取出m個元素併成一組,叫做從n個不同元素中取出m個元素的一個組合,表示爲C(n,m)

permutation排列,表示字母爲A,是有序的;從n個不痛的元素中取出m個元素,按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的一個排列,表示爲A(n,m)

重點:排列有序,組合無序。

例子:略,後補

組合


import java.util.ArrayList;

/**
 * 組合
 * 
 * Created by majl on 2017/8/28.
 */
public class CombinationUtil {

    public static void main(String[] args) {
        ArrayList<String> is = new ArrayList<String>();
        is.add("1");
        is.add("2");
        is.add("3");
        is.add("4");
        ArrayList<String> res = new CombinationUtil().combine(is, "", 2);
        for (String str : res) {
            System.out.println(str);
        }
    }

    public static ArrayList<String> combine(ArrayList<String> is, String s, int m) {
        ArrayList<String> res = new ArrayList<String>();
        if (m == 0) {
            res.add(s);
            return res;
        }
        for (int i = 0; i < is.size(); i++) {
            String str = "";
            if (s.equals("")) {
                str = is.get(i);
            } else {
                str = s + "," + is.get(i);
            }
            ArrayList<String> innerIs = new ArrayList<String>();
            for (int j = i + 1; j < is.size(); j++) {
                innerIs.add(is.get(j));
            }
            ArrayList<String> innerRes = combine(innerIs, str, m - 1);
            res.addAll(innerRes);
        }
        return res;
    }
}

運行結果:

1,2
1,3
1,4
2,3
2,4
3,4

排列

import java.util.ArrayList;

/**
 * 排列
 * 
 * Created by majl on 2017/8/28.
 */
public class PermutationUtil {
    public static void main(String[] args) {
        ArrayList<String> is = new ArrayList<String>();
        is.add("1");
        is.add("2");
        is.add("3");
        is.add("4");
        ArrayList<String> res = new PermutationUtil().permutate(is, "", 2);
        for (String str : res) {
            System.out.println(str);
        }
    }

    public static ArrayList<String> permutate(ArrayList<String> is, String s, int m) {
        ArrayList<String> res = new ArrayList<String>();
        if (m == 0) {
            res.add(s);
            return res;
        }
        for (int i = 0; i < is.size(); i++) {
            String str = "";
            if (s.equals("")) {
                str = is.get(i);
            } else {
                str = s + "," + is.get(i);
            }
            ArrayList<String> innerIs = new ArrayList<String>();
            innerIs.addAll(is);
            innerIs.remove(i);
            ArrayList<String> innerRes = permutate(innerIs, str, m - 1);
            res.addAll(innerRes);
        }
        return res;
    }
}

運行結果:

1,2
1,3
1,4
2,1
2,3
2,4
3,1
3,2
3,4
4,1
4,2
4,3

對比一下運行結果,可以看到排列是包含了組合在裏面的。

如果有時間的話,我會把例子和代碼邏輯解釋補齊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章