我正试图找出使用objective-c从6个对象创建4个组的所有不同方法。
例如,如果我有以下对象:a,b,c,d,e,f
然后我可以创建像
这样的组a,b,c,d
b,c,d,e
a,d,e,f
等等。订单无关紧要。如果我想弄清楚所有不同的可能性,我需要什么样的算法?起初我在考虑排列,但我认为不是这样。我认为可能有更快或更合适的东西,但我忘记了它的名称。
答案 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
}
}
如果对象数量增长,则不是很可扩展,但足够简单。
(我假设订单无关紧要:从你的例子看来似乎如此)