从n个组中查找所有组合大小n

时间:2016-07-06 20:27:38

标签: algorithm combinations

我遇到了编程问题 给定n组人。 从每个组中挑选一个人来组成一个新组。 如何从集合中找到所有可能的组合。

例如:如果我有2个组 第1组:人A,B 第2组:人X Y Z

可能的集合将是(A,X)(A,Y)(A,Z)(B,X)(B,Y)(B,Z)

感谢您提供任何帮助和建议。

贝斯茨。

2 个答案:

答案 0 :(得分:0)

您正在寻找n组中的"product"。你可以递归地实现它:

  • 表示第一组中的每个元素
    • 其余组的每个产品
      • 将元素与产品合并,并将其添加到结果

Python中的示例实现:

def product(lists, pos=0):
    if pos < len(lists):
        for x in lists[pos]:
            for p in product(lists, pos+1):
                yield [x] + p
    else:
        yield []

>>> list(product([[1,2,3], [4,5], [6,7,8]]))
[[1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 5, 6], [1, 5, 7], [1, 5, 8], 
 [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 5, 6], [2, 5, 7], [2, 5, 8], 
 [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 5, 6], [3, 5, 7], [3, 5, 8]]

答案 1 :(得分:0)

因为问题中没有给出语言约束,所以我在java中共享代码。此外,代码还计算了两组的叉积。

Storage::put($file , $content)

输出

import java.util.*;
import java.lang.*;
import java.io.*;


class Combinations
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        System.out.println(prod(Arrays.asList(Arrays.asList("A", "B"), Arrays.asList("X", "Y", "Z"))));
    }

    static <String> List<List<String>> prod(List<List<String>> sets) {
    List<List<String>> res = new ArrayList<List<String>>();
    if (sets.size() == 0) {
        res.add(new ArrayList<String>());
        return res;
    } else {
        List<String> set1 = sets.get(0);
        List<List<String>> adLst = prod(sets.subList(1, sets.size()));
        for (String item : set1) {
            for (List<String> lst : adLst) {
                ArrayList<String> result = new ArrayList<String>();
                result.add(item);
                result.addAll(lst);
                res.add(result);
            }
        }
    }
    return res;
}
}