二项分布。计算binomial(100,50,0.25)将会产生的递归调用次数(算法第四版1.1.27)
算法第四版35页问题1.1.27,估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数:
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.0-p)*binomial(n-1,k,p) +p*binomial(n-1,k-1,p)
}
虽然书上只让估计调用次数,但是觉得想知道到底调用了几次。
我用图画出递归调用的情况

可以看出递归中有很多重复调用比如,第4层递归 分别调用了binomial(n-3,k-1,p)和binomial(n-3,k-2,p)三次。这就是这个算法效率低的原因。可以看出重复调用的次数是一个杨辉三角。
根据杨辉三角的性质,
第m层递归函数被调用的情况为:

第m层第x(x<=m)项为:

但是有些调用实际上不会发生,结合函数的返回条件:
if(n == 0 && k == 0) return 1.0;
if(n<0 || k<0) return 0.0;
设我们传入的初始参数为n=N,k=K 则,可以得出已下结论:
- 当m=N+1且x=K+1时,满足程序退出的第一个条件;
- 当m>N+1或x>K+1时,满足程序退出的第二个条件(根据杨辉三角的性质,第m行有m项,所有此时有K+1<x<=m)
让我们看看满足以上结论的详细项:
1.下列递归调用的x>K+1,满足结论2:
- m=K+2行的第K+2项:

- m=K+3行的第K+2项到K+3项:

- ……
- m=N+1行的第K+2项到最后一项:

- m=K+2行的第K+2项:
2.m=N+1行的第K+1项递归调用的第一个参数n和第二个参数k均为0,满足结论1。
3.当m=N+2时,显然m>N+1,满足结论2;
如果调用
参数满足函数退出条件,那么由
调用的递归实际上就不会发生,数量为
的系数✖️2。
N+2之后的递归都不会发生,所以做计算时只考虑到N+2层。N+2层的无效调用数量,为N+1层满足结论1或2的调用的数量*2,一次类推,直到K+3层的无效调用数量,为K+2层满足结论1或2的调用数量*2;K+2层到1层上,所有调用都有效;因为K+1层到1层,没有调用满足结论1或2.
根据杨辉三角的性质:从第1层到第N+2层所有的系数和为 
其中不会实际发生的调用次数为从(K+2层到N+1层):

化简之后为:

再次化简

所以最后程序递归调用的总次数为

运行随机验证几个组合,可以证明上述公式是正确的!
二项分布。计算binomial(100,50,0.25)将会产生的递归调用次数(算法第四版1.1.27)的更多相关文章
- 计算阶乘n!末尾0的个数
一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= ...
- python_计算1+……+100中偶数和
如何计算1+--+100中偶数和? 1. 把奇数去掉,通过if,判断累加数除以2的余数,是否为1,判断是否是奇数 2. 通过continue 跳过对奇数的累加 #!/usr/bin/python3 d ...
- MathExam小学一二年级计算题生成器V1.0
MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...
- pat1067. Sort with Swap(0,*) (25)
1067. Sort with Swap(0,*) (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...
- Hadoop 系统配置 map 100% reduce 0%
之前在本地配置了hadoop伪分布模式,hdfs用起来没问题,mapreduce的单机模式也没问题. 今天写了个程序,想在伪分布式上跑一下mapreduce,结果出现 map 100% reduce ...
- 【男性身材计算】胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm);腰围=身高*0.47(如:身高175c… - 李峥 - 价值中国网
[男性身材计算]胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm):腰围=身高*0.47(如:身高175c- - 李峥 - 价值中国网 李峥:[男性身材计算]胸围=身 ...
- resin4.0.25 安装配置 及结合eclipse开发
resin4.0.25 安装配置 及结合eclipse开发 本文大部分内容是对官网的翻译,及自己配置后的一些体会. 一. 基于win ,resin基本安装1,安装jdk1.6或更高版本2,配置环境 ...
- linux系统更新rpm包问题 ,报错rhn-check-2.0.2-5.el7.noarch has missing requires of yum-rhn-plugin >= ('0', '1.6.4', '1')
报错信息: rhn-check-2.0.2-5.el7.noarch has missing requires of yum-rhn-plugin >= ('0', '1.6.4', '1') ...
- wordcount程序出现map 100% reduce 0%问题的解决方法
运行wordcount程序一直停在map 100% reduce 0%, input文件夹的内容: 其中: f1.txt中的内容为:hello hadoop f2.txt中的内容为:hello had ...
随机推荐
- dubbo接口测试
1.下载所需工具eclipse或intellij idea,下载maven,maven中config/settings.xml中要添加公司(测试人员公司)的maven库,不然被测dubbo服务jar包 ...
- jquery 悬浮验证框架 jQuery Validation Engine
中文api 地址 http://code.ciaoca.com/jquery/validation-engine/ 和bootstarp 一起使用不会像easyui 验证那样生硬 修改版 原版 ...
- FileInputStream与FileOutputStream类
FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名. 创建FileInputStream实例对象时,指 ...
- JSON特殊字符的处理
本文转自:http://blog.csdn.net/btt2013/article/details/66970735 JSon 数据中的String 传递数据时,需要处理好特殊字符. JSon数据中有 ...
- Oracle复习(有记录才能沉淀.......)
一.Oracle准备工作 1.安装Oracle Oracle数据库产品是免费的,我们可以从Oracle的官方网站(http://www.oracle.com)下载到程序安装包,Oracle在Windo ...
- scala flatMap reduceLeft foldLeft
object collection_t1 { def flatMap1(): Unit = { val li = List(,,) val res = li.flatMap(x => x mat ...
- C语言 · 数组查找及替换
算法训练 数组查找及替换 时间限制:1.0s 内存限制:512.0MB 问题描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序. ...
- RSYNC在zabbix中的检查
RSYNC在zabbix中的检查 作者:高波 归档:学习笔记 2017/08/21 快捷键: Ctrl + 1 标题1 Ctrl + 2 标题2 Ctrl + 3 标题3 Ctr ...
- 数学 - SGU 118. Digital Root
Digital Root Problem's Link Mean: 定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根. 现在给出n个Ai,求出A1*A2*…*A ...
- Generator生成器函数
接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...