《编程珠玑(续)(修订版)》—第1章1.6节习题

1.6 习题
1.假设数组X[1..1000]中散布着随机实数。下面这个例程计算最小值和最大值:

Max := Min := X[1]
for I := 2 to 1000 do
   if X[I] > Max then Max := X[I]
   if X[I] < Min then Min := X[I]

B. C. Dull先生注意到,如果一个元素是新的最大值,则这个元素不可能是最小值。因而他把两次比较写成

if    X[I] > Max then Max := X[I]
else  if X[I] < Min then Min := X[I]

这样平均起来将节省多少次比较?先猜猜答案,再通过实现和监视程序性能来找出答案。你猜得怎么样?

2.下列问题与计算素数有关。

a.程序P1到P6把运行时间缩短了两个数量级。你能进一步提高性能吗?

b.实现简单的埃氏筛法(Sieve of Eratosthenes)来计算所有小于n的素数。这个程序的主要数据结构是一个n比特的数组,初始值都为真。每发现一个素数时,数组中所有这个素数的倍数就设置为假。下一个素数就是数组中下一个为真的比特。

c.上述筛法的运行时间作为n的函数是什么样子的?找出一个运行时间为O(n)的算法。

d.给出一个非常大的整数(比如说几百比特长),你如何检验其是否为素数?

3.一种简单的语句计数性能监视工具为每条语句设置一个计数器。描述一下如何使用更少的计数器来减少内存和运行时间。(我曾经用过Pascal系统监视一个程序的性能,结果把程序变慢为原来的1/100;本章描述的行计数性能监视工具采用了本题的技巧,只让程序变慢几个百分点。)

4.一种简单的过程时间性能监视工具这样估计每个过程所花的时间:在有规律的间隔下观察程序计数器(在我的系统上是每秒60次)。这个信息给出了程序文本每个部分所花的时间,但是没有给出哪个过程最费时间。有些性能监视工具给出了每个函数及其动态调用的子函数所花的时间。说明如何从运行时栈中搜集更多信息,以区分出调用函数和被调用函数所花的时间。给定这些数据后,你如何以有用的形式来显示这些数据?

5.准确的数值有助于解释程序在单个数据集上的性能监视结果。但是当有很多数据时,长长的一串数字则可能掩盖数值中的信息。你如何显示程序或管道在100个不同输入上的性能监视结果?特别考虑一下数据的图形显示。

6.1.4节中的程序P6是个正确的程序,其正确性却难以证明。问题出在哪里?如何解决这个问题?

时间: 2024-08-02 15:00:17

《编程珠玑(续)(修订版)》—第1章1.6节习题的相关文章

《编程珠玑(第2版•修订版)》—第2章2.6节习题

2.6 习题 1.考虑查找给定输入单词的所有变位词问题.仅给定单词和字典的情况下,如何解决该问题?如果有一些时间和空间可以在响应任何查询之前预先处理字典,又会如何? 2.给定包含4 300 000 000个32位整数的顺序文件,如何找出一个出现至少两次的整数? 3.前面涉及了两个需要精巧代码来实现的向量旋转算法.将其分别作为独立的程序实现.在每个程序中,i和n的最大公约数如何出现? 4.几位读者指出,既然所有的三个旋转算法需要的运行时间都正比于n,杂技算法的运行速度显然是求逆算法的两倍.杂技算法

《UML面向对象设计基础》—第2章2.6节习题

2.6 习题UML面向对象设计基础① 本书引用了大量比喻.随着对本书内容的体会,分析软件对象类与电子集成电路之间类比的缺陷. ② 根据你对面向对象的了解,你属于反对派.进化派.激进派中的哪一种?通过面向对象的开发与传统主流软件开发的对比,调整你的位置. ③ 你认为企业有必要选择一种语言(开发环境)具有第一章描述的面向对象的所有特性吗?换言之,你赞同一些面向对象的激进派对一些企业选择部分面向对象特性而不是全部面向对象特性持讥讽态度吗? ④ 回顾一下2.1节提到的面向对象功名录.是否有遗漏?如果是这

《UML面向对象设计基础》—第1章1.11节习题

1.11 习题UML面向对象设计基础①(a)重写机器人hominoid-navigation算法,使其更健壮. (b)你能发现在Grid中定义的操作insertHominoid(hom:Hominoid,location:Square,out insertOK:Boolean)中的问题吗? ② 对象知道自己的句柄吗?如果知道的话,对象如何表示其句柄? ③ 为什么在消息参数中很少使用相同的参数名既作为输入参数又作为输出参数?假设参数表示具有句柄的对象. ④ 在 1.5.3节中,我说过"在纯面向对象

编程珠玑--粗略估算

粗略估算是<编程珠玑>中第七章提到的内容.   这篇文章将"粗略估算"看做是一项工程技术,是程序员必备的一项技能之一. 本人非常同意这个观点.粗略估算是一种把复杂的事情简单化的能力.我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力.如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间--如果你能拥有这样的能力,该有多么美好啊.所以难怪乎像微软.Google这样的大公司老喜欢出"请计

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

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

《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组

第2章 关联数组编程珠玑(续)(修订版)人类学家说,语言深刻地影响了世界观.一般把这个观察结果称为"Whorf假说"① ,也经常把它总结为"语言塑造了人的思想". 跟大多数程序员一样,我使用的Algol系列的语言塑造了我的计算思维.对于像我这样的程序员来说,PL/1.C和Pascal看起来都很相似,我们不难把这样的代码翻译成COBOL或Fortran的代码.用这些语言能轻易地表达我们旧的.习以为常的思维模式. 另外一些语言则挑战了我们对于计算的看法.我们感到惊奇的是

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

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

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

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

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

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