本章内容比较有意思,它指导读者在日常生活中或工程计算中通过一些最简单的粗略计算来解决或评价一些具体的问题,比如估算项目完成后能否符合实际情况的需要,程序约需要多大的内存空间以及在大数据集下的与运行时间等。
- 基本技巧
两个答案比一个答案好。 从不同的角度考虑同一个问题,给出多份估计的答案,如果答案是相互印证的,说明估计的值就具有更高的可信度。
快速检验。 可以采用“量纲检验”检验给出的估计答案是否正确;可用各数位相加模9的方法检验加法是否正确;不要忘记常识性的东西,如果估计的量与生活常识明显有差,基本可以确定估计的值是错的。
经验法则。 72法则可以用于估算指数过程的增长:假设以年利率r%投资一笔钱y年,如果r×y=72,那么你的投资差不多会翻倍(当然是通过复利计算,每年的收益都将作为次年的本金)。另外,认识到210=1024,所以10次翻倍就是之前的1000倍左右,20次翻倍就是100万倍,等等。关于时间的一个经验法则是:在误差不超过千分之五的情况下,π秒就是一个纳世纪。
实践。 估算技巧只能通过实践来提高。
- 性能估计
在这一部分作者通过实例来说明如何估计数据结构的空间开销和程序运行的时间开销。
在第一个例子中,作者估计存储一个整数和一个结点指针的结构(在32位机器中)占据8个字节,所以两百万个这种结构需要16MB内存,有85MB空闲的内存系统足够了。但在实际使用中内存却不够用。实际上每个结点除去占用8字节外还额外占用了40字节。在附录C中描述了一个用于探测常用数据结构空间开销的程序。
第二个例子中,作者通过测算1 000 000次sqrt(10.0)运算的时间来估计10亿次开方运算的时间。但作者同时也对这种测算方法提出了自己的怀疑——实际运行时间可能会因为在该测试中计算机缓存了sqrt(10.0)的结果而大大延长,或者因为测试时禁用了编译优化而大大缩短。
- 安全系数
这部分的主要思想是要在粗略估计中保留足够的误差范围,以使得准确值能够落在我们估计的数值范围内。
本节的标题来自一位建造大桥的工程师John Roebling。在20世纪50年代之前,我们尚没有方法可以对风暴中的一种气动上升现象进行建模,因此很难确定该用多大的强度对桥梁进行设计。正因此,许多大桥在风暴中折断毁去。而John Roebling则按照所需强度的6倍设计大桥,这使得他设计的大桥十分坚固,完全可以抵御风暴的侵袭。
- Little 定律
系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。并且如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。
比方说,一个容纳60人的夜总会,每个人逗留的平均时间是3个小时,那么排队的人进入夜总会的速率大概是每小时20人。
- 原理总结
在进行粗略估算的时候,要切记爱因斯坦的名言:
任何事都应尽量简单,但不宜过于简单。
简单计算并不是特别简单,其中包含了安全系数,以补偿估算参数时的错误和对问题的了解不足。
- 应当熟记的估计规则
1. 72法则。 假设以年利率r%投资一笔钱y年,如果r×y=72,那么你的投资差不多会翻倍(当然是通过复利计算,每年的收益都将作为次年的本金)。
2. 时间法则。 在误差不超过千分之五的情况下,π秒就是一个纳世纪。
3. Little定律。 系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。(并且如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。)