编程珠玑--粗略估算

news/2024/7/5 5:19:32

粗略估算是《编程珠玑》中第七章提到的内容。

 

这篇文章将“粗略估算”看做是一项工程技术,是程序员必备的一项技能之一。

本人非常同意这个观点。粗略估算是一种把复杂的事情简单化的能力。我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力。如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间……如果你能拥有这样的能力,该有多么美好啊。所以难怪乎像微软、Google这样的大公司老喜欢出“请计算飞机场一天有多少飞机起飞和降落?”“请计算美国一年产轿车多少辆?”这样的估算问题!

 

估算是随着大家的经验增长而越来越准确的。下面介绍几个估算的基本技巧和定理:

 

1.  72法则

假设以年利率r%投资一笔钱y年,如果r*y=72,那么你的投资差不多会翻倍。

 

具体例子:

以年利率6%投资1000美元12年,可得到约2000美元(实际数字是2012美元)

以年利率8%投资1000美元9年,可得到约2000美元(实际数字式1999美元)

 

假设一个指数程序解决规模为n=40的问题需要10秒的时间,并且n每增加1运行时间就增加12%,问当我们把n=100的时候,大约需要多少运行时间?

根据72法则,n每增加6运行时间翻倍,那么当n增加60,运行时间增加为原来的2^10≈1000倍。因此,n=100时,大约需要10 000秒(2~3个小时)。

 

联合国估算1998年的世界人口为59亿,年增长率为1.33%。如果按照这个速率下去,到2050年人口会是多少?

2050-1998=52; 52*1.33≈70

因此根据72法则,2050年人口约为59*2=118亿。

 

2.  Little定律

队列中物体的平均数量为进入速率与平均停留时间的乘积

 

具体例子:

假设你正在排队等待进入一个火爆的夜总会,根据观察,你可以估算:“这个夜总会能容纳60人,每个人在里面逗留时间约是3小时,因此进入夜总会的速率为20人/小时。现在队伍中前面还有20人,因此这意味着我们需要等待大约一个小时的时间。”

 

请估计一下你所在的城市的死亡率,假设人口的平均寿命为70岁。

Little定律告诉我们,城市的死亡率为1/70。

 

当我们设计一个程序的时候,有算法若干,功能需求若干。这时候就需要组织者有足够的估算能力,估算并平衡每个较优算法所付出的时间代价和性能需求。从而做出正确的决定。

 


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2010/11/05/1869513.html,如需转载请自行联系原作者


http://www.niftyadmin.cn/n/3615963.html

相关文章

SpringBoot项目部署到外部Tomcat中的方法

SpringBoot项目部署到外部Tomcat中的方法 1. 特别说明 由于SpringBoot默认访问无需项目名,所以打包成war的SpringBoot项目也需要部署成不需要输入项目名的方式,否则资源无法访问,后面会给部署示例官方教程地址pom.xml调整 1.1 打包方式修改 &…

曲线拟合的线性最小二乘法

最小二乘法拟合 最小二乘法拟合解方程组方法多项式拟合 解方程组方法 栗子:最小二乘法求一个形如:​ 的经验公式。 x [19 25 31 38 44]; y [19.0 32.3 49.0 73.3 97.8]; ​ r [ones(5,1),x.^2]; ab r\y; x0 19:0.1:44; y0 ab(1) ab(2)*x0.^2; plo…

对象反序列化出现类型不匹配的情况(spring-boot-devtools)

目前在做springboot项目的shiro session redis共享功能。但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常 AuthorizationUser user (AuthorizationUser) cache.getSuper(key); 异常信息: java.lang.ClassCastException: com.ch.evaluation.a…

vuex小结

2019独角兽企业重金招聘Python工程师标准>>> store状态管理 1.认识store 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&…

基于Java语言编写的数据库中间件Mycat

一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。基于Java语言编写的数据库中间件 什么是MyCat MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看…

git命令行操作详解

目录 1.常用操作1.1 新建代码库1.2 配置1.3 remote管理1.4 添加和撤销操作1.5 代码提交1.6 分支操作1.7 查看信息1.8 pull操作1.9 push操作1.10 tag操作2. 其他一些汇总2.1 github上初始一个项目2.2 重命名远程分支(先删除远程分支,重命名本地分支&#…

Linux(Centos7)系统安装Python3.6.8教程

大坑: 系统自带的python2不要卸载,一些系统命令要用,2和3可以共存。 linux中Python3.6.8安装 [rootmaster ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 1、首先要查看系统中有没有自带的gcc gcc --version2、通过wg…

LNMP架构(六)之php-fpm,慢执行日志,open_basedir,php-fpm进程管理

2019独角兽企业重金招聘Python工程师标准>>> Php-fpm的pool vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加 include etc/php-fpm.d/*.confvim /usr/local/php/etc/php-fpm.conf//在[global]部分增加 include etc/php-fpm.d/*.conf //这里没有安装的ph…