我试图在O(N)
中计算这一点而不会溢出(使用C ++)
为了澄清,n
,r
是事先给出的,我试图找到(n,r)
O(N)
对的一个实例的答案
这是我的试用版:
O(N)
计算ans = n!/(r!(n-r)!2^n)
c = ans
,使用O(N)
为c
修改c /= (n-p); c*=(p+1)
:p = r-1 to 0
。为每个步骤{/ 1}}添加c
基本上我使用ans
来计算最后一个词,然后使用类似滑动窗口的内容来查找第二个词,然后是下一个词......直到第一个词。在这个过程中总结它们。
虽然它似乎是正确的,但实际运行时间仍然比我预期的要慢。所以我想知道这个公式有哪些特殊的技巧可以提高性能?如果没有那么有没有办法减少常数因素呢? (基于以下代码段)
另一个大问题是我面临两难选择:我无法单独为O(N)
计算2^(-n)
或nCr
,否则会出现下溢/溢出。这就是为什么我试图计算n
和希望效果会相互抵消,这样我就不会在整个过程中获得下溢/溢出。是否有任何方法100%确保我不会出现下溢/溢出?
(如果可能,我想避免使用大整数库)
2^(-n) * The last term in the summation
答案 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)
另请注意,上部索引r
和n-r-1
的部分和由二项式定理得到1
。