这里有一个解决方案,我使用发电机,优点是,整个功率集从来没有存储在一次.。因此,您可以一个地迭代它,而不需要将它存储在内存中。我想这是个更好的选择.。注意复杂性是相同的,O(2^n),但是内存需求减少了(假设垃圾收集器运行!;)/**
*
*/package org.mechaevil.util.Algorithms;import java.util.BitSet;import java.util.Iterator;import java.util.Set;import java.util.TreeSet;/**
* @author st0le
*
*/public class PowerSet implements Iterator>,Iterable>{
private E[] arr = null;
private BitSet bset = null;
@SuppressWarnings("unchecked")
public PowerSet(Set set)
{
arr = (E[])set.toArray();
bset = new BitSet(arr.length + 1);
}
@Override
public boolean hasNext() {
return !bset.get(arr.length);
}
@Override
public Set next() {
Set returnSet = new TreeSet();
for(int i = 0; i
{
if(bset.get(i))
returnSet.add(arr[i]);
}
//increment bset
for(int i = 0; i
{
if(!bset.get(i))
{
bset.set(i);
break;
}else
bset.clear(i);
}
return returnSet;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not Supported!");
}
@Override
public Iterator> iterator() {
return this;
}}
要调用它,请使用以下模式:Set set = new TreeSet ();
for(int i = 0; i
set.add((char) (i + 'A'));
PowerSet pset = new PowerSet(set);
for(Set s:pset)
{
System.out.println(s);
}
这是我的欧拉项目图书馆.。*)