面接の準備をしているときに、次の問題が見つかりました。
3は1+1 + 1、1 + 2、2+1と書くことができます。4は、1 + 1 + 1 + 1、1 + 1 + 2、2 + 2、1 + 2 + 1、2 + 1 + 1、3 + 1、1+3と書くことができます。整数が与えられた場合、可能な式はいくつ存在しますか?(1+2と2+1は異なります)
したがって、これは、それを計算し、それを実行するすべての数値のセットを取得するためのブルートフォースアルゴリズムを作成するのはかなり簡単です。
private static Set<List<Integer>> getIntegersSum(int num) {
Set<List<Integer>> returnSet = new HashSet<List<Integer>>();
if (num == 0) {
returnSet.add(new LinkedList<Integer>());
return returnSet;
}
for (int i = 1; i <= num; i++) {
Set<List<Integer>> listNMinI = getIntegersSum(num - i);
for (List<Integer> l : listNMinI) {
l.add(0, i);
returnSet.add(l);
}
}
return returnSet;
}
このアルゴリズムの複雑さを表す漸化式は次のとおりです。
T(0) = \Theta (1)
T(n) = O(n) + \Sum_{i=0}^{n-1} T(i)
この漸化式から大きな複雑さに到達する方法がよくわかりません。また、質問に対する閉じた形の解があるかどうかも知りたいです(各番号に対してそのような組み合わせがいくつあるか)。
また、各呼び出しの結果をキャッシュしてこのアルゴリズムをメモ化した場合の複雑さもわかりません(フィボナッチを高速化する方法と同様)。