私はすべてのサイズ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のサブセットを繰り返し生成するための別のアルゴリズムを提案したりできますか?
編集:私はついにこの関数を機能させました。Pythonはループインデックスの処理が異なるため、iとthreshの比較を行うためにiと同じ新しい変数を作成する必要がありました。