次の再帰アルゴリズムは、n を計算して k を選択する (かなり非効率的な) 方法です。
int combinationsOf(int n, int k) {
if (k == 0) return 1;
if (n == 0) return 0;
return combinationsOf(n - 1, k) + combinationsOf(n - 1, k - 1);
}
これは、次の再帰的な洞察に基づいています。
実際にこの関数を評価するには、多くの関数呼び出しが必要です。たとえば、この方法で 2 choose 2 を計算すると、次の呼び出しが行われます。
combinationsOf(2, 2)
| |
| +- combinationsOf(1, 2)
| | |
| | +- combinationsOf(0, 2)
| |
| +-- combinationsOf(1, 1)
| | |
| | +- combinationsOf(0, 1)
| |
| +- combinationsOf(1, 0)
+- combinationsOf(2, 1)
| |
| +- combinationsOf(2, 0)
|
+- combinationsOf(1, 1)
| |
| +- combinationsOf(0, 1)
|
+- combinationsOf(1, 0)
この関数の実行時間を改善する方法はたくさんあります - 動的計画法を使用したり、閉じた形式の式 nCk = n! を使用したりできます。/ (k! (n - k)!) などですが、この特定のアルゴリズムがどれほど非効率的であるかに興味があります。
n と k の関数として、この関数の時間複雑度はどれくらいですか?