下面这个递归算法是计算组合数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时间复杂度是什么?
combinationsOf(n - 1, k - 1) + combinationsOf(n - 1, k)
,不是吗? - Blender