第一章
清晰的定义问题很重要,除了问题本身,还包括限制条件,可用的资源。把问题定义清楚,解决问题就成功了一半.
第二章
找到合适的算法,算法很重要,很难说哪种方法是最佳方法,方法有很多种,在尽快实现与优雅的实现上找到平衡。设计算法的本质在于找到问题的规律,针对越深层次的规律,越能设计出简单的算法。
二分搜索算法很强大,很多貌似和二分查找没什么关系的地方,其实可以用二分法。
很简单的问题,也包含丰富的算法,有些巧妙的算法需要灵感激发。
hash也是一种排序,按照元素的某种标识的排序。hash的思想应用的实在很广。
第三章
数据的设计决定了程序的设计,识别一段处理中,哪些是数据,哪些是逻辑,将数据和逻辑分离,让代码只完成逻辑,针对所设计 的数据表示的逻辑。所以,数据的表示设计的好,可以让代码的逻辑更简单。这一点很关键,数据的设计决定了程序的机构。
识别数据与逻辑的一条很常用的规律是,你不必为你面对的情况设计一种"专用"的处理程序,不如设计一种"通用"的处理程序,再令数据等于你面对的数据,自然就可以解决你现在的问题。一个很简单的例子是,计算个人所得税的程序,将各种起征点和税率设计成合适的数据结构,然后写少数几行代码来计算他们,而不是写出一堆的针对各种起征点和税率的IF ELSE分支。
逻辑和数据的耦合带来的一个问题就是臃肿的代码,无尽的维护。
第四章
编写正确的程序,没什么好说的,看编程基本功了。
一段程序,编写时总是假定了内在的不变的条件作为前提,我们认定其总是成立的,当某个时候,程序运行时,前提条件其实已经不成立了,那么,程序的正确性就被破坏了。一个典型的例子就是边界值问题,边界值往往容易破坏我们程序中的假定条件,使程序不是那么正确了。我写代码喜欢加一些断言,可以捕获一些写代码时没有考虑到得出错情形,也可以帮助别人理解程序的思路。
针对循环逻辑,考虑其正确性的时候,需要考虑,1. 初始化时前提条件是否是真,2. 循环过程中,是否能保持前提条件为真,3. 循环可以终止。
第五章
代码调试。
第六章
基于性能考虑的设计。从以下层面考虑软件的性能:
1. 系统结构
2. 算法与数据结构
3. 代码调优(微观层面)
优先级递减
第七章
性能估算。对问题的快速估计。
Little定律: 系统中物体的平均数量等于物体离开系统的平均速率和物体在系统中停留的平均时间的乘积。Little定律可以对生活中的一些问题做出估计,也可以用于软件设计,比如,消息队列该设多长,缓冲区改设置多大,等等。
第八章
算法设计技术。设计高效率的算法,有赖于算法技术的积累。
分治算法:将问题在规模上分解成几个部分,每个部分仍然具有原问题的规律和解决办法,将问题已对数级数减小到可以直接求解的最小规模,实质上任然是一种递归思想。分治的方法本身也有好坏,实例中的两个分治算法,一个将问题划分为三部分求解,一个将问题划分成两部分求解,得到的O级数不一样。
设计较高效率的算法一般从几个方面考虑:
1. 是否可以保存一些计算结果,来减少计算次数,有时候需要使用额外的存储空间,有时候需要一些预处理。有时候一些巧妙的方法本身可以避免重复计算。
2. 分治的思想,递归的思想
第九章
微观上对代码进行调优,有些走火入魔。
觉得比较有用的一条调优方法是“合并测试条件”,特别是在循环中。
代码调优优先针对性能热点进行。尽量少用代码级别的调优。