【问题标题】:Finding all subsets of a set (PowerSet) [duplicate]查找集合的所有子集(PowerSet)[重复]
【发布时间】:2013-09-14 21:52:29
【问题描述】:

我想找到给定集合的所有子集。 我得到的字符串集定义如下:HashSet<String> L,我想在循环中使用它的所有子集:为每个 做一些事情。 有没有一种简单且复杂度低的方法来做到这一点?

【问题讨论】:

  • 到目前为止,你的家庭作业完成了多少?
  • @monkjack 实际上这不是家庭作业。这只是工作......
  • 看看这里(这是谷歌搜索“java中的powerset”的第一个结果)-> stackoverflow.com/questions/1670862/…

标签: java set


【解决方案1】:

好的,我使用了这个算法(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());
    }
}

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多