【问题标题】:Explanation for calculating ncr计算ncr的说明
【发布时间】:2014-10-03 06:39:24
【问题描述】:

我正在阅读可能的有效计算方法 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;
}

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

【问题讨论】:

    标签: c++ binomial-coefficients


    【解决方案1】:

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

    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 / 312345678 / 9)但是对于处理器来说,这种优化只是增加了多余的操作。

    【讨论】:

      【解决方案2】:

      作为链接中的状态,循环中的多重条件是处理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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 2012-08-02
        • 2019-02-26
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多