我正在寻找Java编程任务的一些帮助。使用链表,我需要打印出它的电源组。例如,应该打印出集合{1,2,3}
{{},{1} {1,2} {1,3} {1,2,3} {2} {2,3} {3}}。功率组中的元素数量为2 ^ n。
这需要通过调用来完成
HeadNode.PrintPowerSet();
其中HeadNode是链表中的第一个元素。
我尝试了一些事情,没有什么能做得很好。我认为最好的方法是递归调用该方法,直到到达最终的哨兵,然后向后工作,添加剩下的元素。对不起,我不能发布更多的代码或更多的想法,因为我尝试过没有做过那么好。提前谢谢。
编辑: 这是非工作代码。它返回集合{{1,2,3} {2,3} {3}}
public RSet powerSet()
{
if (this == EMPTY_SET)
return EMPTY_SET;
RSet q = new RSet();
if (q != EMPTY_SET)
q.next = next.powerSet();
q = new RSet(this, n, q.next);
return q;
}
EMPTY_SET是结束哨兵。我试过用手写出来。它有帮助,但我仍然无法得到它。此类RSet本质上只是一个链表节点。
答案 0 :(得分:0)
只需迭代从0到2 ^ n的所有数字 - 1.每个数字定义幂集的一个元素:
该列表定义了您的集合上的固定索引。对于每个数字,创建一个新集。考虑到二进制格式的数字,如果索引i的位为1,则将索引i的原始集合中的项目添加到集合中,否则不添加它。
然后,对于每个数字,您将拥有一组作为幂集的元素。
int n = list.size();
Set<Set<T>> powerSet = new HashSet<Set<T>>();
for( long i = 0; i < (1 << n - 1); i++) {
Set<T> element = new HashSet<T>();
for( int j = 0; j < n; j++ )
if( (i >> j) % 2 == 1 ) element.add(list.get(j));
powerSet.add(element);
}
return powerSet;