我是如何自学数据结构的?

·  阅读 3231

【转载请说明出处】:juejin.cn/post/684490…

写在前边

大家好,我叫小鹿,目前正在上大三。今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。写这篇文章主要目的还是重在让刚刚接触数据结构的读者按照总结步骤进行阶段性学习。

小鹿上的一所普通的三本大学,大学的三年时间基本在自学编程,毕竟课上老师所授的课程很浅,老师讲述一个知识点是要考虑到大部分不同理解能力学生的,所以对于我这种喜欢刨根问底的学生从大一开始不得不花费大量的时间来自学编程。自学呢,我更注重效率,效率在哪里来?我相信很多自学编程的人最讲究的就是方法和技巧,而小鹿的学习方法是不断的几个阶段循环总结而出的,那就是动机、目标、实践、反馈、提高标准

我的基础

先说一下学习数据结构之前处于一个什么的基础,大二的时候学校就开设了数据结构的课程,但是当时对数据结构并没有什么兴趣,一学期下来,如果别人问我知道数组和链表吗?我可能在大脑中有点结构印象,其他的数据结构比如:散列表、跳表、树等一点印象都没有,甚至不知道是什么。

我的学习动机

学习一门技术首先要有动机。那什么是动机呢?我们经常看到减肥的人通常在房间里放一张好身材的图片,就是为了产生动机每天坚持减肥。学习也是一样的,没有动机就没有的学习下去的动力。那我学习数据结构的最初动机是什么呢?快实习了,想让自己找一家好的公司实习,没有数据结构与算法的基础不可能进入一家理想的公司的,所以我将进入一家理想的公司作为学习的动机。

我的目标

经过大三上半年对数据结构的自学,和以前那个自己相比有了质的飞跃,从最基础的某一数据结构的由来、是什么,特点以及优缺点到实际项目中应该如何运用,再到如何培养自己下意识的数据结构(遇到问题,根据问题的特性就能下意识的想到用哪个数据结构来解决)。到后来逐渐的学会了将多种数据结构联系起来进行解决问题,这样做的目的就是能够让程序性能更加稳定,效率更加高效。

这些都是这半年来每天和数据结构打交道不断的训练出来的,这半年基本没有一天放松过,我相信功夫不负有心人,即使基础再不好,头脑再笨,通过我总结的操作步骤也能学好数据结构。

我的实践

因为我上的是一所三流大学,大多数时间考自学,总结了很多的提高学习效率的方法,那么在学习数据结构上我是怎么做的呢?我将数据结构的学习分为了三个阶段。

第一阶段:认识数据结构

第一步:学习它就应该知道它用来干什么,为什么,怎么做,小鹿建议去看一些基础的数据结构书籍或者借助百度和谷歌了解一下。

第二步:每种数据结构都有它的优缺点和性能的好坏,那我们以什么标准来衡量数据结构与算法的性能好快呢?那第二步就学习时间复杂度、空间复杂度相关的复杂度分析的内容,这部分内容至关重要,因为后边要学到的数据结构与算法都要有一个衡量性能标准的,为了能够不同的问题解决选择出性能最优的数据结构和算法。

第三步:上边我们了解到性能的衡量标准,那下一步就要开始学习最常用的几种数据结构:数组、链表、栈、队列、散列表、跳表、图、树、堆、字典树10种数据结构。第一阶段不要求我们了解这些数据结构,从以下几个方面来学习。由来、特性、适用条件、有哪些操作、每种操作的时间复杂度分析以及能否进行优化,这期间你会遇到各种问题,遇到问题怎么做,我通常会去百度或者谷歌借助别人写的文章进行总结记录到笔记本上。

第二阶段:深入数据结构

第一步:上边最基本的十种数据结构相关特性和使用条件都记录到本子上了,然后我们从头开始对每种数据结构进入深入研究,首先数据结构涉及到的操作,比如增、删、改、查等操作要自己实现一遍,在机器上运行一遍,写代码的时候一定要注意以下几点:边界条件、指针、代码的规范。

