获取集合中所有可能的分区

kho*_*r J 6 java collections partitioning set

在Java中,我有一个集合,我想获取它们的并集构成主要集合的子集的所有可能组合。(划分集合),例如:

set={1,2,3}
Run Code Online (Sandbox Code Playgroud)

结果应该是:

{ {{1,2,3}} , {{1},{2,3}} , {{1,2},{3}} , {{1,3},{2}}, {{1},{2},{3}}}
Run Code Online (Sandbox Code Playgroud)

一组n元素的可能分区B(n)称为贝尔数

到目前为止的代码:

public static <T> Set<Set<T>> powerSet(Set<T> myset) {
        Set<Set<T>> pset = new HashSet<Set<T>>();
        if (myset.isEmpty()) {
            pset.add(new HashSet<T>());
            return pset;
        }
        List<T> list = new ArrayList<T>(myset);
        T head = list.get(0);
        Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
        for (Set<T> set : powerSet(rest)) {
            Set<T> newSet = new HashSet<T>();
            newSet.add(head);
            newSet.addAll(set);
            pset.add(newSet);
            pset.add(set); 
        }

        return pset;
    }
Run Code Online (Sandbox Code Playgroud)

输出数组的幂集:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)

Mig*_*ous 4

最简单的解决方案是对集合的元素数量使用递归:构建一个函数来构造 n 元素集合的所有分区。对于 n+1 个元素,您可以将新元素添加到现有分区集中,或者将其放入自己的集合中。

  • 您构建一个函数,将基础集的元素数量 n 作为参数。如果 n=0,该函数仅返回空集。否则,它用参数 n-1 调用自身,并使用上面解释的结果来计算 n 的答案。很抱歉我不能给你代码片段,因为我不是 Java 程序员。但这种递归方法是一种通用模式,也适用于 Java。 (3认同)