問題は次のとおりです。シーケンス内のすべての数値がnになるところで、2つ以上のシーケンスをいくつ作成できますか?"Partition Function Q"またはnに合計するシーケンスの合計数を効率的に解決する
public static int GetSequences(int n, int k) {
if(n <= k) return 0;
int result = 1;
for(int i = k + 1; i < n; i++) {
result += GetSequences(n - i, i);
}
return result;
}
しかし、解決する時間がnの指数である:私は次の関数を得ることができた*式hereを使用して
http://mathworld.wolfram.com/PartitionFunctionQ.html
。 n = 180
で約10秒以上かかることがあります。
私はハッシュマップを使用して以前に解決した値を保存しようとしましたが、かなり野生の結果が出ました。
static Map<Long,Long> cache = new HashMap<Long,Long>();
public static int solve(int n) {
for(int i = 3; i <= n; i++) {
cache.put((long)i, (long)GetSequences(i, 0));
}
return cache.get((long) n).intValue() - 1;
}
public static int GetSequences(int n, int k) {
if(n <= k) return 0;
if(cache.containsKey((long)k)) {
return cache.get((long)k).intValue();
}
int result = 1;
for(int i = k + 1; i < n; i++) {
result += GetSequences(n - i, i);
}
return result;
}
シーケンスの総数を高速に生成するには、どのように効率を改善できますか?
*:リンクで問題を解決するためGetSequences(n,k)
機能ためには、結果はシーケンス[n,0]
"ハッシュマップを使用して以前に解決した値を保存しようとしましたが、結果はかなり荒れていました。 - あなたはバグがあった。それが何であれ、それを見つけて修正してください。 – user2357112
@ user2357112ハッシュマップのために以前持っていたと思ったことを追加しました。問題の原因をさらに深く見ていきます。 – Clint
私はかなり長い間ここでそれをカットするつもりはないと確信しています。 – user2357112