这是从图灵 2016 年发的一篇文章修改而来的标题,原先这篇文章的标题叫《如果你只能拥有一本算法书》。没错,这次,我们就不遮遮掩掩了,引用了一位大学教授的书评标题「 Best algorithms textbook by far」。从市场和读者的反馈看,这也不是虚假宣传。这篇文章的内核是一篇书评,我们依然保留,送给 2016 年还没来得及认识图灵的小伙伴,以及还在犹豫选择哪本算法参考书的小伙伴。
如果关注算法图书,你可能已经猜到我们这本书的主角了,是:《算法(第 4 版)》。
完全不夸张,《算法(第 4 版)》是目前市面上口碑、销量、学习友好度综合排名第一位的算法图书。
《算法(第4版)》豆瓣中文版评分 9.4,Amazon 英文版评分 4.6,图灵同时引入出版了中英文版,一直超级受欢迎。最近两年,其受欢迎程度快速稳步上涨。
当然,一本书无论别人怎么说它好,具体到你,总要去研究它是否真的适合自己的阅读习惯和阅读品味。那么,这本书好在哪里?你是否需要呢?
以下是 Amazon 高票支持的《算法(第4版)》书评,也是相对客观的书评。我们来看看这位大学教授是如何评价这本书的。
最后,我们也在「阅读原文」给出了图灵算法书单,欢迎小伙伴挑到适合自己的算法书,攻克算法难题。
作者:Kevin P. Murphy (不列颠哥伦比亚大学计算机系教授)Robert Sedgewick 和 Kevin Wayne的《算法》(第4版,由 Addison-Wesley 于 2011 年 3 月出版)是我读过的最棒的计算机科学方面的书籍之一。它应该是所有程序员以及计算机科学专业的学生的必读书籍——它的目标是覆盖“每个程序员都应该了解的 50 个算法”。下面我就来说说为什么我觉得这本书是如此优秀。《算法》包含了具体的源代码(基于一个 Java 的子集),这和它的主要对手——由 Cormen、Leiserson、Rivest 和 Stein (CLRS)完成的《算法导论》(An introduction to algorithms)——非常不同。这一点非常重要,因为它意味着学生们可以使用这些代码去解决许多真实的问题。这些算法产生了从网络搜索到基因组学的许多有趣和令人激动的应用,这些应用也贯穿了全书(这本书的网站上提供了所有的源代码和数据)。对真实代码的一种很自然的担心是它们可能会影响对概念的理解。但在这本书中,作者通过精心定义的抽象数据类型(队列、背包、哈希表、树、有向无环图等类)赏心悦目的创造了许多既有可读性又非常准确的实现。使用真实代码的另一个好处是迫使你解决一些容易被忽略却十分重要的实现细节。例如,大家都知道并归排序需要辅助性内存空间。在 CLRS 的伪代码中,作者在他们的并归函数内部分配的临时存储空间。但在实践中,仅分配一次临时存储空间并将它作为一个指针传递给并归函数(或是将它作为并归排序类的一个私有成员)将会高效得多。这种重要的技巧你又可以从哪里学到呢?除了代码的展示之外,本书也用清晰的语言解释了这些方法。本书非常与众不同的一点就是包含许多详细的例子来说明这些算法在处理真实数据时的行为和表现。(除非你真的实现了这些算法,否则是很难得到这些数据的!)这本书的另一个优点是它严格遵守了软件工程的最佳实践:先写 API,再写单元测试或是实现一个使用该数据结构或算法的应用(用例),最后才考虑应该如何实现这个 API。另外,本书在许多时候还讨论了同一 API 的多种实现,它们在简洁性、速度和内存使用上的折中都各有不同。对于数据结构,使用“类”是很自然的,但对于算法作者也采用了这种描述方式,特别是图算法。这使得算法能够进行预处理并保存一些内部状态,然后再为使用者提供服务。这种方式比传统的无状态的函数式的算法更加通用。这本书的每一节都有大量的练习,分为“简单”、“提高”和“实验”三种,它的网站提供了部分练习的解答。除了理论之外,本书还含有许多经验性的算法题目,这也是特色。它展示了算法的不同实现对于不同规模问题的实际运行时间,并用这些数据作为传统理论分析的补充。相比 CLRS,这本书的一个小优点是没有那么厚(约 1000 页,而 CLRS 有1300 页)。显然,《算法》和 CLRS 的内容有许多重叠。从书的目录来看这一点并不明显,因此我写了一份更加详细的列表来列出这本书讨论的所有问题。全书的组织非常好,前面介绍过的内容(和代码)会在后面得到多次应用(例如:堆 -> 优先队列 -> 最小生成树的 Prim 算法)。书中的话题也会越来越高级。因此读者最好一页一页的按顺序阅读本书。下面是我制作的一份书中的话题总结,这些话题从目录上看起来并不明显。
-- 大O记法(“线性对数”的意思是O(NlogN))-- 应用:动态连通性(p、q是否是在同一个集合中?)-- 使用优先队列解决得到一列数中最大的N个数的问题-- 各种排序算法的比较(速度、稳定性、原地性、额外空间的使用)-- 符号表与有序符号表(键可以被比较,因此可以得到最大和最小键)-- 二分查找树的性质(父节点比左子节点大,比右子节点小)-- get和put方法的实现,以及对其所需时间为O(logN)的分析-- 加权有环有向图中的最短路径(Bellman-Ford算法与负权重边的检测)-- 适用于带有重复前缀字符串的三向字符串快速排序-- longestPrefixOf方法(最长公共前缀)-- 使用非确定性有限状态自动机判定字符串是否在特定的语言中-- 最大流量问题和最短路径问题向线性规划问题的归约
作者:Kevin Wayne,Robert Sedgewick
译者:谢路云
定价:99.00元 / 英文版129.00元
本书作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。第 4 版具体给出了每位程序员应知应会的 50 个算法,提供了实际代码,而且这些 Java 代码实现采用了模块化的编程风格,读者可以方便地加以改造。本书配套网站提供了书中内容的摘要及更多的代码实现、测试数据、练习、教学课件等资源。
关注数:10亿+ 文章数:10亿+
粉丝量:10亿+ 点击量:10亿+
悬赏博主专区请扫描这里
喜爱数: 1亿+ 发帖数: 1亿+
回帖数: 1亿+ 结贴率: 99.9%
—————END—————
喜欢本文的朋友,欢迎关注公众号 程序员哆啦A梦,收看更多精彩内容
如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~