6

结语:算法的那些事儿

 3 years ago
source link: https://blog.csdn.net/orbit/article/details/108729330
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
结语:算法的那些事儿_oRbIt 的专栏-CSDN博客

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

学习算法要达到的目的

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

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

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

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

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

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

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

各种算法的总结

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

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

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

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK