如何在java中从一组大小为n的数组中迭代生成k个元素子集?
我正在研究一个难题,涉及分析所有大小的k个子集并找出哪一个是最佳的。我编写了一个解决方案,当子集数量较少时,该解决方案可以正常工作,但对于较大的问题,它耗尽了内存。现在,我正在尝试将用python编写的迭代函数转换为java,以便我可以在创建每个子集时对其进行分析,并仅获取表示其优化程度的值,而不是整个集合,这样我就不会耗尽内存。以下是我到目前为止所拥有的,即使对于非常小的问题,它似乎也没有完成:
public static LinkedList<LinkedList<Integer>> getSets(int k, LinkedList<Integer> set)
{
int N = set.size();
int maxsets = nCr(N, k);
LinkedList<LinkedList<Integer>> toRet = new LinkedList<LinkedList<Integer>>();
int remains, thresh;
LinkedList<Integer> newset;
for (int i=0; i<maxsets; i++)
{
remains = k;
newset = new LinkedList<Integer>();
for (int val=1; val<=N; val++)
{
if (remains==0)
break;
thresh = nCr(N-val, remains-1);
if (i < thresh)
{
newset.add(set.get(val-1));
remains --;
}
else
{
i -= thresh;
}
}
toRet.add(newset);
}
return toRet;
}
任何人都可以帮我调试这个函数或建议另一种算法来迭代生成大小k子集吗?
编辑:我终于让这个函数工作了,我必须创建一个与我相同的新变量来做i和thresh比较,因为python处理循环索引的方式不同。