算法和数据结构是计算机课程中比较烧脑但也是非常重要的一门课程。我想给大家介绍一下我是如何系统的学习算法和数据结构。
首先说下我的经历:上大学的时候觉得算法和数据结构是枯燥无味, 为了应付考试,硬着头皮啃下来,考试勉强过了及格线。现在想来真的是头皮发麻。后来,毕业找工作,面试需要考算法,我印象比较深刻就是,去面试一家网络公司,有道面试题就是考冒泡排序,当时只是把大致原理写了一下,后来面试主管告诉我,虽然实现没有写,但是还是有些底子的。再到后来,第一份工作的时候,遇到了我人生中比较重要的导师,他告诉我“底层操作系统”--计算机基础(其中就包括算法和数据结构,其他的我后续再分享)的重要性,以后就利用业余时间,走上了我的死磕之路。
我学习的方法,主要有3点:第一点,把知识点都揉碎,逐个消化。用一个成语来概括,就是庖丁解牛。把算法数据结构,把知识体系分割成一块一块相对明确、简单,同时具有脉络相连的知识脑图。特斯拉CEO 埃隆马斯克曾经说过,他学习新领域知识的一个窍门是:任何知识体系的话都是一棵树,所谓语法树,那么你要掌握这个领域的知识的话,就要把知识变成一颗树状结构有最基本的根,然后分出主干再分出枝叶,每个知识点最后和你熟悉的知识挂靠在一起,成为一个树形结构,因为人脑不适合记忆和理解孤立的知识,所以一定要把它弄成一个脑图。这里类比一下足球。足球是一个团队性很强的运动,个人训练就会拆解出:球感训练,运球训练,传接球训练,射门训练,过人训练等。职业运动员会针对每一项进行单独练习,以达到职业水准。当然还有团队战术训练等。回到正题,首先说下我的学习步骤是:

再来说,分解整理知识点。数据结构和算法,在我们的教程书籍里面,大致分为二十几种类,我使用了相对简单的分类:一维数据结构、二维数据结构及特殊数据结构。这里我收集整理了两个脑图:


学习的时候对着脑图,把对应数据结构的知识要点,如特点、常用场景、时间复杂度在脑海里反复的过几遍,形成一个整体的知识体系。再分享一下我的心得体会:算法最基础是:1. if-else, switch 分支跳转语句,if-else是逻辑的切换2. 循环3. 函数,
它们的是所有算法的基石,任何的高级的算法,数据结构到了最后都会转换成if else或者for 循环或者是递归。这些算法数据结构都是最朴素的一些运算操作,把所有的知识体系都搞明白,化繁为简之后,它的根本就是找到他的重复单元,基于这个重复单元,你就可以延展到高级的数据结构。
第二点,进行做刻意练习。我们要成为顶尖水平的话,最关键的一点就是基本功,也就是上面提到的“底层操作系统”。基本功就是区别业余选手和职业选手的根本。基本功如何练习--也就是刻意练习的目标是什么,关键就是能够把基础动作进行分解训练,且进行反复的练习。你只要记住这一点的话,你已经比很多人赢在了起跑线上。我强调一下这里的最大的误区就是如果你做一个算法题的话,做一个leetcode上面的题目的话,如果你只做一遍,那么这就是你进行练习和气体的最大误区,一定要记住这一点,一遍是完全不够的,很多人可能会觉得,一个算法题,比如说费波拉契数列,我已经写了一遍已经会了,已经写出来,同时的话,结果正确,那就行了,这是远远不够的,这就好像你练习足球,一个动作你只做一遍的话,你没法熟练,而且也没法把它变成自己的一个条件反射的动作。那么接下来我讲啊,用刻意练习的方式如何进行算法训练。这一点和大家背单词,或者进行托福的准备,其实差不多啊,就是要练习多次,我个人的量化的指标就是刷五遍。刻意练习的关键还有一点就是要练习自己的弱项或者自己的实力上缺陷的地方。在练习的时候经常会觉得不舒服,不爽和枯燥,有这样的感觉其实就对了,这样的感觉就是你自己在成长。足坛巨星C罗大家都知道,惯用脚是左脚,但是每次训练完他都会加练左脚。突破了舒适区,就是突破了自己。自己很不熟练的那就刻意练习专项训练,比如我对于动态规划的话没有头绪,那么就逼自己反复的练习,经过十道题20道题以及300到动态规划的题目的练习之后,达到一个很熟练的水平。我在进行算法和数据结构练习的时候就是把一些很典型的题目,然后不断的练习,一个题目,举一反三,把不同的算法不同的数据结构过变数把它练习好了之后,后面基本功的一个提升。这里插个题外话,首先刚开始的时候不要只想做一些比如说高大上的框架呀,学习一些高大上的,比如说人工智能的技术啊,其实并不是这样的。"底层操作系统"往往可以决定你未来技术道路上的高度。 第三点,反馈。所谓的反馈主要分为两种,一种是主动式反馈,另外一种叫做被动式反馈。主动式反馈就是,向高手学习,多阅读借鉴优秀的代码。举个例子,比如打游戏的时候,看下高手的第一视角,有精彩的地方,你心里会说,哦,原来可以这么玩啊。 被动式反馈,就是请高手指点,如code review。