找到所有排序组合算法
算法思想是这样的。假设原始数据是N个字符串,且 N>=4。
这里假设数据是:1,2,3,4
首先找到所有的2项组合,即12,13,14,23,24,34。找的方法是这样的,先取出数据的第一项,即1,然后和后面所有的组合,即12,13,14。再取出数据的第二项,和后面的去组合,即23,24。接下来按同样的方法得到,34.
接下来我们去3项集合。也是首先取到数据的一项,即1,然后和2项集的从23开始的每一项去组合,即123,124,134. 然后在取出数据的第二项,即2,和34开始后的每一项去组合,即234.
依照此方法,就可以去到任意的长度的数据的所有组合。
这里是用JAVA实现的代码。
//原始数据
List<String> ids = new ArrayList<String>(Arrays.asList("1", "2", "3", "4"));
// 保存结果
List<HashSet<String>> res = new ArrayList<HashSet<String>>();
// 保存上一次的数据
List<HashSet<String>> pre = new ArrayList<HashSet<String>>();
for (int i = 1; i <= ids.size(); i++) {
// 保存本次数据
List<HashSet<String>> tm = new ArrayList<HashSet<String>>();
int m = 0;
for (int ii = 0; ii < ids.size(); ii++) {
if (i != 1) {
for (int iii = m; iii < pre.size(); iii++) {
if (!pre.get(iii).contains(ids.get(ii))) {
HashSet<String> t = new HashSet<String>(Arrays.asList(ids
.get(ii)));
t.addAll(pre.get(iii));
tm.add(t);
} else
m++;
}
} else
tm.add(new HashSet<String>(Arrays.asList(ids.get(ii))));
}
res.addAll(tm);
pre.clear();
pre.addAll(tm);
}
System.out.println(res.size());
System.out.println(res);
运行结果。
15 [[1], [2], [3], [4], [2, 1], [3, 1], [1, 4], [3, 2], [2, 4], [3, 4], [3, 2, 1], [2, 1, 4], [3, 1, 4], [3, 2, 4], [3, 2, 1, 4]]

浙公网安备 33010602011771号