我正在阅读可能有效的计算方法
ncr
当我遇到这篇文章时。{/ p>
Which is better way to calculate nCr
这里给出的第二个答案是,我无法理解。代码是:
long long combi(int n,int k)
{
long long ans=1;
k=k>n-k?n-k:k;
int j=1;
for(;j<=k;j++,n--)
{
if(n%j==0)
{
ans*=n/j;
}else
if(ans%j==0)
{
ans=ans/j*n;
}else
{
ans=(ans*n)/j;
}
}
return ans;
}
这会是什么复杂性?我尝试用一个例子来做,答案是正确的,但那些条件是什么?
答案 0 :(得分:0)
作为链接中的状态,循环中的多个条件是在执行ans = (ans * n) / j
时处理溢出。
所以功能是:
long long ans = 1;
k = std::min(k, n-k);
int j = 1;
for (; j <= k; j++, n--) {
ans = (ans * n) / j;
}
return ans;
我们有 C(n,r)= n! /(n-r)! r!,大多数因素都可以简化。
复杂性为k
。
答案 1 :(得分:0)
这只是优化的结果,它计算
n! / k! (n-k)! = n * (n-1) * ... (n - k + 1) / k * (k-1) * ... * 1
第一:算法优化:因为C n k = C n(n-k):计算具有较少项的那个 - 很好。
下一次计算优化:当计算ans * n / j
尝试在操作之前简化分数时 - 恕我直言这个是高度可分辨的,因为它是人类的方式(你和我计算得更快6 / 3
比12345678 / 9)
,但对于处理器来说,这种优化只会增加多余的操作。