網上搜排列組合算法,搜索結果一堆,但極少能說清楚排列和組合的區別,算法也糊里糊塗糊弄人的居多。因爲工作中有一個邏輯需要用到組合算法,花了小半天時間弄好了,記錄在這裏供有需要的人使用。
先看定義
排列組合: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
對比一下運行結果,可以看到排列是包含了組合在裏面的。
如果有時間的話,我會把例子和代碼邏輯解釋補齊。