对于一组k
- 元素,我需要找到所有可能的n
- 元素子集(n < k)
。
我该如何处理这个问题?
只是一个建议会有所帮助谢谢!
答案 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}
它被称为列表或名册方法