以下递归算法是计算 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 选择 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 的函数,这个函数的大 O 时间复杂度是多少?