这样会使你更加的对代码有颗敬畏之心,每次写代码都要认真对待,如果机器上写代码没问题了,可以自己通过在笔记本上用笔手写亲自实现一遍,有利于你加深你的代码逻辑的理解。

第二步:你可能会问,第一阶段每种数据结构特性基本了解了,看什么书籍或者视频才能深入了解呢,关于视频资料我就不再这里推荐了,推荐书籍吧,这并不是打广告哈。要想深入我们要一本有权威的数据,想查什么就会有个权威的解释,《算法导论》这本书虽然很厚,但是每次查找都能找到我想找的,就当做一本词典查了,扩充自己知识体系了。

第三步:单独的深入学习真的很枯燥杂么办,那么我们就实际生活中的例子去分析,比如猜数字游戏,我们可以想想怎么才能在最短的时间内猜到正确的数字呢,可能你会想到使用二分查找。那好了,我们问一下自己二分查找存在的问题,这个过程中一定要多问自己为什么,只有这样你的知识层次才会得到扩展,比如二分查找如果数据中有重复数据怎么解决?

我还是要强调一下,一定要多问自己为什么,因为从心理学上来讲,人的大脑符合最小阻力原则,就是思考的事情最不喜欢做,所以这里我们要逆着来,才能进一步进行突破。如果你觉的上述两个阶段没有问题了,我们就进行下面的第三个阶段检索数据结构。

第三阶段:检索数据结构

第一步: 这时你可能学的非常多的关于数据结构的内容,但是很难运用,那怎么能够在实际实际问题中运用起来呢?第一步先要做整理,将前边零碎的知识点整理到笔记本上,怎么整理呢?我们可以借助思维导图,对知识体系化整理,无论是复习巩固都利于我们进一步加强。

第二步:上述整理完毕之后,你到实际项目中会发现,很多问题涉及到多个数据结构问题,我们浅表解决的还不过是针对单一的数据结构,那就尝试着自己将数据结构之间建立联系,比如数组和链表,每种数据结构都有优缺点,你在学习的过程中你会发现一个数据结构的优点正是另一数据结构的缺点,或者说这种数据结构可以解决的问题可以弥补另一种数据结构不能解决的问题,反复思考之后整理下来,方便以后在此基础上进行扩展。

第三步:将实际问题转换成所学的数据结构,遇到问题,根据问题或者数据的特征找到适用的数据结构,比如我们需要快速的插入、删除、查询数据,我们在大脑中快速的检索可以快速的实现插入、删除、查询的数据结构有哪些?平衡二叉树、散列表、跳表等。然后根据问题另一条件或者特征在这些数据结构中进行筛选。

第四步: 怎么筛选呢?就用到我们前边讲到的性能分析,时间复杂度、空间复杂度,知道选出合理的方案。

上述是我学习数据结构的三个阶段,如果你完成了上述的三个阶段,认为是不是没有任何问题了?不是的,因为我们会解决问题遇到很多情况,我们杰接下来怎么做呢?

我的反馈

我们把每次解决问题或者每一遍去复习数据结构都要有所收获,同样的知识怎么增加自己的收获呢?那就是要不断的反馈给自己信息,比如,散列冲突当前的解决方法在实际项目中不适用,那我将这个信息反馈给自己,问一下自己有没有更好的解决办法?反馈之后,接下来就是提高学习的标准了。

提高标准

学习数据结构总会遇到瓶颈的,当我们走出瓶颈之后就会很顺利很多,那你会问接下来有没有再提高的可能了?会有的,接下来你就讲提高自身的标准,比如你解决生活中的实际问题让自己有下意识解决问题的能力,不借助任何参考数据,这方面对自身的要求很高的,再比如提高工作的效率,看起来非常高标准的,我相信每个人只有不断的通过努力的实践、反馈总有一天会锻炼出来这种能力的,相信你。


本公众号专注于「前端」、「数据结构」互联网技术领域,通俗简单的文字和动漫配图,让你爱上编程。

一个不甘平凡的码农

微信公众号:一个不甘平凡的码农
分类:
后端
标签:
分类:
后端
标签: