编程珠玑摘录
2013-10-10 20:13
211 查看
第1章 开篇
1)问题提出:为什么使用磁盘排序,怎样进行磁盘排序,去研究算法2)仔细分析问题,可使得代码长度、编程时间和运行时间减少一个数量级。
3)恰当的问题描述占成功的90%
4)法国作家和航空器设计师Antoinede saint-Exupery 说:“设计师的至高境界不是他不能再往作品中添加什么东西,而是他不能再从中取走什么东西”。
第2章 算法
1)研究算法对正在工作的程序员来说很有用,只有经过广泛的研究之后才能对算法具备那种出神入化的理解力。任何愿意在编码前、编码期间以及编码后认真思考的程序员都可具备这种能力。2)优秀程序员:舒适地靠背坐着,等待灵感出现,而不急于将自己的第一思想转化成编码。
第3章 数据结构程序
1)不要匆忙将第一灵感编写成程序;2)将数据从控件中分离开来;
3)可以用小程序,就不要用大程序(数据结构的贡献:将大程序缩短为小程序);
思考时需要考虑的几个原则:
@将重复性代码写到数组中(应该是函数中);
@封装复杂的结构;
@尽可能使用高级工具;
@使用数据结构构造程序。
第4章 编写正确的程序
1)问题定义、算法设计和数据结构选择是良好编程的先决条件;2)边实现边测试,注意细节层面;
3)使用断言测试;
4)保持代码的简单性是正确性的关键;
第5章 编程中的次要问题
1)编码,高难度的函数来说,最简答的方法就是先用便利的高级伪代码描绘骨架,然后将之转换成实现语言;
2)测试,可以用脚手架测试组件;
第二部分 性能
第6章 性能透视
1)性能优化
(1)算法和数据结构。找一个高效的算法和合适的数据结构;
(2)算法优化;
(3)数据结构重组;
(4)代码优化;
(5)硬件。
2)少许加速:研究最好的层次。
大的加速:深入研究多重层次。
第7章 封底计算
封底计算规则:总成本是单位成本乘以个数。
Peter Denning定义法则为:队列中的平均物体数量是进入率和平均滞留时间之乘积。
爱因斯坦:任何事都应该做到尽可能的简单,除非没有更简单的了。
第8章 算法设计技术
1)重要的算法设计技术
(1)保存状态,避免重新计算;
(2)将信息预处理到数据结构中;
(3)分治算法;
(4)扫描算法;
(5)累积;
(6)下限。
第9章 代码优化
1)代码优化方法
举例:van Wyk 优化3000行代码的图形程序
(1)绘制程序轮廓,确定每个函数需要花费的时间,研究结果得出几乎70%的运行时间都花在内存分配函数malloc上;
(2)研究内存分配程序;应用缓存原理解决频繁的数据访问,将最常用类型的空闲记录捕获在一个链表中;
2)代码优化方法
(1)使用数据结构优化
(2)改变数据表示方法进行优化,例如用数组来存储坐标
3)代码优化原则
(1)尽量少用代码优化;
(2)效率;
(3)度量;
(4)设计层次。
4)常见优化:
(1)整数求余,使用便宜的比较运算符替换成本较高的求余运算符;
(2)函数、宏以及内联代码,通过使用宏来替换函数实现压缩过程层次机构,可以加速两倍,将代码写成内联的形式可同样加速;
(3)顺序查找,使用标记值进行测试合并可以获得约5%的加速。循环展开可以得到大学56%的额外加速;
(4)计算球面距离,将经度、纬度和笛卡尔坐标保存在一起是扩展数据结构的例子,使用简单的欧几里得距离而不是角度距离可以利用代数恒等式。
第10章 压缩空间
1)选用合适的数据结构,大程序换成小程序有利于节约内存;
2)什么事稀疏矩阵?
3)空间中的“热点”,代码中的少量部分经常要占用大部分的运行时间。
4)权衡,有时必须权衡放弃性能、功能性或可维护性以获得内存。
第3部分 产品
第11章 排序
1)任何基于比较的排序最少必须使用O(nlogn)次比较。因此快速排序几近最优。
2)C库qsort非常简单并且相对比较快,比手写的快速排序慢仅仅是因为它的通用而且灵活的接口使用函数调用进行每个比较。
3)C++库sort具有最简单的接口:通过调用sort(x,x+n)排序数组x;也具有很好的执行效率。
第12章 抽样问题
1)通过询问如何才能通过不同的方式解决问题往往会使你能够学到更多的东西。
2)设计空间,“很多程序员,往往宁愿使用一分钟思考,一天编码,也不愿思考一小时,编码一小时”
3)实现解决办法,通过研究设计空间就能够发现某个程序比其他的要好;有时则可从几个解决办法中选择最好的。
第13章 查找
1)使用带有虚函数的抽象类指定接口,再将每个实现写成派生类。
2)事先不知道集合的大小,链表将是表示集合的首选,链表消除了插入时元素移动的成本;
3)编程中用到的基本原理:
(1)库的作用,C++模板库提供了很容易实现、维护及扩展的通用解决办法;
(2)空间的重要性,根据内存选择合适的数据结构;
(3)代码优化技巧,通过单独分配一个大块来替换通用内存分配,
第14章 堆
1)可用堆数据结构解决两个重要问题:排序和优先队列
(1)通过堆排序n个元素的数组所需要的时间不会超过O(nlogn),并且只需要使用几个字的额外空间;
(2)堆通过在集合中插入新元素或从集合中提取最小的元素来维护元素集合;
2)原则:
(1)效率,形状属性保证了对中的所有结点和根之间的距离在log2n层之间;
(2)正确性,为循环编写代码首先必须精确说出它的不变式;
(3)抽象,好的工程师能够区分出某个组件完成什么功能以及它是如何完成这个功能的。
(4)过程抽象,可以在不知道排序函数实现细节情况下,通过它来排序一个数组:即将排序视为单个操作。
(5)抽象数据类型,数据类型完成什么功能由它的方法和它们的规范决定的,而如何实现这些功能则是由它们的实现决定的。
第15章 珍珠字符串
1)查找重复字符串,使用数据解耦股“后缀数组”,后缀数组使用文本本身和n个附加指针来表示输入文本中的n个字符的每个子字符串。
2)原则:
(1)字符串问题,
(2)字符串的数据结构,表示字符串的重要数据结构(后缀数组)
(3)散列,总体来说,这个结构较快且容易实现;
(4)平衡树。保证即便在输入很少的时候也恩呢该有较好的性能,并已打包在C++标准模板库的set和map中;
(5)后缀数组,初始化文本中指向每个字符的指针数组,将它排序,这样就得到一耳光后缀数组。
3)注意:C++的set、map和string使用起来都比较方便,但是他们的通用而强大的接口意味着他们没有专用的散列函数效率高。
其它库组件效率很高:散列使用strcmp,后缀使用qsort.
相关文章推荐
- 有多个文件的程序,c++的心得!
- 文件I/O编程
- 文件I/O编程
- C/c++输入输出函数
- 【第三章】c++里面的标准库类型
- hdu—1004巨坑爹,以后编译用G++而不用C++
- 编程名言名句
- 模块删除页代码
- Liquibase+spring
- java中package打包之后使用javac编译的格式
- Forward declarations(声明),c++声明的一些问题!
- c语言变量声明位置,逗号问题
- 深入分析 Java 中的中文编码问题
- C语言运算符优先级和口诀
- 空格和基本格式,c++里面的一些知识!
- [VBA]批注记录修改前内容
- eclipse导入jar包的方法
- python 中BeautifulSoup入门
- 从C++对象内存布局和构造过程来具体分析C++中的封装、继承、多态
- JAVA多线程(3)——如何加锁