Nik*_*nka 32 language-agnostic algorithm combinations
评估n选择k值的最有效方法是什么?我认为蛮力方式是找到n阶乘/ k阶乘/(nk)阶乘.
更好的策略可能是根据这个递归公式使用dp .有没有其他更好的方法来评估n选择k?
use*_*810 42
这是我的版本,纯粹用整数运算(除以k总是产生一个整数商),并且在O(k)处快速:
function choose(n, k)
if k == 0 return 1
return (n * choose(n - 1, k - 1)) / k
Run Code Online (Sandbox Code Playgroud)
我是递归写的,因为它非常简单漂亮,但如果你愿意的话,你可以把它变成一个迭代的解决方案.
Ped*_*rom 29
你可以使用Multiplicative公式:
http://en.wikipedia.org/wiki/Binomial_coefficient#Multiplicative_formula
如果您要计算许多这样的组合,计算帕斯卡三角形肯定是最佳选择。由于您已经知道递归公式,我想我可以在这里传递一些代码:
MAX_N = 100
MAX_K = 100
C = [[1] + [0]*MAX_K for i in range(MAX_N+1)]
for i in range(1, MAX_N+1):
for j in range(1, MAX_K+1):
C[i][j] = C[i-1][j-1] + C[i-1][j];
print C[10][2]
print C[10][8]
print C[10][3]
Run Code Online (Sandbox Code Playgroud)