我需要什么样的算法?

时间:2010-09-25 04:11:45

标签: objective-c cocoa-touch algorithm permutation pseudocode

我正试图找出使用objective-c从6个对象创建4个组的所有不同方法。

例如,如果我有以下对象:a,b,c,d,e,f

然后我可以创建像

这样的组

a,b,c,d

b,c,d,e

a,d,e,f

等等。订单无关紧要。如果我想弄清楚所有不同的可能性,我需要什么样的算法?起初我在考虑排列,但我认为不是这样。我认为可能有更快或更合适的东西,但我忘记了它的名称。

3 个答案:

答案 0 :(得分:3)

排列是正确的起点。一个强力方法是找到所有六个字符串排列,然后抓住前四个并将它们添加到一个集合中。但非常低效。

可以调整基本排列算法,只生成四个一组。

查看此页面:http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations

答案 1 :(得分:1)

这是一种用Java编写的递归方法,适用于一般情况:

public static void comb(int[] arr, int m) {
    comb(arr, m, 0, new ArrayList<Integer>());
}

public static void comb(int[] arr, int m, int ind, ArrayList<Integer> s) {
    int left = m - s.size();
    if (left == 0) {
        System.out.println(s);
        return;
    }

    if (left > arr.length - ind)
        return;
    comb(arr, m, ind + 1, s);
    s.add(arr[ind]);
    comb(arr, m, ind + 1, s);
    s.remove(s.size()-1);
}

每次找到项目时都会分支,需要决定是否包含它。还有一种修剪优化可以避免死角。

答案 2 :(得分:0)

如果您需要以所有可能的方式选择4个不同的对象,则意味着您需要以所有可能的方式删除(“不选择”)其他两个对象。只有两个循环:

for (int i = 0; i < 6; ++i) {
    for (int j = i + 1; j < 6; ++j) {
        // here we select all elements except i and j
    }
}

如果对象数量增长,则不是很可扩展,但足够简单。

(我假设订单无关紧要:从你的例子看来似乎如此)