找到所有排序组合算法

算法思想是这样的。假设原始数据是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]]
posted @ 2011-08-21 21:49  Yuxing  阅读(707)  评论(0编辑  收藏  举报