Java 从链接列表中查找电源集
我正在寻找Java编程作业方面的帮助。使用链表,我需要打印出它的电源组。例如,集合{1,2,3}应该打印出来 {{},{1}{1,2}{1,3}{1,2,3}{2}{2,3}{3}}. 幂集中的元素数为2^n。 这需要通过打电话来完成 HeadNode.printpowset()Java 从链接列表中查找电源集,java,powerset,Java,Powerset,我正在寻找Java编程作业方面的帮助。使用链表,我需要打印出它的电源组。例如,集合{1,2,3}应该打印出来 {{},{1}{1,2}{1,3}{1,2,3}{2}{2,3}{3}}. 幂集中的元素数为2^n。 这需要通过打电话来完成 HeadNode.printpowset() 其中HeadNode是链接列表中的第一个元素。 我试过一些方法,但没有一种效果这么好。我认为最好的方法是递归调用该方法,直到到达终点哨兵,然后向后工作,添加剩下的元素。很抱歉,我不能发布更多的代码或想法,因为我尝试过
其中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;
}
空集是终点哨兵。我试过用手把它写出来。这有帮助,但我还是弄不懂。另外,这个类RSet本质上只是一个链表节点。只需迭代从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;
int n=list.size();
Set powerSet=new HashSet();
对于(长i=0;i<(1>j)%2==1)元素,添加(list.get(j));
添加(元素);
}
返回动力装置;
发布非工作代码。它是否使用设置
。我想您可以很容易地将其修改为使用LinkedList
提示:在列表中插入一个空元素..这样您将拥有n+1
元素。然后生成一个递归函数,遍历列表中的所有元素(包括空元素),并找到所有三个可能的组合。例如:{Empty,Empty,1}将是{1}..在尝试编写代码之前,手工解决问题,并尝试编写清晰的人类可读指令。接下来,将这些指令转换为代码注释。最后,填写代码。这将思考如何解决问题与处理不熟悉的语言问题分开。此集合可以包含字符串或任意随机数。我只是举了一个简单的例子。是的,我所描述的算法适用于任何类型的对象。我非常欣赏它,但对于这个赋值,我们不允许使用Set或HashSet。它必须通过这个类递归完成。你在问题中根本没有提到这一点。我们不知道RSet应该是什么。你说得对,我道歉。我还不太熟悉Java,也不知道Set是Java类。我想,既然我的课程叫RSet,它会更明显一点,但我想我错了。很抱歉这样假设。