2014-10-03 372 views
0

我在阅读可能有效的方法来计算 ncr当我遇到此帖时。计算ncr的说明

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

即最佳化而造成的,它计算

n!/k! (n-k)! = n * (n-1) * ... (n - k + 1)/k * (k-1) * ... * 1 

第一:算法优化:作为C N K = C N(N-K):计算具有较少方面所述一个 - 好的。

下计算的优化:计算ans * n/j尝试做操作之前要简化分数时 - 恕我直言,这一个是高度discutable,因为它是一个人会做(你的路,我计算比12345678/9)但是对于处理器快6/3,这个优化只是增加了多余的操作。

+0

谢谢。明白了。:) – 2014-10-03 13:40:22

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