关于本书

关于本书

本书易于理解,没有大跨度的思维跳跃,每次引入新概念时,都立即进行诠释,或者指出将在什么地方进行诠释。核心概念都通过练习和反复诠释进行强化,以便你检验假设,跟上步伐。

书中使用示例来帮助理解。我的目标是让你轻松地理解这些概念,而不是让正文充斥各种符号。我还认为,如果能够回忆起熟悉的情形,学习效果将达到最佳,而示例有助于唤醒记忆。因此,如果你要记住数组和链表(第2章)之间的差别,只要想想在电影院找座位就坐的情形。另外,不怕你说我啰嗦,我是视觉型学习者,因此本书包含大量的图示。

本书内容是精挑细选的。没必要在一本书中介绍所有的排序算法,不然还要维基百科和可汗学院做什么。书中介绍的所有算法都非常实用,对我从事的软件工程师的工作大有帮助,还可为阅读更复杂的主题打下坚实的基础。祝你阅读愉快!

路线图

本书前三章将帮助你打好基础。

  • 第1章:你将学习第一种实用算法——二分查找;还将学习使用大O表示法分析算法的速度。本书从始至终都将使用大O表示法来分析算法的速度。

  • 第2章:你将学习两种基本的数据结构——数组和链表。这两种数据结构贯穿本书,它们还被用来创建更高级的数据结构,如第5章介绍的散列表。

  • 第3章:你将学习递归,一种被众多算法(如第4章介绍的快速排序)采用的实用技巧。

根据我的经验,大O表示法和递归对初学者来说颇具挑战性,因此介绍这些内容时我放慢了脚步,花费的篇幅也较长。

余下的篇幅将介绍应用广泛的算法。

  • 问题解决技巧:将在第4、8和9章介绍。遇到问题时,如果不确定该如何高效地解决,可尝试分而治之(第4章)或动态规划(第9章);如果认识到根本就没有高效的解决方案,可转而使用贪婪算法(第8章)来得到近似答案。

  • 散列表:将在第5章介绍。散列表是一种很有用的数据结构,由键值对组成,如人名和电子邮件地址或者用户名和密码。散列表的用途之大,再怎么强调都不过分。每当我需要解决问题时,首先想到的两种方法是:可以使用散列表吗?可以使用图来建立模型吗?

  • 图算法:将在第6、7章介绍。图是一种模拟网络的方法,这种网络包括人际关系网、公路网、神经元网络或者任何一组连接。广度优先搜索(第6章)和狄克斯特拉算法(第7章)计算网络中两点之间的最短距离,可用来计算两人之间的分隔度或前往目的地的最短路径。

  • K最近邻算法(KNN):将在第10章介绍。这是一种简单的机器学习算法,可用于创建推荐系统、OCR引擎、预测股价或其他值(如“我们认为Adit会给这部电影打4星”)的系统,以及对物件进行分类(如“这个字母是Q”)。

  • 接下来如何做:第11章概述了适合你进一步学习的10种算法。

如何阅读本书

本书的内容和排列顺序都经过了细心编排。如果你对某个主题感兴趣,直接跳到那里阅读即可;否则就按顺序逐章阅读吧,因为它们都以之前介绍的内容为基础。

强烈建议你动手执行示例代码,这部分的重要性再怎么强调都不过分。可以原封不动地输入代码,也可从www.manning.com/books/grokking-algorithmshttps://github.com/egonschiele/grokking_algorithms下载,再执行它们。这样,你记住的内容将多得多。

另外,建议你完成书中的练习。这些练习都很短,通常只需一两分钟就能完成,但有些可能需要5~10分钟。这些练习有助于检查你的思路,以免偏离正道太远。

读者对象

本书适合任何具备编程基础并想理解算法的人阅读。你可能面临一个编程问题,需要找一种算法来实现解决方案,抑或你想知道哪些算法比较有用。下面列出了可能从本书获得很多帮助的部分读者。

  • 业余程序员

  • 编程培训班学员

  • 需要重温算法的计算机专业毕业生

  • 对编程感兴趣的物理或数学等专业毕业生

代码约定和下载

本书所有的示例代码都是使用Python 2.7编写的。书中在列出代码时使用了等宽字体。有些代码还进行了标注,旨在突出重要的概念。

本书的示例代码可从出版社网站下载,也可从https://github.com/egonschiele/grokking_algorithms下载。

我认为,如果能享受学习过程,就能获得最好的学习效果。请尽情地享受学习过程,动手运行示例代码吧!

作者在线

购买英文版的读者可免费访问Manning出版社管理的专用网络论坛,并可以评论本书、提出技术性问题以及获得作者和其他读者的帮助。若要访问并订阅该论坛,可在浏览器的地址栏中输入www.manning.com/books/grokking-algorithms。这个网页会告诉你注册后如何进入论坛、可获得哪些帮助以及讨论时应遵守的规则。

Manning出版社致力于为读者和作者提供能够深入交流的场所。然而,作者参与论坛讨论纯属自愿,没有任何报酬,因此Manning出版社对其参与讨论的程度不做任何承诺。建议你向作者提些有挑战性的问题,以免他失去参与讨论的兴趣!只要本书还在销售,你就能通过出版社的网站访问作者在线论坛以及存档的讨论内容。

目录

  • 版权声明
  • 献词
  • 前言
  • 致谢
  • 关于本书
  • 第 1 章 算法简介
  • 第 2 章 选择排序
  • 第 3 章 递归
  • 第 4 章 快速排序
  • 第 5 章 散列表
  • 第 6 章 广度优先搜索
  • 第 7 章 狄克斯特拉算法
  • 第 8 章 贪婪算法
  • 第 9 章 动态规划
  • 第 10 章 K最近邻算法
  • 第 11 章 接下来如何做
  • 练习答案