查找集合的所有子集(PowerSet)

时间:2013-09-14 10:36:33

标签: java set

我想找到给定集合的所有子集。 我得到的字符串集定义如下:HashSet<String> L我希望在其所有子集的循环中使用:为每个A subset of L执行某些操作。 是否有一种简单的方法,复杂性低?

2 个答案:

答案 0 :(得分:12)

好的,我使用了这个算法(L是一组字符串):

powerSet = new HashSet<List<String>>();
List<String> mainList = new ArrayList<String>(L);
buildPowerSet(mainList,mainList.size());

private static void buildPowerSet(List<String> list, int count)
{
    powerSet.add(list);

    for(int i=0; i<list.size(); i++)
    {
        List<String> temp = new ArrayList<String>(list);
        temp.remove(i);
        buildPowerSet(temp, temp.size());
    }
}

答案 1 :(得分:3)

所以你想找到一个集合的所有非空子集,对于集合{ab},它是{a} {b} {ab}? 也许不是最快的解决方案,但你可以逐个浏览你的集合中的所有元素,从第一个开始,并确定所有非空集 - &gt;第一个元素,转到第二个元素并复制到目前为止存储的所有集合,并向所有复制的元素添加新元素plus和仅包含新元素的新集合。现在,您拥有前面元素的所有子集以及添加了额外元素的所有这些集合的集合以及仅具有新元素的集合。然后可以对所有元素重复此操作,并且应该给出所有非空子集。

Set<String> inputSet = new HashSet<String>();

inputSet.add("a");
inputSet.add("b");
inputSet.add("c");
inputSet.add("d");

List<Set<String>> subSets = new ArrayList<Set<String>>();
for(String addToSets:inputSet) {
    List<Set<String>> newSets = new ArrayList<Set<String>>();
    for(Set<String> curSet:subSets) {
        Set<String> copyPlusNew = new HashSet<String>();
        copyPlusNew.addAll(curSet);
        copyPlusNew.add(addToSets);
        newSets.add(copyPlusNew);
    }
    Set<String> newValSet = new HashSet<String>();
    newValSet.add(addToSets);
    newSets.add(newValSet);
    subSets.addAll(newSets);
}

for(Set<String> set:subSets) {
    for(String setEntry:set) {
        System.out.print(setEntry + " ");
    }
    System.out.println();
}

哪个会输出:

d 
d b 
b 
d c 
d b c 
b c 
c 
d a 
d b a 
b a 
d c a 
d b c a 
b c a 
c a 
a