编程珠玑--粗略估算

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

 

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

本人非常同意这个观点。粗略估算是一种把复杂的事情简单化的能力。我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力。如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间……如果你能拥有这样的能力,该有多么美好啊。所以难怪乎像微软、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。

 

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

 

作者:Nick Ye(yjf512)
出处:(http://www.cnblogs.com/yjf512/
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

 

参考文档:

编程珠玑(第二版)

http://www.jguoer.com/blog/index.php/archives/227

时间: 2024-10-30 10:30:17

编程珠玑--粗略估算的相关文章

《编程珠玑(续)(修订版)》目录—导读

内容提要 编程珠玑(续)(修订版) 本书是计算机科学方面的经典名著<编程珠玑>的姊妹篇,讲述了对于程序员有共性的知识.本书延续了<编程珠玑>的特色,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路.书中涵盖了程序员操纵程序的技术.程序员取舍的技巧.输入和输出设计以及算法示例,这些内容结合成一个有机的整体,如一串串珠玑展示给程序员.本书对各个层次的程序员都具有很高的阅读价值. 版权声明 编程珠

《编程珠玑(第2版•修订版)》目录—导读

作者简介编程珠玑(第2版•修订版)Jon Bentley 世界著名计算机科学家,被誉为影响算法发展的十位大师之一.他先后任职于卡内基-梅隆大学(1976~1982).贝尔实验室(1982~2001)和Avaya实验室(2001年至今).在卡内基-梅隆大学担任教授期间,他培养了包括Tcl语言设计者John Ousterhout.Java语言设计者James Gosling.<算法导论>作者之一Charles Leiserson在内的许多计算机科学大家.2004年荣获Dr. Dobb's程序设计卓

编程珠玑--旋转算法

旋转算法出自<编程珠玑>第二章题目.   <编程珠玑>一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输.使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感.   题目:将一个n元一维数组a[n]左移i个位置.例如,当n=8,i=3时,数组abcdefgh旋转为defghabc.请设计一个算法完成这个任务.   1. 块交换法: 分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面.  

编程珠玑--位图法排序

题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复.求如何将这n个正整数升序排列. 约束:最多有1MB的内存空间可用,有充足的磁盘存储空间.   分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码.而包含正整数的文件约为10^7个int大小.这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法.因此衍生出下面两种方法:   方法1

新手菜鸟关于编程珠玑的疑问

问题描述 新手菜鸟关于编程珠玑的疑问 大神们好,我是新手,在看编程珠玑的时候想到一个问题.问题描述如下: 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数 如果内存不足,仅可以用文件来进行处理,如何处理? 编程珠玑和网上各种大神的想法都是这样的: 按最高位分为两段,没有出现的那个数,肯定在比较小的段里面. 各位是不考虑这种情况,还是不可能出现这种情况?: 按每一位分段,分出来的都是相等数目的数.比如说从42亿个32位数里面取出来2亿个数,全取对称数.比如第一

编程珠玑之生成0至n-1之间的k个不同随机序列的扩展问题 --2014人人网笔试题目

  <编程珠玑>中习题1.4的题目是:"如果认真考虑了习题3,你将会面对生成小于n且没有重复的k个整数的问题.最简单的方法就是使用前k个正整数.这个极端的数据集合将不会明显的改变位图方法的运行时间,但是可能会歪曲系统排序的运行时间.如何生成位于0至n - 1之间的k个不同的随机顺序的随机整数?尽量使你的程序简短高效."  解决这个问题可以使用以空间换时间的方式,基本的思想是 利用洗牌的原理,将n个数(0至n-1)按次序排好,依次让每个数和一个随机挑选出的位子进行互换,这样肯

《编程珠玑(第2版•修订版)》—第1章1.1节一次友好的对话

第一部分 基础 编程珠玑(第2版•修订版) 这一部分的5章回顾程序设计的基础知识.第1章介绍一个问题的历史,我们把仔细的问题定义和直接的程序设计技术结合起来,得到优美的解决方案.这一章揭示了本书的中心思想:对实例研究的深入思考不仅很有趣,而且可以获得实际的益处. 第2章讨论3个问题,其中重点强调了如何由算法的融会贯通获得简单而高效的代码.第3章总结数据结构在软件设计中所起到的关键作用. 第4章介绍一个编写正确代码的工具--程序验证.在第9章.第11章和第14章中生成复杂(且快速)的函数时,大量使

《编程珠玑(第2版•修订版)》—第2章2.1节三个问题

第2章 啊哈!算法 编程珠玑(第2版•修订版) 研究算法给实际编程的程序员带来许多好处.算法课教给学生完成重要任务的方法和解决新问题的技术.在后续的章节中将会看到,先进的算法工具有时候对软件系统影响很大--减少开发时间,同时使执行速度更快. 算法与其他那些深奥的思想一样重要,但在更一般的编程层面上具有更重要的影响.在<啊哈!灵机一动>一书中(本章的标题就借鉴了它),Martin Gardner①描述了深得我心的一个思想:"看起来很困难的问题也可以有一个简单的.意想不到的答案.&quo

《编程珠玑(续)(修订版)》—第1章1.1节计算素数

第1章 性能监视工具 编程珠玑(续)(修订版) 听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体.性能监视工具(profiler)对程序起着同样的作用. 你现在用什么工具来研究程序?复杂的分析系统很多,既有交互式调试器,又有程序动画系统.正如CT扫描仪永远代替不了听诊器一样,复杂的软件也永远代替不了程序员用来监控程序的最简单工具--性能监视工具,我们用它了解程序各部分的执行频率. 本章先用两种性能监视工具来加速一个小程序(记住真正的目的是说明性能监视工具).后续