当我看到这篇文章时,我正在阅读计算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;
}这方面的复杂性又有多大?我试着做了一个例子,答案是正确的,但这些条件是什么呢?
发布于 2014-10-03 07:56:11
这只是优化的结果,它计算
n! / k! (n-k)! = n * (n-1) * ... (n - k + 1) / k * (k-1) * ... * 1第一:算法优化:当C=C(N):计算条目较少的那个--不错。
下一步的计算优化:当计算ans * n / j时,尝试在进行操作之前简化分数-- IMHO,这一次是高度分散的,因为这是人类所做的事情(你和我计算的6 / 3比12345678 / 9)快,但是对于处理器来说,这种优化只是增加了多余的操作。
发布于 2014-10-03 07:46:54
作为链接中的状态,循环中的多个条件是在执行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!大多数因素都可以简化。
复杂性是k。
https://stackoverflow.com/questions/26174333
复制相似问题