- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在 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 到 0
。为每一步添加c
到ans
基本上我使用 O(N)
首先计算最后一项,然后使用类似滑动窗口的东西找到倒数第二项,然后是下一项……直到第一项。在过程中总结。
虽然看起来是正确的,但实际运行时间仍然比我预期的要慢。所以我想知道这个公式是否有任何特殊的已知技巧可以提高性能?如果不是,那么有什么办法可以减少常数因子吗? (基于以下代码片段)
另一个大问题是我面临一个两难选择:对于大的 n
,我无法单独计算 2^(-n)
或 nCr
>,否则会下溢/上溢。这就是为什么我尝试计算 2^(-n) * The last term in the summation
和hope for 效果会相互抵消,这样我就不会下溢/在整个过程中溢出。有什么方法可以100%保证不会下溢/上溢?
(如果可能,我想避免使用大整数库)
// c++ code snippet to demonstrate the idea
double ans = 1;
for(int p=n; p>=1; p--){
ans *= p;
ans /= 2;
if(p <= r) ans /= p;
if(p <= n-r) ans /= p;
}
// now ans = n!/(r!(n-r)!2^n)
// use O(N) more time to find the ultimate ans: summation (n!/(r!(n-r)!2^n)) for r >= 0
double c = ans;
for(int p = r-1; p >= 0; p--){
c /= (n-p);
c *= (p+1);
// Each new c is the next term: n!/((r-1)!(n-r+1)!2^n)
ans += c;
}
最佳答案
计算并存储从 0 到 n 的每个 m 的 log(m!)。
计算log(1/2**n)。
现在总和的第 p 项是 exp(log(n!)-log(p!)-log((n-p)!)+log(1/2**n))。将这些条款加在一起。
关于c++ - 如何在不溢出的情况下计算 O(n) 中前 k 个二项式系数的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42241243/
使用 glm 时,binomial、binomial() 和 'binomial' 之间有什么区别。它们并不相同,如以下代码所示: > library(MASS) > bwdf = birthwt[-
我一直在用我的(非 r-savvy)大脑来让 R 产生二项式 glmer 模型的正确预测的百分比。我知道这不是统计上的 super 信息,但经常被报道;所以我也想举报。 数据: 因变量:Tipo,它有
我一直在寻找一种方法来使数据符合 beta 二项分布并估计 alpha 和 beta,类似于 VGAM 库中的 vglm 包的方式。我一直无法找到如何在 python 中执行此操作。有一个 scipy
如何在 Julia 中提取一般线性模型中指定的数据分布?例如,下面我安装了一个玩具示例 Poisson GLM。我想从模型中提取一个字符串“Poisson”。同样,如果使用数据分布指定模型 = Bin
我是一名优秀的程序员,十分优秀!