从链表中查找powerset

时间:2013-02-11 18:13:34

标签: java powerset

我正在寻找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本质上只是一个链表节点。

1 个答案:

答案 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;