【转载请说明出处】:juejin.im/post/5c8464…前端
你们好,我叫小鹿,目前正在上大三。今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。写这篇文章主要目的仍是重在让刚刚接触数据结构的读者按照总结步骤进行阶段性学习。算法
小鹿上的一所普通的三本大学,大学的三年时间基本在自学编程,毕竟课上老师所授的课程很浅,老师讲述一个知识点是要考虑到大部分不一样理解能力学生的,因此对于我这种喜欢刨根问底的学生从大一开始不得不花费大量的时间来自学编程。自学呢,我更注重效率,效率在哪里来?我相信不少自学编程的人最讲究的就是方法和技巧,而小鹿的学习方法是不断的几个阶段循环总结而出的,那就是动机、目标、实践、反馈、提升标准。编程
先说一下学习数据结构以前处于一个什么的基础,大二的时候学校就开设了数据结构的课程,可是当时对数据结构并无什么兴趣,一学期下来,若是别人问我知道数组和链表吗?我可能在大脑中有点结构印象,其余的数据结构好比:散列表、跳表、树等一点印象都没有,甚至不知道是什么。数组
学习一门技术首先要有动机。那什么是动机呢?咱们常常看到减肥的人一般在房间里放一张好身材的图片,就是为了产生动机天天坚持减肥。学习也是同样的,没有动机就没有的学习下去的动力。那我学习数据结构的最初动机是什么呢?快实习了,想让本身找一家好的公司实习,没有数据结构与算法的基础不可能进入一家理想的公司的,因此我将进入一家理想的公司做为学习的动机。微信
通过大三上半年对数据结构的自学,和之前那个本身相比有了质的飞跃,从最基础的某一数据结构的由来、是什么,特色以及优缺点到实际项目中应该如何运用,再到如何培养本身下意识的数据结构(遇到问题,根据问题的特性就能下意识的想到用哪一个数据结构来解决)。到后来逐渐的学会了将多种数据结构联系起来进行解决问题,这样作的目的就是可以让程序性能更加稳定,效率更加高效。数据结构
这些都是这半年来天天和数据结构打交道不断的训练出来的,这半年基本没有一天放松过,我相信功夫不负有心人,即便基础再很差,头脑再笨,经过我总结的操做步骤也能学好数据结构。数据结构和算法
由于我上的是一所三流大学,大多数时间考自学,总结了不少的提升学习效率的方法,那么在学习数据结构上我是怎么作的呢?我将数据结构的学习分为了三个阶段。post
第一步:学习它就应该知道它用来干什么,为何,怎么作,小鹿建议去看一些基础的数据结构书籍或者借助百度和谷歌了解一下。性能
第二步:每种数据结构都有它的优缺点和性能的好坏,那咱们以什么标准来衡量数据结构与算法的性能好快呢?那第二步就学习时间复杂度、空间复杂度相关的复杂度分析的内容,这部份内容相当重要,由于后边要学到的数据结构与算法都要有一个衡量性能标准的,为了可以不一样的问题解决选择出性能最优的数据结构和算法。学习
第三步:上边咱们了解到性能的衡量标准,那下一步就要开始学习最经常使用的几种数据结构:数组、链表、栈、队列、散列表、跳表、图、树、堆、字典树10种数据结构。第一阶段不要求咱们了解这些数据结构,从如下几个方面来学习。由来、特性、适用条件、有哪些操做、每种操做的时间复杂度分析以及可否进行优化,这期间你会遇到各类问题,遇到问题怎么作,我一般会去百度或者谷歌借助别人写的文章进行总结记录到笔记本上。
第一步:上边最基本的十种数据结构相关特性和使用条件都记录到本子上了,而后咱们从头开始对每种数据结构进入深刻研究,首先数据结构涉及到的操做,好比增、删、改、查等操做要本身实现一遍,在机器上运行一遍,写代码的时候必定要注意如下几点:边界条件、指针、代码的规范。
这样会使你更加的对代码有颗敬畏之心,每次写代码都要认真对待,若是机器上写代码没问题了,能够本身经过在笔记本上用笔手写亲自实现一遍,有利于你加深你的代码逻辑的理解。
第二步:你可能会问,第一阶段每种数据结构特性基本了解了,看什么书籍或者视频才能深刻了解呢,关于视频资料我就再也不这里推荐了,推荐书籍吧,这并非打广告哈。要想深刻咱们要一本有权威的数据,想查什么就会有个权威的解释,《算法导论》这本书虽然很厚,可是每次查找都能找到我想找的,就当作一本词典查了,扩充本身知识体系了。
第三步:单独的深刻学习真的很枯燥杂么办,那么咱们就实际生活中的例子去分析,好比猜数字游戏,咱们能够想一想怎么才能在最短的时间内猜到正确的数字呢,可能你会想到使用二分查找。那好了,咱们问一下本身二分查找存在的问题,这个过程当中必定要多问本身为何,只有这样你的知识层次才会获得扩展,好比二分查找若是数据中有重复数据怎么解决?
我仍是要强调一下,必定要多问本身为何,由于从心理学上来说,人的大脑符合最小阻力原则,就是思考的事情最不喜欢作,因此这里咱们要逆着来,才能进一步进行突破。若是你觉的上述两个阶段没有问题了,咱们就进行下面的第三个阶段检索数据结构。
第一步: 这时你可能学的很是多的关于数据结构的内容,可是很难运用,那怎么可以在实际实际问题中运用起来呢?第一步先要作整理,将前边零碎的知识点整理到笔记本上,怎么整理呢?咱们能够借助思惟导图,对知识体系化整理,不管是复习巩固都利于咱们进一步增强。
第二步:上述整理完毕以后,你到实际项目中会发现,不少问题涉及到多个数据结构问题,咱们浅表解决的还不过是针对单一的数据结构,那就尝试着本身将数据结构之间创建联系,好比数组和链表,每种数据结构都有优缺点,你在学习的过程当中你会发现一个数据结构的优势正是另外一数据结构的缺点,或者说这种数据结构能够解决的问题能够弥补另外一种数据结构不能解决的问题,反复思考以后整理下来,方便之后在此基础上进行扩展。
第三步:将实际问题转换成所学的数据结构,遇到问题,根据问题或者数据的特征找到适用的数据结构,好比咱们须要快速的插入、删除、查询数据,咱们在大脑中快速的检索能够快速的实现插入、删除、查询的数据结构有哪些?平衡二叉树、散列表、跳表等。而后根据问题另外一条件或者特征在这些数据结构中进行筛选。
第四步: 怎么筛选呢?就用到咱们前边讲到的性能分析,时间复杂度、空间复杂度,知道选出合理的方案。
上述是我学习数据结构的三个阶段,若是你完成了上述的三个阶段,认为是否是没有任何问题了?不是的,由于咱们会解决问题遇到不少状况,咱们杰接下来怎么作呢?
咱们把每次解决问题或者每一遍去复习数据结构都要有所收获,一样的知识怎么增长本身的收获呢?那就是要不断的反馈给本身信息,好比,散列冲突当前的解决方法在实际项目中不适用,那我将这个信息反馈给本身,问一下本身有没有更好的解决办法?反馈以后,接下来就是提升学习的标准了。
学习数据结构总会遇到瓶颈的,当咱们走出瓶颈以后就会很顺利不少,那你会问接下来有没有再提升的可能了?会有的,接下来你就讲提升自身的标准,好比你解决生活中的实际问题让本身有下意识解决问题的能力,不借助任何参考数据,这方面对自身的要求很高的,再好比提升工做的效率,看起来很是高标准的,我相信每一个人只有不断的经过努力的实践、反馈总有一天会锻炼出来这种能力的,相信你。