以下遞歸算法是一個(相當低效的)的方式來計算Ñ選擇K:這個樸素的代碼計算組合的大O複雜性是什麼?
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的函數,這個函數的大時間複雜度是什麼?
你不應該返回'combinationOf(n-1,k-1)+ combinationsOf(n-1,k)'嗎? – Blender
@ Blender-哦,哎呀!是的,修復。 :-) – templatetypedef