如何查找集合中所有可能的n元素子集?

时间:2013-07-02 20:14:19

标签: algorithm collections set combinations puzzle

对于一组k - 元素,我需要找到所有可能的n - 元素子集(n < k)

我该如何处理这个问题?

只是一个建议会有所帮助谢谢!

3 个答案:

答案 0 :(得分:4)

我在topcoder的算法教程中看到了这一点。花点时间了解它是如何工作的。

遍历所有k元素子集{0,1,... N-1}

   int s = (1 << k) - 1;
   while (!(s & 1 << N))
   {
     // do stuff with s
     int lo = s & ~(s - 1);       // lowest one bit
     int lz = (s + lo) & ~s;      // lowest zero bit above lo
     s |= lz;                     // add lz to the set
     s &= ~(lz - 1);              // reset bits below lz
     s |= (lz / lo / 2) - 1;      // put back right number of bits at end
   }

答案 1 :(得分:2)

当我需要在Java中获取字符串ArrayList的所有组合(或子集)时,我使用了这种方法。

public static List<List<String>> powerset(ArrayList<String> list) {
        List<List<String>> ps = new ArrayList<List<String>>();
        ps.add(new ArrayList<String>());

        // for every item in the original list
        for (String item : list) {
            List<List<String>> newPs = new ArrayList<List<String>>();

            for (List<String> subset : ps) {
                // copy all of the current powerset's subsets
                newPs.add(subset);

                // plus the subsets appended with the current item
                List<String> newSubset = new ArrayList<String>(subset);
                newSubset.add(item);
                newPs.add(newSubset);
            }

            // powerset is now powerset of list.subList(0, list.indexOf(item)+1)
            ps = newPs;
        }
        return ps;
}

这是一项昂贵的操作,可能不适合您的情况。但如果我想快速提出解决方案,我会按照这些方针做点什么。您可以查看newSubset是否小于n,即所需子集的大小,如果小于item,则只会n添加ps。这将阻止您生成大于n的子集。最后,您可以遍历n并删除任何小于{{1}}的arraylist。同样,这个解决方案绝不是完美的....但它应该做的伎俩

答案 2 :(得分:0)

句: 集合A是小于10的整数。

写作:

A={0,1,2,3,4,5,6,7,8,9}

它被称为列表或名册方法