编程珠玑 笔记

garrulousabyss 2019-11-28

编程珠玑 笔记

《编程珠玑》这本书无需多说,他的价值不在于这里摘录的只言片语,而在于阅读过程中思维上的学习,在解答习题时思维上的锻炼过程。

第一部分 基础

第一章 开篇

准确的问题描述:输入、输出、约束。在尝试解决问题之前,先将已知条件组织成一种更客观、更易用的形式。

确定用户的真实需求是程序设计的根本。

对小问题的仔细分析有时可以得到明显的实际益处。

简单的设计。法国作家兼飞机设计师 Antoine de Saint-Exupery:设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。

第二章 啊哈!算法

Martin Gardner:看起来很困难的问题也可以有一个简单的、意想不到的答案。

优秀程序员都有点懒:他们坐下来等待灵机一动的出现而不急于使用最开始的想法编程。当然,这必须通过在适当时候开始写代码来加以平衡。真正的技能就在于对这个适当时候的把握,这只能来源于解决问题和反思答案说获得的经验。

第三章 数据决定程序结构

恰当的数据视图实际上决定了程序的结构。

将数据从控制结构中分离会获得许多好处。

能用小程序实现的,就不要编写大程序。

发明家悖论:更一般性的问题也许更容易解决。

程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效。(数据的)表示形式上程序设计的根本。

退回起点进行思考时的几条原则:

  • 使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构–数组来更好地表述。
  • 封装复杂结构。
  • 尽可能使用高级工具。
  • 从数据得出程序的结构。通过使用恰当的数据结构来替代复杂的代码,从数据可以得出程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。

第四章 编写正确的程序

编程技巧仅仅是编写正确程序的很小一部分,大部分内容还是前面三章讨论过的主题:问题定义、算法设计以及数据结构选择。

程序验证的一个好处是就是为程序员提供一种语言,用来表达他们对程序的理解。

调试过程中,需要同时修正错误代码和错误的断言:总是保持对代码的正确理解,不要理会那种“只要能让程序工作,怎么改都行”的催促。

编写简单代码通常是得到正确程序的关键。

第五章 编程小事

脚手架:

第二部分 性能

第六章 程序性能分析

问题定义:问题定义和程序效率之间具有复杂的相互影响。

系统结构:将大型系统分解成模块,也许是决定其性能的最重要的单个因素。

算法和数据结构:获得快速模块的关键通常是表示数据的结构和操作这些数据的算法。

代码调优:

系统软件:有时改变系统所基于的软件比改变系统本身更容易。

硬件:

简单设计的重要性怎么强调都不过分。

当程序性能无法回避时,考虑设计层面会有助于程序员集中精力解决问题。

如果仅需要较小的加速,就对效果最佳的层面做改进。

如果仅需要较大的加速,就对多个层面做改进。

第八章 算法设计技术

本章探讨的问题:

  • 保存状态,避免重复计算。
  • 将信息预处理至数据结构。
  • 分治算法。
  • 扫描算法。
  • 累积。
  • 下界。

第九章 代码调优

“代码调优”首先确定程序中开销较大的部分,然后进行少量修改,以提高其运行速度。

代码调优最重要原理就是尽量少用它。

第十章 节省空间

关键在于简单。

简单性可以衍生出功能性、健壮性以及速度和空间,还可以减少代码长度。

数据空间技术

  • 不存储,重新计算。
  • 稀疏数据结构。
  • 数据压缩。
  • 分配错略。有时空间的使用方式比使用量更重要。
  • 垃圾回收。对废弃的存储空间进行回收再利用。

代码空间技术

  • 函数定义。通过用函数替换代码中的常见模式可以简化上述程序,相应地也就减少了它的空间需求,并增加了清晰性。
  • 解释程序。
  • 翻译成机器语言。

第二部分 应用

第十二章 取样问题

编程过程中的几个重要步骤:

  • 正确理解所遇到的问题。
  • 提炼出抽象问题。
  • 考虑尽可能多的解法。
  • 实现一种解决方案。
  • 回顾。

相关推荐