1. 前言
近期打算开个新坑,我打算把之前学过的一些算法知识整理记录下来。
一方面,距离我刚开始接触算法已经过去4年了,之前学到的知识都没及时记录下来,很多经典算法的细节部分可能都已经遗忘了,正好,趁现在把之前学过的东西再重新学习一遍,亡羊补牢,海边拾遗,温故而知新;
另一方面,之前学习算法的时候,学得比较随意,这里摘一叶,那里折一枝,学到的知识都是碎片化的,没有一个很系统性的知识体系,现在也可以抽空梳理出一个完善统一的算法知识体系。
想想当初学习算法的时候,一开始从深度学习入门,对里面公式的推导“不求甚解”,以为会像搭积木一样,调包成功搭几个神经网络框架就觉得很厉害了,后来接触到机器学习,发现里面的推导是如此的精妙,调包搭积木什么的根本不值得一提。
我发现自己的学习过程是本末倒置,再加上碰了不少壁,才开始沉下心来从公式推导学起,不调包去实现每一个算法,慢慢把基础打牢。在不断的学习过程中,发现算法的世界太大,自己知道的东西太少了,虽不能至,然心向往之~
Add oil~互勉
2. 关于笔记
网上和书上关于算法的基础知识讲解得都很详细,所以,我后面不会刻意去记录一些特别基础知识的部分,一方面不想重复记录,另一方面我写的东西也并不一定会比书上描述的精彩。
相对的,我会重点记录一些容易忽略的知识点、一些重要的知识点、一些编程的小trick,一些解题的新思路等。
因为我常用语言是Python,所以后面基本都是使用Python作为算法实现的语言。
3. 关于学习步骤
虽然《算法导论》中是先学习一些简单算法作为入门,再学习数据结构,但我还是比较喜欢先学数据结构,再学习算法知识,理由如下:
- 算法种类比较多,即所谓“其知也无涯”。而数据结构的种类比较少,一来二去就学得七七八八了,某种程度上是“有涯”的。先“有涯”而后“无涯”,学习一般规律矣~
- 类似于鸡先蛋先的问题,我觉得算法都是基于数据,存储数据的结构改变的,相应的算法就要改变,所以数据结构是一个基本,所以,应该成基本的东西学起。
因为数据结构是数据存储的方式,所以其解决的是数据的增删改查问题,所以对于一种数据结构的学习,了解完其概念后,只要学习其增删改查的操作,就可以达到入门了。
学习算法,可以从这个算法是为了解决什么问题而提出来的。我们首先了解其输入输出是什么,然后带着实例数据去走一遍中间流程,或者直接先找个现成的程序,跑通一遍。这样的好处是,虽然你对中间流程可能还是一无所知,但你学的过程中心里有底,心里踏实,学得就有自信。更重要的是知道这个算法出来的是一个怎样的效果,知道直接有没有学习上的错误,出现了错误,就可以不断验证反馈哪一步出现了问题。
4. 关于一般格式
后面的笔记会在很多地方提到一般格式,这都是一些伪代码,这些伪代码都是使用Python编写的。
这里提及的一般格式,可以理解为:如果你要实现这样一个功能或者这样一个结构,那你就先把一般格式的伪代码复制粘贴一遍,然后再用自己的语句,替换伪代码里面的未定义函数(例如 status()
用于代码逻辑判断,change_status()
用于改变代码逻辑判断, operate()
用于实现代码功能等,另外,一般 change_status()
和 operate()
是相对独立的,即两者涉及到变量不会相互影响),这样就可以得到一个带有这样一个功能或者这样一个结构的代码了。
这其实就是一种经验的记录,你就可以不用构想代码的框架,而专注于你要实现什么样的功能,可以提高不少编码的效率~
5. 相关经典书籍
5.1. 算法和数据结构
《算法导论 第三版》 Thomas H. Corman
最经典的算法大部头。但我不太喜欢这本书的编排——一上来就是一个排序算法糊你脸上,然后后面才慢悠悠介绍算法的概念,然后又新开一个章节专门介绍排序算法,感觉前面的逻辑有点乱。而且里面的语句略显啰嗦冗长,不太好理解。
但里面介绍到的知识点的确很全,是学习算法和数据结构必看书目。
《算法第四版》 Robert Sedgewick & Kevin Wayne
也是一本很经典的算法书,但是主要是基于Java编写的,还好之前本身会点Java,里面的例程还算看得明白。一般配合上面《算法导论》使用,作为一个互补书籍。
5.2. 机器学习
机器学习只推荐经典的三巨头
《统计学习方法》李航
小蓝书,机器学习入门必备。现在已经出了第二版了。
PS:之前买了第二版,但新增的部分,就看了几个小节,后面一直都没有时间去看,以后再慢慢补吧😩
《机器学习》周志华
西瓜书,比上面的小蓝书难啃一点,也是机器学习必备。
《Deep Learning 》 Ian GoodFellow
花书。虽然是经典书籍,但我还没有翻阅过,所以不做过多的评价。
另外,还有吴恩达的斯坦福机器学习课程,也是入门比较好的课程。