结语:算法的那些事儿

结语:算法的那些事儿

终于,在 2019 年的第一天下午,《算法应该怎么玩》的最后一篇完成了,时间比我预想的要长(很多)。因为写一个精品课和写书是两个完全不同的体验,写精品课可以边根据读者的反馈边调整、完善内容,能和读者有一个直接的接触,了解他们的想法或遇到的问题;而写书就不同了,必须全部完稿后,经过三审三校才能出版,而这期间,万一遇到技术升级等,那么图书出版后还要考虑后面的修订版……

学习算法要达到的目的

当大家看到这篇结语时,相信已经看完了前面的内容了,希望再次回顾一下这门课所要传达的理念,那就是学习算法的目的(或意义):

  • 遇到未知的问题能设计出解决问题的算法
  • 对已知的算法原理能够设计相应的数据模型解决具体的问题

其实这里面隐含着第三个目的,就是开阔思路,在跟着我的思路解决各种类型的问题过程中,了解到设计数据模型的各种典型手法(或者说就是我本人惯用的方法和经验),以形成大家自己的方法集。之前和读者的交流中也提到过我的观点,包括我对团队内的实习生和新入职员工的观察,发现那些让人觉得“聪明伶俐”的人,都有一个共同点,那就是解决问题的方法多。

方法多的人若遇到一个问题,会用自己惯用的各种方法去尝试解决问题,一种不行就换另一种,在不断尝试的过程中加深对问题的认识,最终找到适合这个问题的解决方法,甚至创造出新的方法;而那些让人感觉有点“笨”的人,往往是方法不多,几种方法试过不行之后就手足无措了。其实这和智商没有太大关系,方法集的形成主要是经验积累,自己多学、多做、多思考,举一反三,或者是从其他人那里学到经验,加入到自己的方法集中。

再来解释一下为什么没有讲基本的数据结构,尽管有很多读者抱怨:算法的课程居然不讲数据结构,不太像话,但是那些内容真不是这门课所关心的。讲讲数组、讲讲链表、讲讲各种排序算法总是轻松的,很容易学会,让人很有掌握这些方法后的成就感,但是,除了面试的时候满足一下懒惰的面试官,对于之后的工作没啥用。

甚至包括我在内的很多人在面试别人的时候,都不会问这种学院派问题的,我们通常会找一个工作中遇到的问题问面试者,并不期望他(她)解决,只是观察面试者在分析问题的过程中,对问题建立了什么样的数据模型,从侧面了解他(她)们对问题的抽象思维能力和各种数据结构掌握的程度。我并不是说排序这类基本的算法不重要,相反,这些基础很重要,但不是我的课程关注的内容。

因此,这个课程对读者是有要求的,那就是要了解这些基本的数据结构的特点和使用原则,当然,还要能熟练地使用一种编程语言。

各种算法的总结

这个课程在介绍算法的时候,都会结合具体的例子来分析。比如“Dijkstra 算法”,大多数数据结构的书或课程都会讲,但基本上都是用几个数字表示的节点图,讲讲算法原理,很容易让读者产生学会了这种算法的成就感。本课程在介绍这个算法的时候,结合了两个实际的比赛题目,重点讲的是如何对问题建模,将问题转化成可以用“Dijkstra 算法”解决的图论模型,最后的算法实现是用 C++ 语言还是用 Java 语言已经不重要了。

讲解“A * 算法”的时候也是一样的,我们用了一个带障碍物的 16 × 16 地图来介绍这个算法,这也是一些老的 RPG 游戏惯用的组织地图的方法,通过这个算法实例,大家可以直观地知道这些著名的算法是怎样与应用相结合的。

为准备这个课程的内容,我找了很多经典的(或著名的)算法。我记得关于一些看起来像是二维矩阵问题建模的时候,大家在群里对一维模型还是二维模型有过讨论,相信看过第 6 部分介绍的 Warren Smith 棋盘模型之后,孰优孰劣大家心里应该都有数了,思路开阔了,遇到问题的时候就多了一种应对的方法。

Zobrist 哈希算法”是如此的简单,即便无法直接使用这个算法的场合,这种在随机数的基础上异或再异或的方法,也可以用在其他需要哈希计算的场合。

介绍“RLE 压缩算法”的时候,介绍了 PCX 文件的格式以及对这种格式化文件的处理方法。对有格式文件的处理,大家工作中都经常用到,介绍这些惯用思想,反而让“RLE 压缩算法”成了配角。

讲“余弦算法”的时候,介绍了文字处理常用的向量化思想,在介绍“贝叶斯分类算法”识别垃圾邮件的时候,用的还是这种将文本分词,然后再向量化的处理思想。这种思想也是信息数字化的一种思路,掌握这种处理思想,对今后解决文字处理问题,会有很大的帮助。

另外,在课程内容准备的过程中,根据读者的反馈,还补充了“如何理解动态规划法”、“如何设计递归函数”、“状态压缩与动态规划”等相关知识,同时讲解了解决某种类型问题的惯用方法。在介绍中文分词算法的时候,我还补充了汉字编码的一些知识,这些都是我之前在做文字处理相关的软件的时候解决过的问题,相信大家今后也会遇到此类问题。

最后,希望每个读者都能看到这里,希望这个课程真的对你有用。

上一篇
下一篇
目录