编程珠玑 笔记
《编程珠玑》这本书无需多说,他的价值不在于这里摘录的只言片语,而在于阅读过程中思维上的学习,在解答习题时思维上的锻炼过程。
第一部分 基础
第一章 开篇
准确的问题描述:输入、输出、约束。在尝试解决问题之前,先将已知条件组织成一种更客观、更易用的形式。
确定用户的真实需求是程序设计的根本。
对小问题的仔细分析有时可以得到明显的实际益处。
简单的设计。法国作家兼飞机设计师 Antoine de Saint-Exupery:设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。
第二章 啊哈!算法
Martin Gardner:看起来很困难的问题也可以有一个简单的、意想不到的答案。
优秀程序员都有点懒:他们坐下来等待灵机一动的出现而不急于使用最开始的想法编程。当然,这必须通过在适当时候开始写代码来加以平衡。真正的技能就在于对这个适当时候的把握,这只能来源于解决问题和反思答案说获得的经验。
第三章 数据决定程序结构
恰当的数据视图实际上决定了程序的结构。
将数据从控制结构中分离会获得许多好处。
能用小程序实现的,就不要编写大程序。
发明家悖论:更一般性的问题也许更容易解决。
程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效。(数据的)表示形式上程序设计的根本。
退回起点进行思考时的几条原则:
- 使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构–数组来更好地表述。
- 封装复杂结构。
- 尽可能使用高级工具。
- 从数据得出程序的结构。通过使用恰当的数据结构来替代复杂的代码,从数据可以得出程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。
第四章 编写正确的程序
编程技巧仅仅是编写正确程序的很小一部分,大部分内容还是前面三章讨论过的主题:问题定义、算法设计以及数据结构选择。
程序验证的一个好处是就是为程序员提供一种语言,用来表达他们对程序的理解。
调试过程中,需要同时修正错误代码和错误的断言:总是保持对代码的正确理解,不要理会那种“只要能让程序工作,怎么改都行”的催促。
编写简单代码通常是得到正确程序的关键。
第五章 编程小事
脚手架:
第二部分 性能
第六章 程序性能分析
问题定义:问题定义和程序效率之间具有复杂的相互影响。
系统结构:将大型系统分解成模块,也许是决定其性能的最重要的单个因素。
算法和数据结构:获得快速模块的关键通常是表示数据的结构和操作这些数据的算法。
代码调优:
系统软件:有时改变系统所基于的软件比改变系统本身更容易。
硬件:
简单设计的重要性怎么强调都不过分。
当程序性能无法回避时,考虑设计层面会有助于程序员集中精力解决问题。
如果仅需要较小的加速,就对效果最佳的层面做改进。
如果仅需要较大的加速,就对多个层面做改进。
第八章 算法设计技术
本章探讨的问题:
- 保存状态,避免重复计算。
- 将信息预处理至数据结构。
- 分治算法。
- 扫描算法。
- 累积。
- 下界。
第九章 代码调优
“代码调优”首先确定程序中开销较大的部分,然后进行少量修改,以提高其运行速度。
代码调优最重要原理就是尽量少用它。
第十章 节省空间
关键在于简单。
简单性可以衍生出功能性、健壮性以及速度和空间,还可以减少代码长度。
数据空间技术
- 不存储,重新计算。
- 稀疏数据结构。
- 数据压缩。
- 分配错略。有时空间的使用方式比使用量更重要。
- 垃圾回收。对废弃的存储空间进行回收再利用。
代码空间技术
- 函数定义。通过用函数替换代码中的常见模式可以简化上述程序,相应地也就减少了它的空间需求,并增加了清晰性。
- 解释程序。
- 翻译成机器语言。
第二部分 应用
第十二章 取样问题
编程过程中的几个重要步骤:
- 正确理解所遇到的问题。
- 提炼出抽象问题。
- 考虑尽可能多的解法。
- 实现一种解决方案。
- 回顾。