0

ncr当我遇到这篇文章时,我正在阅读可能的有效计算方法 。

哪种计算 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;
}

这将是什么复杂性?我试着用一个例子来做,答案是正确的,但这些条件是什么?

4

2 回答 2

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!/(NR)!!大多数因素都可以简化。

复杂性是k.

于 2014-10-03T07:46:54.467 回答
0

这只是优化的结果,它计算

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

第一:算法优化:因为 C nk = C n (nk) :计算具有较少项的那个 - 很好。

下一个计算优化:当计算ans * n / j尝试在执行操作之前简化分数时 - 恕我直言,这是高度可分割的,因为它是人类会做的方式(你和我的计算速度6 / 312345678 / 9)处理器更快,这种优化只是增加了多余的操作。

于 2014-10-03T07:56:11.403 回答