我正在研究一个难题,该难题涉及分析所有大小为 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 相同的新变量来进行 i 和 thresh 比较,因为 python 处理循环索引的方式不同。