遞歸算法: java
/** * 求排列(遞歸) * @param result 最終排列結果 * @param out 已經排列內容 * @param target 須要排列的數據集合 * @param m 排列元素個數 * * 待解決:1 大數據 溢出 () 2 使用多線程提速排列過程 * * */ public static void f(List<String> result, String out, List<String> target, int m) { if(m == 0) { result.add(out); System.out.println(out); } else { for (int i=0; i<target.size(); i++) { List<String> tem = getSubList(target,i); f(result, out + target.get(i), tem, m-1); } } } /** * 求排除第i個元素的子集 * @param target * @param i * @return */ private static List<String> getSubList(List<String> target, int i) { List<String> temp = new ArrayList<String>(); temp.addAll(target); temp.remove(i); return temp; }
public static void main(String[] args) { List<String> list = new ArrayList<String>(); String[] arr = "1 2 3 4 5 6 7 8 9 0 A B C D E F G".split(" "); Collections.addAll(list, arr); List<String> result = new ArrayList<String>(); int len = arr.length; int m = 17; long timer = System.currentTimeMillis(); f(result, "", list, m); timer = System.currentTimeMillis() - timer; System.out.println("A("+m+","+len+") size="+result.size()+" timer="+timer); }