二项分布算法(递归)
来源:互联网 发布:豪迪qq群发器mac版 编辑:程序博客网 时间:2024/05/16 01:21
关于用递归实现的二项分布算法
最近在看Sedgewick的《算法》的时候有一题习题是关于改进用递归实现的二项分布算法。这里我令服从二项分布为$X\sim b(N,k,p)$,书本上习题给出的算法是:
public static double binomial(int N, int k, double p){ if( N == 0 && k == 0 ) return 1.0; if( N < 0 || k < 0 ) return 0.0; return (1-p)*binomial(N-1,k,p)+p*binomial(N-1,k-1,p);}
我们可能刚开始看这个递归算法的时候会不太明白(当时我都看懵逼了),那我们就从小一点的值来分析一下,假如
我们可以看到每一次都可以分开两部分然后再继续递归,直到出现
你就会懂为什么有这个递推算法了,而且上面的公式本质上其实是组合递推公式:
那么我们搞懂了这个算法之后,我们会发现这个算法在
所以后来就改了一下算法,改用大量循环,不用递归实现。
//计算组合数 public static double zuhe(double N, double k) { //模拟人类计算的约分过程从而减少阶乘数量 double m = N-k; double min = k; double max = m; double t = 0; double NN=1; double kk=1; if(min>max) { t=min; min = max; max=t; } //把大的阶乘约分去掉 while(N>max) { NN=NN*N; N--; } //计算小的阶乘 while(min>0) { kk=kk*min; min--; } //算出组合数 return NN/kk; } //计算二项分布值 public static double binomial(int N,int k,double p) { double y=1; double s=1; //计算组合数 double a =binomial(N,k); //计算(1-p)的(N-k)次方 while((N-k)>0) { s=s*(1-p); N--; } //计算p的k次方 while(k>0) { y=y*p; k--; } //最后三个值相乘得出二项分布值 return a*y*s; }}
经过去掉递归后的算法就能很快的算出
如果你们还有更好的算法,可以告诉我,大家交流一下学习一下。
1 0
- 二项分布算法(递归)
- 二项分布算法(伯努利实验)
- 二项分布的递归和非递归实现(Java实现)
- 二项分布的递归实现
- 算法之二项分布(java版)
- 算法之二项分布(php版)
- 二项分布(Python)
- 二项分布(Binomial Distribution)
- 二项分布
- 二项分布
- 二项分布
- 二项分布
- 算法之二项分布(c/c++版)
- SGU 495 Kids and Prizes (二项分布)
- 二项分布的实现(np.random.binomial)
- 概率统计基础(3)二项分布
- 二项分布的实现(np.random.binomial)
- 汉诺塔(递归算法)
- 0715 TO DO
- Java 学习
- iOS NSURLRequest NSMutableURLRequest 数据请求
- CAShapLayer 绘制图形
- Class.forName的作用以及为什么要用它
- 二项分布算法(递归)
- HDOJ 1009 FAT MOUSE TRADE
- C语言指针定义变量方式
- Nginx - Windows下Nginx初入门
- scala基础3-文件操作
- 7.15
- NOIP2011 D1T1 铺地毯
- React.js 之筛选篇
- ftok函数