- 定价:¥39.00
- 校园优惠价:¥33.15 (85折) (马上了解)
- 评分:
(已有133条评价)
- 促销活动:
- 此商品暂时缺货(可留下联系方式,到货将第一时间通知您)
基本信息
- 原书名:Programming Pearls (2nd Edition)
- 原出版社: Addison-Wesley Professional
- 作者: (美)Jon Bentley
- 译者: 黄倩 钱丽艳
- 丛书名: 图灵程序设计丛书 软件工程系列
- 出版社:人民邮电出版社
- ISBN:9787115179289
- 上架时间:2008-9-24
- 出版日期:2008 年10月
- 开本:16开
- 页码:228
- 版次:2-1
- 所属分类:计算机 > 软件与程序设计 > 综合 > 程序(设计)理论
计算机 > 软件工程及软件方法学 > 综合
【插图】

编辑推荐
计算机科学的不朽经典
融深邃思想、实战技术与趣味轶事于一炉的奇书
字字珠玑,意味隽永
内容简介
作译者
黄倩 中国科学院计算技术研究所博士研究生,毕业于南京大学,目前主要从事视频处理等方面的研究工作。..
钱丽艳 北京大学信息科学技术学院基础实验教学研究所软件实验室主任、工程师,毕业于国防科技大学,目前主要从事数值计算、程序设计等方面的研究工作。...
目录
第1章 开篇
1.1 一次友好的对话
1.2 准确的问题描述
1.3 程序设计
1.4 实现概要
1.5 原理
1.6 习题
1.7 深入阅读
第2章 啊哈!算法
2.1 三个问题
2.2 无处不在的二分搜索
2.3 基本操作的威力
2.4 排序
2.5 原理
2.6 习题
2.7 深入阅读
2.8 变位词程序的实现(边栏)
第3章 数据决定程序结构
3.1 一个调查程序
译者序
作者博览群书,旁征博引,无论是计算机科学的专业名著,如《计算机程序设计艺术》,还是普通的科普名著,如《啊哈!灵机一动》,都在作者笔下信手拈来、娓娓道出,更不用说随处可见的作者自己的真知灼见了。如果说《计算机程序设计艺术》这样的巨著代表了程序员们使用的“坦克和大炮”一类的重型武器,这两本书则在某种程度上类似于鲁迅先生所说的“匕首与投枪”一类的轻型武器,更能满足职业程序员的日常需要。或者说前者是武侠小说中提高内力修为的根本秘籍,后者是点拨临阵招数的速成宝典,二者同样都是克敌制胜的法宝,缺一不可。在无止境地追求精湛技艺这一点上,程序员、数学家和武侠们其实是相通的。..
在美国,这两本书不仅被用作大学低年级数据结构与算法课程的教材,还用作高年级算法课程的辅助教材。例如,美国著名大学麻省理工学院的电气工程与计算机科学开放式核心课程算法导论就将这两本书列为推荐读物。这两本书覆盖了大学算法课程和数据结构课程的大部分内容,但是与普通教材的侧重点又不一样,不强调单纯从数学上来进行分析的技巧,而是强调结合实际问题来进行分析、应用和实现的技巧,因此可作为大学计算机专业的算法、数据结构、软件工程等课程的教师参考用书和优秀课外读物。书中有许多真实的历史案例和许多极好的练习题以及部分练习题的提示与解答,非常适合自学。正如作者所建议的那样,阅读这两本书时,读者需要备有纸和笔,最好还有一台计算机在手边,边读边想、边想边做,这样才能将阅读这两本书的收益最大化。
人民邮电出版社引进版权,同时翻译出版了《编程珠玑(第2版)》和《编程珠玑II》,使这两个中译本珠联璧合,相信这不仅能极大地满足广大程序员读者的需求,还有助于提高国内相关课程的授课质量和学生的学习兴趣。
本书主要由黄倩和钱丽艳翻译,刘田审校,翻译过程中得到了张怀勇先生的帮助,在此表示感谢。由于本书内容深刻,语言精妙,而译者的水平和时间都比较有限,错误和不当之处在所难免,敬请广大读者批评指正。...
前言
关于本书
本书描述了计算机编程更具魅力的一面:在可靠的工程之外,在洞察力和创造力范围内结晶而出的编程珠玑。正如自然界中的珍珠来自于磨砺牡蛎的细沙一样,这些编程珠玑来自于磨砺程序员的实际问题。书中的程序都很有趣,传授了重要的编程技巧和基本的设计原理。
本书大部分内容最初发表在《ACM通讯》中我主持的“编程珠玑”专栏。这些内容经过汇总和修订,在1986年结集出版,成为了本书的第1版。第1版的13篇文章中,有12篇都在本版中做了大幅修订;此外,本版还补充了3篇新的内容。
阅读本书所需的唯一背景知识就是某种高级语言的编程经验。书中偶尔会出现一些高级技术(如C++中的模板等),对此不熟悉的读者可以跳过这些内容,基本上不影响阅读。
本书每一章都独立成篇,各章之间却又有着逻辑分组。第1章至第5章构成本书的第一部分,这部分回顾了编程的基本原理:问题定义、算法、数据结构以及程序验证和测试。第二部分围绕效率这个主题展开。效率问题有时本身很重要,又永远都是进入有趣编程问题的绝佳跳板。第三部分用这些技术来解决排序、搜索和字符串等重要问题。
阅读本书的一个提示:不要读得太快。要仔细阅读,一次读一章。要尝试解答书中提出的问题——有些问题需要集中精力思考一两个小时才会变得容易。然后,要努力解答每章末尾的习题:当读者写下答案时,从本书学到的大部分知识就会跃然纸上。如有可能,要先与朋友和同事讨论一下自己的思路,再去查阅本书末尾的提示和答案。每章末尾的“深入阅读”并不算是学术意义上的参考文献表,而是我推荐的一些好书,这些书是我个人藏书的重要部分。
本书是为程序员而写的。我希望书中的习题、提示、答案和深入阅读对每个人都有用。本书已用作算法、程序验证和软件工程等课程的教材。附录A中的算法分类可供实际编程人员参考,该附录同时还说明了如何在算法和数据结构课程中使用本书。
代码
本书第1版中的伪代码程序其实都已实现,但当时未公开。在本版中,我重写了所有的老程序,并且编写了差不多等量的新代码。这些程序可以在http://netlib.bell-labs.com/cm/cs/pearls/下载。代码中包含许多对函数进行测试、调试和计时的脚手架程序。该网站还提供了其他相关的材料。由于现在许多的软件都能在线获得,因此本版的一个新增内容就是:如何评估和使用软件组件。
本书的程序采用了简洁的代码风格:短变量名,很少空行,很少或没有错误检测。这种风格不适用于大型软件项目,却有助于表达算法的核心思想。第5章第1个习题的答案给出了这种风格的更多细节。
本书包含几个实际的C和C++程序,其余大多数函数都用伪代码来表示,这样既节省了空间,又避免了繁琐的语法。记号for i = [0, n]表示在从0至n?1的范围内对i进行迭代。在这类 for 循环中,左圆括号和右圆括号代表开区间(不包括端点值),而左方括号和右方括号代表闭区间(包括端点值)。表达式function(i, j)仍表示用参数i和j调用函数,而array[i, j]仍表示访问数组元素。
本版所提供的许多程序的运行时间都基于“我的计算机”——一台128 MB内存、运行Windows NT 4.0操作系统的400 MHz Pentium II。我测试了这些程序在其他几台机器上的运行时间,书中记录了我观察到的一些显著的差异。所有的实验都使用了最高级别的编译器优化。建议读者在自己的计算机上对这些程序计时,我敢打赌读者将会发现相似比率的运行时间。
致第1版的读者
我希望你们在翻阅本版时的第一感觉是“看起来很眼熟啊”,而过几分钟又得出结论“以前从来没读过”。
本版与第1版主题相同,但涉及的范围更广。计算技术已经在数据库、网络和用户界面等重要领域取得了长足的进展。大多数程序员应当都熟悉这些技术。但是,这些领域的中心仍然是那些核心编程问题,这些问题还是本书的主题。相对于第1版而言,本版可以比喻为一条稍微长大了的鱼,游进了一个大得多的池塘。..
第1版第4章关于实现二分搜索的一节内容经过扩充成为了本版中关于测试、调试和计时的第5章。第1版第11章经过扩充,在本版中分成了第12章(还讨论原来的问题)和第13章(讨论集合表示)。第1版第13章描述的在64 KB地址空间运行的拼写检查器已被删除,但其要点仍保留在13.8节中。新增的第15章讨论字符串问题。本版在第1版的各章中插入了许多新节,同时删除了一些旧节。新增的习题、答案以及4个附录使得本版篇幅比第1版增加了25%。
本版保留了许多原有的实例研究,因为它们具有历史价值。有些老故事则用现代术语做了改写。
第1版的致谢
对许多人给予我的诸多帮助,我一直心存感激。Peter Denning和Stuart Lynn最早设想在《ACM通讯》上开设专栏。Peter在计算机学会(ACM)内做了大量的工作,促成了该专栏,并动员我来主持这个专栏。ACM总部员工(特别是Roz Steier和Nancy Adriance)在本书各篇文章最初发表时给予大力协助。我要特别感谢ACM鼓励我以目前这种经过修订的形式来出版各篇文章;还要特别感谢《ACM通讯》的众多读者,他们对原始各篇文章的评论使得这个扩充版本成为必要的和可能的。
媒体评论
——Steve McConnell,软件工程大师,IEEE Software前主编,《代码大全》作者
“对每一位遇到的程序员,我都会毫不迟疑地建议他阅读并不断重读这部经典之作。”...
——Slashdot
书摘
第1章开篇
1.2准确的问题描述
对程序员来说,这些需求加起来就是:“如何给磁盘文件排序?”在试图解决这个问题之前,先将已知条件组织成一种更客观、更易用的形式。
输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多
几分钟,运行时间为10秒就不需要进一步优化了。
请花上一分钟思考一下该问题的规范说明。现在你打算给程序员什么样的建议呢?
1.3程序设计
显而易见的方法是以一般的基于磁盘的归并排序程序为起点,但是要对其进行调整,因为我们是对整数进行排序。这样就可以将原来的200行程序减少为几十行,同时也使得程序运行得更快,但是完成程序并使之运行可能仍然需要几天的时间。
另一种解决方案更多地利用了该排序问题的特殊性。如果每个号码都使用7个字节来存储,那么在可用的1MB存储空间里大约可以存143 000个号码。如果每个号码都使用32位整数来表示的话,在1MB存储空间里就可以存储250000个号码。因此,可以使用遍历输入文件40趟的程序
来完成排序。在第一趟遍历中,将0至249999之间的任何整数都读入内存,并对这(最多)250000个整数进行排序,然后写到输出文件中。第二趟遍历排序250000至499999之间的整数,依此类推,到第40趟遍历的时候对9750000至9999999之问的整数进行排序。对内存中的排序来说,快速排序会相当高效,而且仅仅需要20行代码。于是,整个程序就可以通过一两页纸的代码实现。该程序拥有所期望的特性——不必考虑使用中间磁盘文件;不幸的是,为此所付出的代价是要读取输入文件40次。
1.5原理
那个程序员打电话把他的问题告诉我,然后我们花了大约一刻钟时问明确了问题所在,并找到了位图解决方案。他花了几个小时来实现这个几十行代码的程序。该程序远远优于我们在电话刚开始时所担心的需要花费一周时间编写的几百行代码的那个程序。而且程序执行得很快:磁盘上的归并排序可能需要许多分钟的时间,该程序所需的时间只比读取输入和写入输出所需的时间多一点点——大约10秒钟。答案3包含了对完成该任务的几种不同程序的计时细节。
从这些事实中可以总结出该实例研究所得到的第一个结论:对小问题的仔细分析有时可以得到明显的实际益处。在该实例中,几分钟的仔细研究可以大幅削减代码的长度、程序员时间和程序运行时间。Chuck Yeager将军(第一个超音速飞行的人)赞扬一架飞机的机械系统时用的词是“结构简单、部件很少、易于维护、非常坚固”,该程序拥有同样的属性。然而,当规范说明的某些因素发生改变时,该程序的特殊结构将很难修改。除了需要精巧的编程以外,该实例阐明了如下一般原理。
正确的问题。明确问题,这场战役就成功了90%——我很庆幸程序员没有满足于我给出的第一个程序。一旦正确理解了问题,习题10、习题11和习题12的答案都会很优雅。在查看提示和答案以前,请努力思考这些问题。
位图数据结构。该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的作为一个表项更复杂的表格的索引,见习题6和习题8。
多趟算法。这些算法多趟读入其输入数据,每次完成一步。在1.3节已经见到了一个40趟算法,习题5鼓励读者去完成一个两趟算法。
时间一空间折中与双赢。编程文献和理论中充斥着时间一空间的折中:通过使用更多的时间,可以减少程序所需的空间。例如,答案5中的两趟算法让程序运行时间加倍从而使空间减半。但我的经验常常是这样的:减少程序的空间需求也会减少其运行时间。空间上高效的位图结构显著地减少了排序的运行时问。空间需求的减少之所以会导致运行时间的减少,有两个原因:需要处理的数据变少了,意味着处理这些数据所需的时间也变少了;同时将这些数据保存在内存中而不是磁盘上,进一步避免了磁盘访问的时间。当然了,只有在原始的设计远非最佳方案时,才有可能时空双赢。