算法精粹:经典计算机科学问题的Python实现
上QQ阅读APP看书,第一时间看更新

本章介绍的各种技术(递归、结果缓存、压缩和位级操作)在现代软件开发过程中是很常用的,如果没有它们,难以想象计算的世界会是什么样的,虽然没有它们也能解决问题,但用这些技术解决起来往往逻辑性更强、效率更高。

递归尤其如此,它不仅是很多算法的核心,甚至还是整个编程语言的核心。在一些函数式编程语言中,如Scheme和Haskell,递归取代了命令式语言中使用的循环。但是,递归技术可以完成的任务用迭代技术也能实现,这一点值得牢记在心。

结果缓存已成功应用于解析器(解释型语言用到的程序)的加速工作。对于解决有可能再次请求最近计算结果的问题,结果缓存就会很有用。结果缓存的另一个应用就是程序语言的运行时(runtime)。某些程序语言的运行时(如Prolog的多个版本)会把函数调用的结果自动保存下来(自动化结果缓存),这样下次发起相同调用时就不需要再执行这些函数了。这种机制类似于fib6()中的修饰符@lru_cache()。

压缩技术已经让饱受带宽限制的互联网世界变得流畅多了。对于现实世界中取值范围有限的简单数据类型,多一个字节都是浪费,于是在1.2节中检验过的位串技术就十分有用了。不过大多数压缩算法都是通过在数据集中找到某些模式或结构,从而使重复信息得以消除。它们比1.2节中介绍的方案要复杂得多。

一次性密码本对于普通的加密是不大实用的。为了重建原始数据,一次性密码本方案要求加密程序和解密程序同时拥有其中一个密钥(示例中为假数据),这很麻烦并且违背了大多数加密方案的目标(保持密钥的秘密性)。但是大家可以了解一下,“一次性密码本”这个名称来自间谍,在冷战期间,他们使用真正的密码纸和其上的假数据来创建加密通信。

上述这些技术是编程的基本构件,其他算法是构建在其上的。后续章节将会展示关于它们的大量应用。