如何在没有溢出的情况下计算O(n)中前k个二项式系数的和?

时间:2017-02-15 05:18:46

标签: c++ algorithm math combinatorics

我试图在O(N)中计算这一点而不会溢出(使用C ++)

enter image description here

为了澄清,nr是事先给出的,我试图找到(n,r)

O(N)对的一个实例的答案

这是我的试用版:

  1. 使用O(N)计算ans = n!/(r!(n-r)!2^n)
  2. 允许c = ans,使用O(N)c修改c /= (n-p); c*=(p+1)p = r-1 to 0。为每个步骤{/ 1}}添加c
  3. 基本上我使用ans来计算最后一个词,然后使用类似滑动窗口的内容来查找第二个词,然后是下一个词......直到第一个词。在这个过程中总结它们。

    虽然它似乎是正确的,但实际运行时间仍然比我预期的要慢。所以我想知道这个公式有哪些特殊的技巧可以提高性能?如果没有那么有没有办法减少常数因素呢? (基于以下代码段)

    另一个大问题是我面临两难选择:我无法单独为O(N)计算2^(-n)nCr,否则会出现下溢/溢出。这就是为什么我试图计算n希望效果会相互抵消,这样我就不会在整个过程中获得下溢/溢出。是否有任何方法100%确保我不会出现下溢/溢出?

    (如果可能,我想避免使用大整数库)

    2^(-n) * The last term in the summation

2 个答案:

答案 0 :(得分:2)

计算并存储从0到n的每个m的log(m!)。

计算log(1/2 ** n)。

现在和的第p项是exp(log(n!) - log(p!) - log((n-p)!)+ log(1/2 ** n))。一起添加这些术语。

答案 1 :(得分:0)

为什么不在第一个循环中开始求和?如果第一个循环将正确计算二项式系数,您可以将它们相加并计算分母。目前您只计算ans=2^(-n),因为其他操作相互抵消。

写出的金额是

1/2^n*(1+n+n*(n-1)/2+n*(n-1)*(n-2)/(2*3)+...)

两个二项式之间的商是

nC[k+1]/nC[k] = (n-k) / (k+1)

另请注意,上部索引rn-r-1的部分和由二项式定理得到1