算法与数据结构到底难不难,好不好学?很多人有着这样的困惑,因为程序员面试特别喜欢问算法与数据结构题,身边很多朋友都临时抱佛脚,等到要面试才报一些培训班参加算法培训,收获颇低。那么如何高效地学习算法与数据结构呢?
1.系统学习,由浅入深
1.1教材为主,文章为辅
在这个快节奏的年代,我们早就习惯了从公众号、头条号等内容分发平台上去获取知识,慢慢地我们习惯了这种快餐的技术内容,这其实有好又坏,好的是碎片化的时间利用起来了,毕竟现代人,特别是程序员,真的特别难拿出一块完整的时间出来学习,特别是有了家庭以后,想安排一块完整时间出来举步维艰。
缺点是学习到的知识也是非常零碎的,知识缺乏关联性,很难串起来,除非有足够的基础与能力,才能把知识由点成线,由线成面。
所以有一本书是最好的,虽然说不一定要把书里的所有内容都学习完毕,但是至少可以通过目录,知道哪些算法与数据结构是由关联性的。这里,我推荐《算法导论》,虽然有点老,但是非常经典,堪称算法与数据结构的圣经。
1.2合理安排,由浅入深
学习有一个过程,从各种文章进行学习比较适合有一定基础的,如果没有基础,一定要先打好基础,毕竟万丈高楼平地起。
有一次有一个粉丝问我,红黑树怎么实现,他不知道Map为什么要用红黑树,我就问他,二叉排序树知道么?他说不知道,甚至他连二叉树都不知道,连最基础的概念都没搞清楚,怎么可能把复杂的搞明白呢?对于这种情况,复杂的数据结构我们可以先了解,了解他们的特点,然后先从最基本的数据结构学习,由浅入深。
最基础的数据结构,我们可以先了解堆、栈、队列、树、还有图,然后学习一些基础的算法,例如贪心算法、搜索算法、分治,慢慢地我们可以学习一些更加复杂的,甚至是结合了数据结构的算法,如数据结构图中的最短路算法、生成树算法,也可以是动态规划、线段树等。把前面的知识梳理清楚后,我们再来学习网络流,A*搜索等更复杂的算法自然水到渠成。
2.学习方法,章法有数
好的学习方法,往往能够事半功倍,学得勤不如学得巧。我们常常喜欢用战术上的勤奋,来掩盖战略上的懒惰,明明是方法不对,非要在那里撑着,然后安慰自己是别人基础好,能力强。
2.1多画图
为什么要多画图,算法与数据结构一般都会比较抽象,对于初学者,很难去理解树、图这样的数据结构,一定要多画图,通过画图,可以跟进一步的理解。像深度优先搜索或者广度优先搜搜,单凭理解可能很难想象出搜索的过程是什么样子的,不如尝试把搜索树画下来,你会有进一步的理解。
另外,算法流程图也要多画,可以让你进一步加深你算法过程的理解,特别是一些关键的节点,什么时候退出循环,什么时候有不同的分支,这些都是算法的精髓,单纯阅读文字很容易被掠过。
2.2多打点
随着算法变得越来越复杂,数据量变大之后,可能一下子不能够把整个算法都画出来,这个时候,把算法的代码写到电脑里,运行起来,在关键的地方加上断点,或者打出日志。举个简单的例子,我刚学习计算机的时候,很难理解什么是递归,我的老师跟我讲了一个很好的办法,在每次进入递归的代码前后,都打出一些日志,运行的时候,通过观察日志,就能够看到算法执行的流程了。
2.3多讨论
下面是一个学习金字塔,说的意思大概就是如果一个人知识靠看书、靠听讲来学习知识,大概只能学习到20%,如果他把学习的知识简单实践一下,也就是写代码,那么可以掌握30%左右,如果有人一起学习,互相讨论,那么就可以掌握到50%左右。深入的实践,可以学习到70%左右。
我们学习的时候,通常会有这么一个现象,一叶障目,不见泰山。我们往往会钻牛角尖,一个问题想不明白,可能就走不出来。我们纠结的,可能别人却轻松理解的,我们认为理所当然的,可能别人却百思不得其解,所以,能找到志同道合的人,大家一起互相交流,是快速进步的方法。
2.4多对比
对于一些相似的算法,我们可以拿出来对比,才能更进一步的深刻理解,像深度优先搜索算法与广度优先搜索算法,状态表示,边界情况,两个算法都是通用的,他们两的不同,主要是搜索顺序的不同,因为搜索顺序的不同,所以深度优先搜索一般我们使用栈实现,广度优先搜索我们使用队列实现。
2.5多练习
数据结构与算法,如果你只是从书本上去汲取,和朋友进行讨论,那是不行的,那样,你掌握的东西,最多只能称之为知识,只有把知识加以应用,才能称之为技能。
如果培养算法与数据结构的技能,最好的做法就是做练习,可能你在工作上,一时半会还找不到应用的场景,那么可以先试试刷题,刷题也是需要技巧的,后面我们再继续讨论讨论。
3.坚持不懈,脚踏实地
这个年代发展得太快,感觉所有的人都希望所有的东西都是唯快不破,都希望一口吃成一个胖子。朋友公司是做培训的,几乎每一个教程前面几个课程播放与下载量都非常高,但后面的就断崖式的下跌,能坚持到所有都学习完的都微乎其微。
3.1打卡
这两年,打卡突然火起来了,在五六年前,很难想象,我们需要一群人,在一个群里面,突然发出来一个链接,高喊一声打卡。打卡,是一群志同道合的人互相学习的机会,也是互相监督的机会。
3.2总结
多总结,多归纳!在前面说过,大多数人缺乏的,并不是知识,而是知识的归纳能力,尝试把不同算法与数据结构进行对比与归纳,一是让你更加深入地掌握,二是可以对算法地选择更加理性,更深入的,可以理解算法与数据结构背后的数学原理。
最后的最后,如何学好算法与数据结构,我觉得有3个关键词,主动、实践、坚持。希望大家都能进一步的掌握算法与数据结构。如果大家希望学习数据结构与算法,我就是那个志同道合的人,欢迎大家关注我,让我们一起学习进步。