《编程珠玑》是一本很好的,经典的程序设计书。这两天开始读,有种“相见恨晚“的感觉。书中通过讲述作者自己的亲身体会来说明程序设计的艺术。很有感染力。
第一章
讲述了一个电话号码排序的故事。强调化蘩为简的重要性。很多问题,咋一看挺难的,如果仔细分析转化,可能会发现其实很简单。
第二章
二分搜索和排序在实际问题处理中的强大,高效的应用。
感觉二分就是分治思想的一种具体实现。分治思想,把问题一次缩小一些,最终求得解。速度很快。排序本身的应用很简单,重要的应用则是用排序对很多实际问题的预处理过程,有了排序,后面的处理很可能会更高效。
第三章
数据决定程序结构。
计算机程序的作用,从本质上来说,都是处理数据,更高效地处理数据。程序设计中出现的问题,很多都是一开始对数据的分析不到位,数据表示的结构设计不好造成的。
程序员在节省空间方面无计可施时,酱紫记从代码中解脱出来,退回起点并几种心力研究数据,常常能有奇效。数据的表示形式是程序设计的根本。
下面是退回起点进行思考时的几条原则:
使用数组重新编写重复代码。冗长的相似代码常常可以使用简单的数据结构--数组来更好地表达。
封装复杂结构。当需要非常复杂的数据结构时,使用抽象术语进行定义,并将操作表示为类。
尽可能使用高级工具。超文本,名字--值对,电子表格,数据库,编程语言等都是特定问题领域中的强大的工具。
从数据得出程序的结构。在编写代码之前,优秀的程序员会彻底理解输入,输出和中间数据结构,并围绕这些结构创建程序。
第四章
编写正确的程序
令人震惊的是:世界上第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的程序却直到1962年才出现。
认真编写程序,并验证。
第五章
编程小事
编码。对于比较难写的函数,最容易的方法是使用方便的高级伪代码来构建程序框架,然后将伪代码翻译成要实现的语言。
测试。在脚手架中对组件进行测试要比在打系统中更容易,更彻底地。
调试。对隔离在其脚手架中的程序进行调试是很困难的,但是若将其嵌入到真是的运行环境中,调试工作会更困难。
计时。对于运行时间非常重要的程序,应进行实验以确保程序恩个够达到我们预期的性能。
第六章
程序性能分析
如果仅需要较小的加速,就对效果更佳的层面做改进。
如果需要较大的加速,就对多个层面做改进。
第七章
粗略估算
曾经在网上看到google的面试题,问面试者一个巴士能装多少个棒球。当时以为这个东西很扯淡,后来以为这种题目是用来考智商的,今儿读了《编程珠玑》的第七章才意识到这个问题实际上是在考粗略估算,而粗略估算是在是太重要了!粗略估算的运用,可以说是一个人思维方式层面的提上。
当拿到一个问题时,特别是跟数字有密切关系的问题时。在已知常识的基础上,粗略估算一下问题的规模,往往能得到比较准确的感性认识,从而作出正确的判断。
72法则:假设以年利率r%投资一笔钱y年,如果r*y=72.那么你的投资差不多会翻倍。
Little定律:对于任意的系统,系统中的物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。
安全系数:当你不确定自己的系统在实际应用中的性能时,以2倍或者4倍或者6倍的系数降低对系统性能的评估。
第八章
算法设计技术
拿到一个问题之后,首先应想到一种可以实现的简单算法。然后进一步分析如何能使运算更具效率,空间更优。使用分治算法和动态规划(本质上就是记录以前生成的,以后还能用的数据。)等高级算法来加速。
几个重要的算法设计技术:
1,保存状态,避免重复计算。
2,将信息预处理至数据结构中。
3,分治算法。
4,扫描算法。
5,累积。注意从以前的数据中找出与现在计算的数据的关系,减少计算量。
6,下界。如果数学能力比较强,最好分析一下处理一个问题的时间空间最低下界。有助于评估自己的程序到底还能不能改进。