【发布时间】:2011-09-23 04:08:53
【问题描述】:
我正在尝试找到一种有效的方法来获取 PowerSet 的一组子集。
例如,这适用于集合尺寸较小的情况:
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
Set<Integer> set2 = new HashSet<Integer>();
set2.add(3);
Set<Set<Integer>> sets = MyUtils.powerSet(set); //size - 8 SubSets
Set<Set<Integer>> badSets = MyUtils.powerSet(set2); //size - 2 SubSets
//my set of subsets of the powerset
sets.removeAll(badSets) //size - 6 SubSets
但是,当向这些集合中添加更多元素时,这将变得不切实际。还有其他方法吗?
只是友好地提醒一下 PowerSet 是什么:
{a,b,c} 的幂集:
P(S) = { {}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c} }
【问题讨论】:
-
您要求一种有效的算法来计算 P(A) - P(B) where B ⊆ A?
-
@JohnKugelman 是的,语法似乎正确
-
我不相信这样有效的算法存在。对于 n 元素,幂集算法的复杂度为 O(2^n),如您所说,指数复杂度对于大输入是不切实际的。
-
是否有必要在内存中将您的集合作为一个整体来表示,还是对这些集合进行足够的枚举?
-
@jmg 枚举就可以了