Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.MD

Programming Pearls(2ed) -- Jon Bentley 谢君英等译

本书为许多恼人的问题,提供了独特而巧妙的解决方案,通过一些精心设计的有趣而且颇具指导意义的程序, 为众多实用程序的设计及基础设计原则,作了清晰而机智的描述。

程序设计技巧和基本设计原则

计算机基础课程:离散数学、算法和数据结构、操作系统、计算机体系结构、编译原理
深层次掌握计算机体系结构,cpu本身,操作系统内核,系统平台,面向对象编程,程序性能

这本书一共分为3篇15章,还有5个附录,以及部分问题参考答案或提示。书的内容涵盖范围广泛,包括有算法,编程风格,调试等技术。 每章都以问题入手,阐释问题,分析问题,解决问题。

第一章 开篇

开篇是一个经典问题引入的,对磁盘数据排序。随着问题的一步步挖掘、阐释,说明了软件开发,
或者编程第一要义:精确问题的定义,搞清楚需求。编程实现前,弄清楚问题的约束等。

第二章 算法

算法讲的很抽象,模糊,不知道要说什么,可能是想说算法的重要性吧:高效算法能够优化时间和空间

第三章 数据结构程序

使用适当的数据结构去替换复杂的代码,使数据起到构造程序的效果。-- 表驱动法
数组往往可以替代复杂的逻辑,解决冗余代码,更加容易维护和扩展
数据结构的封装,隐藏信息等。

第四章 编写正确的程序

完成“问题定义”,“算法设计”,“数据结构选择”,然后编写正确的代码,自然水到渠成。
验证程序的正确性,“契约式编程”

第五章 编程中的次要问题

走查。快速找到大量显而易见的bug
脚手架,编写脚手架,最简单,最容易构建的脚手架通常是最好的,测试程序专用。
计时测试:对于算法的优化实现,一定要测试其性能是否达到预期。

第六章 性能透视

考虑设计层次,少许加速,研究最好的层次,大的加速,深入研究多重层次,获得加速的叠加。
加速优化方法:数据结构,算法,系统软件,硬件等层次的优化。

第七章 封底计算

快速估算法,“72法则”
对于自己的无知,保留安全系数
利特尔法则:房间中平均物体的数量,是进入率和平均滞留时间的乘积。

第八章 算法设计技术

1.保存状态,避免重复计算 -- 动态规划思想
2.将信息预处理到数据结构中
3.分治算法(万金油)
4.扫描算法,-- 动态规划
5.累积 -- 表记录累积和,partial_sum
6.下限 -- 证明下限,才能知道算法是否是最优的。

第九章 代码优化

确定现有程序中的开销昂贵的部分,然后做一些小的修改,提高其速度。
通过描述轮廓识别程序中的“热点”,使用缓存技术原理,减少所花时间。

通过数组末尾加上标记,减少循环中的比较次数,从而提高效率。只在循环完后,检验一次即可。arr[n] = key。
循环展开:有助于避免流水线阻塞,减少分支,增加指令级的并行。

代码优化最重要的原则:尽量少用代码优化
没有坏的话就不要修复它。

减少时间、减少缺页,增加高速缓存命中率、减少空间

第十章 压缩空间

稀疏数组(矩阵)的存储
数据空间压缩:
	1.不保存,重新计算。	跨网络运行的程序,需要保存,减少数据传输(本地缓存等)
	2.稀疏数据结构,键索引技术
	3.共享对象,使用指针,减少对象副本和临时变量
	4.数据压缩,新的编码技术,压缩算法等
	5.分配策略:动态分配,需要多少分配多少,不浪费
	6.垃圾回收,重复利用
大数组常比小链表效率性能好,因为顺序存储访问,高速缓存原理等
减少代码空间:
	1.函数定义
	2.解释器:使程序的构造和维护更加简单。
	3.转换成机器语言,汇编代码等
在尝试使用各种方法、技术之前,绝对不要因为某性能而牺牲其他性能!

第十一章 排序

插入安排排序(优化)
快速排序:平均时间复杂度O(n^2),空间复杂度O(logn),适合于随机数组,不适合相等元素太多,或者已大部分排序的数组
快速排序算法的优化。

第十二章 抽样问题

随机序列生成器(三种实现方法)
编写程序:
	1.理解问题,与用户分析交流问题
	2.利用设计空间,使用伪代码帮助分析、设计
	3.实现解决方法:简单直白的代码实现,管理复杂度
	4.回顾:检查、测试、总结等等,更加深入地理解

第十三章 查找

集合表示的数据结构:STL set、数组、链表、二分查找树、位向量、桶(数组+链表)
优化技巧:
	单独分配一大块内存(内存池、块),替换一次一次申请分配策略
	重写递归,变成迭代式函数。(特别是尾递归,非常容易展开成迭代)
	标记元素,减少比较次数、
	高速缓存原理

第十四章 堆

堆操作:上虑、下滤
优先队列、堆排序

第十五章 珍珠字符串

单词统计
字符串查找子串
后缀数组、平衡树、散列表
马尔科夫链

附录:

设计过程:
	处理正确的问题:理解清楚需求
	展示解决方法的设计空间
	查看数据:关注领域和约束
	使用封底:粗略性能分析
	利用对称性:节省空间
	使用组件进行设计:组件是设计的单位,而不是类,类集合组合成组件
	建立原型:原型模拟系统,简单容易实现,适时丢弃原型
	必要时进行权衡:设计复杂度、实现复杂度、时间复杂度、空间复杂度等
	尽量简单:越简单的代码,性能越好
	让程序尽量优美

每天都好像生活在天堂中,但是不在天堂中的日子也很美好。

data

开始时间:2016-04-17

结束时间:2016-05-04

读编程珠玑这本书,只要为了进一步提高编程能力和对算法的理解,当然了,这本书本身就是一部经典之作,值得程序员菜鸟用心学习。 也是为了找实习,找工作的面试,做准备。

今天读完这本书了,当然属于粗略阅读型的,章节内容大部分看着明白,但是整本书主题是什么,感觉有些抓不住, 既有软件开发技巧和工程指导,又有算法分析,还有数据结构的实现,还有一些经典问题的解决方案,编程技巧等, 内容包含很丰富,编程的方方面面都有。感觉还是属于软件工程一类的书吧。语言特性很少涉及,自然不属于介绍 某编程语言的教程。

这本书内容讲解非常清楚,很容易理解,但是问题部分,感觉还是比较困难,很多不会,这本书的一大亮点就是提供了 部分习题的思路分析和部分问题的答案提示。最讨厌思考题了,因为太难,然后感觉就很多,因此不喜欢花太多时间思考, 也不喜欢解决,只要还是不会解决。

看完这本书的收获,不知道有些什么收获,可能对于问题的分析能力,解决实际问题的能力有些增长吧,这些属于 隐藏的技能,所以也不易体现,这就是学习的过程吧,一点点努力,一点点的进步,厚积博发。没有看语音指导类 书籍那么直接,看了,就能明白怎么编程入门,有哪些语法规则,必须遵守等。也没有直接将算法的书籍那么干脆, 直接告诉你有什么算法,如何实现,原理是什么。但是这本书的高级之处在于,“授人以鱼不如授人以渔”,它告诉了 我们如何分析问题,如何设计算法,如何实现算法等。有了基本的方法论指导,自然会事半功倍,即使不完全正确, 也不会偏差太大。

Good luck!