Java 以有效的方式查找功率集的特定子集集

Java 以有效的方式查找功率集的特定子集集,java,algorithm,big-o,Java,Algorithm,Big O,我试图找到一种有效的方法来获取一组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 = M

我试图找到一种有效的方法来获取一组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
Set Set=newhashset();
增加(1);
增加(2);
增加(3);
Set set2=新的HashSet();
set2.添加(3);
Set Set=MyUtils.powerSet(Set)//大小-8个子集
Set badSets=MyUtils.powerSet(set2)//大小-2子集
//我的powerset子集集
sets.removeAll(badSets)//size-6子集
然而,当更多的元素被添加到这些集合中时,这并不实际。还有别的办法吗

只是友好地提醒您什么是功率集:

{a,b,c}的幂集:


p(S)={{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}

要从一个幂集减去另一个幂集,扣除幂集计算是多余的。以下是方法:

public static <T>void removePowerSet(
        Collection <? extends Collection <T>> powerSet,
        Collection <T> removedComponents){
    Iterator <? extends Collection <T>> powerSetIter = powerSet.iterator();
    while (powerSetIter.hasNext()) {
        Collection <T> powerSetSubset = powerSetIter.next();
        if (removedComponents.containsAll(powerSetSubset)) {
            powerSetIter.remove();
        }
    }
}
publicstaticvoidremovePowerSet(
收集尝试另一种方法:

让我们调用set3=set-set2

然后Powerset(set)-Poserset(set2)=Powerset(set3)x(Powerset(set)-{})

这里的x是2集的笛卡尔倍数

如果set3有x元素,set2有y元素,那么使用这种方法,它的复杂性大约为2^(x+y),而如果尝试直接删除它,复杂性大约为2^(x+2Y)


Hth.

听起来像是零抑制决策图的工作。它们支持集减法,在ZDD中创建一系列数字的幂集非常简单(事实上,生成的ZDD只有很少的节点)这意味着不对称差异也会很快运行,因为它在两个小的ZDD上,它只取决于节点中ZDD的大小,而不是它们包含的集合的数量。我不知道你接下来要用它做什么,但不管它是什么,你都可以枚举ZDD中的所有集合,并将它们放在另一个数据结构中如果一个集合是另一个集合的子集(A,B大小为m,n),从p(A)中去掉p(B)后,你有2n-2m元素,同样如果B不是A的子集,你也可以假设
B'=与B的交集,同样我们有类似的关系,所以数字都很大

例如,假设A-B有一个元素,| p(A)-p(B)|=2n-2(n-1)=2(n-1),例如,对于n=40,您不能迭代所有项

无论如何,一种方法如下:


在基数2中有一个大小为n的计数器,首先将m+1位设置为
1
,将所有其他位设置为
0
,然后打印结果,每次将计数器增加一个,并将结果打印到2n-1,即O(2n-2m)。

您要求的是计算p(a)-p(B)的有效算法,其中B⊆ A?@JohnKugelman是的,这种语法似乎是正确的。我不相信存在这样高效的算法。对于n个元素,幂集算法的复杂度是O(2^n),如你所说,指数复杂度对于大输入来说是不切实际的。是否有必要在内存中将集合表示为一个整体,或者将这些集合作为一个枚举就足够了?@jmg枚举将很好谢谢你的回答,我将在明天上午讨论这个问题。