干货|数据结构到底怎么学?
Posted 王道在线
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货|数据结构到底怎么学?相关的知识,希望对你有一定的参考价值。
每年都有很多跨考计算机的考生来问我们如何入门、先学什么,王道这次邀请了一位从
社科类专业跨考计算机上岸武汉大学的学长
来跟大家分享一下如何入门数据结构,开启计算机考研之路,一起来看看:
对于跨考的同学来说,数据结构是更需要重视的,可以说是跨考生入门课,绝大多数高校初试都会考数据结构,复试的上机考试和面试中也经常考察;另外,数据结构也是相对容易的一门,需要记忆的东西相对少一点,更多考察逻辑思维能力。
在系统学习数据结构前,我选修了校内的 C 语言公共课。C 语言是相对容易上手的一门编程语言,当时觉得选线下课更方便和老师沟通交流,也可以和其他同学一起研究难题共同进步;同时,这门课每个学期都有,名额也比较多,选课比较方便。
我重点学习条件判断、循环结构、函数定义等,因为要学数据结构,所以结构体是肯定要学的。指针在数据结构中也涉及到,但我只是简单学一下基础用法,没有太深入去研究,另外文件操作我也只是简单学了一下。
和其他同学一起上课的好处之一是方便交流。我记得当时我在解书上的习题“百鸡问题” 时,代码写了很久一直没有得到正确的答案,后来我看了一下旁边同学的答案,感觉一下子就豁然开朗了。
还有一次,代码被我反复检查认为是没问题的,可就是得不出正确的答案, 后来问旁边同学,才知道自己在输入是少了一个 getchar()。 C语言我认为要点在于动手实践,我自己的做法是把教材的课后习题基本都写一遍,动手写代码的学习效果比纯听理论要好的多。
上公共课有一个问题,就是 C 语言学得不会很深,也不会安排用 C 语言做什么项目。但对于学习数据结构和应对复试机试已经足够了,比如 408 的数据结构题目更多用 C 语言表示,而大部分学校的上机考试都允许使用 C 语言。
如果你没有学过 C 语言,我推荐在 MOOC 上听一门 C 语言课,然后认真完成课程作业;又或者你是在校学生,可以选修一下校内 C 语言的选修课,有问题可以多和课上同学交流。
有了 C 语言程序设计基础,看懂数据结构中的结构体和算法就方便多了。备考时看的王道数据结构课对于结构体的定义有时候会用 C 语言,有时候会用 C++语言,这两种语言的基础语法大同小异,所以基本不影响课程学习。
其实数据结构的基本原理还是比较有趣的,我会通过画图的方式把某类数据结构表达出来,比如队列我喜欢用简化的链表表示;树和图我就直接按照要求画出来,用圆表示结点, 箭头表示指针。
在实际做题的时候,转换法和排除法是比较好的两种方法,比如做拓扑排序,我会把每种可能的排序转换成字母串表示;在给定先序遍历序列和中序遍历序列时,我会用排除法把一些明显的错误选项排除掉,然后再逐一校对正确序列。
我觉得我在学习数据结构中一个比较大的困难是手写算法代码。我自己的做法是把每一节的代码题集中在一起做,然后硬着头皮做下去;一下子面对这么多的算法题可能会有点可怕,但只要下定决心,做着做着就不觉得可怕了。
为了提高做算法题的效率,我一般是做一两道题休息一下,劳逸结合。一开始我也想过一下子把题目做完,但是后来发现这样做效率反而不是很高。倒不如写一两道题的代码放松一下,这样时间虽然很快过去了,但学习效果得到了提高。
有的题目很难,为了节省时间,我在一段时间内没能做出来就直接看答案,看完后在重新根据答案的思路自己再写一遍,好的题目是应该多做几遍的。当我把算法题都看了或做了好几遍的时候,我发现自己在面对算法题时已经很少有畏惧心理了。
数据结构的具体表现可以归纳为线性表、栈、队列、串、树、图、数组等。下面我将结合数据结构的具体表现分别进行分析,并介绍自己相关的学习经验。如果你的专业课不是 408,也可以看一下,道理是相通的。
线性表包括顺序表和链表,分别对应顺序存储结构和链式存储结构。408 考试的算法题对线性表情有独钟,故大家一定要理清线性表的基本逻辑,至少要看明白实现方式。
一般算法题会要求首先写算法思路,然后手写算法代码,最后计算时间复杂度。算法思路基本是送分项,讲清楚算法怎么实现的即可,最好分步骤,方便老师阅卷。
手写代码一定要动手写,每道题可以做几遍,遇到不会的可以先参考答案,看看答案是怎么写的,然后按照答案的思路自己再写一遍。
连续手写算法题可能
会有点枯燥,我的做法是卷摸结合,做一两道题摸鱼一下。
对于时间复杂度,无论是算法题还是选择题都会涉及。对于大题,只要写的时间复杂度和算法的吻合,就能得分。有时候题目会比较难,这时候我们就要弃车保帅:用差一点的时间复杂度把题目做出来,不至于说全军覆没。
其实不同的时间复杂度得分差距也不会太大,时间紧迫的时候建议优先用简单的算法,比如暴力算法。
对于选择题,题目难度一般不会太大,但也要注意检查、小心算错。
栈和队列是重点考点,栈是“先进后出”,队列是“先进先出”。对于栈和队列的考察更多出现在选择题,在解题的时候可以在草稿纸上把数据运算过程模拟出来,再做个标记,这样检查也方便。
栈和队列也经常和树与图结合着考,大家可以把知识结构联系起来。
在树数据结构中,栈用于先序遍历、中序遍历和后序遍历,队列用于层次遍历;在图数据结构中,栈用于深度优先遍历,队列用于广度优先遍历。
关于串的考察基本是模式匹配选择题,包括暴力算法和 KMP 算法,难点在于求 KMP 算法的 next 数组。
王道书会有大同小异的求法,我个人比较推荐 next[0] 为-1 的求法,真实考试中这种解法也更多地出现。在解题的过程中,可以把关键 步骤写在草稿纸上,这样也方便后续的检查。
树是非常重要的考点。对树的考察主要包括树的性质、树和森林的转换、二叉树的遍历、线索二叉树以及哈夫曼树等。不但选择题喜欢考,大题也经常有树的题目(特别是树的遍历)。
关于树的选择题,一定要对树的性质烂熟于心,包括树的度、结点、高度等。最好能自己动手推导一下相关的公式,在实际答题的时候如果忘记了公式,可以枚举一些特殊值尝试。
我在实际做题的过程中发现,枚举(投机取巧)其实是一 种高效的做题方法。
关于树的算法题,要点在于套用数的遍历解题,平时多手写做题考试就不会慌。
另外,408 考试还喜欢考察哈夫曼树,在誊写答案前最好先在草稿纸上简单写一下过程,方便检查的时候看看有没有算错。
对图的考察更多出现在选择题,包括求最小生成树的两种算法、求最短路径、 拓扑排序和求关键路径等。
这些考大题的可能性不高,可以用画图和排除法的方式解选择题。
即使出现图的大题,考难题的可能性也很低,熟练掌握图的广度优先遍历和深度优先遍历即可,比如 21 考研的题目出现了图的大题,主要算法思路是图的遍历。实在找不到高效的算法,可以循环遍历解题,最后的分数也不会很低。
对数组的考察,更多在于数组元素的查找和排序。查找和排序同样是核心考点,不但选择题爱出,综合题也经常出现。查找一般出现在简答题,排序一般出现在算法题。
查找的重要知识点在于二叉排序树、平衡二叉树、B 树、B+树和解决哈希冲突,其中 B 树和 B+树基本上考选择题。
查找的知识点建议都自己模拟实现一遍,弄清楚背后的逻辑。
排序主要考察内排序,如果考外排序,一般会出现在选择题。
考前要对各种排序的时间复杂度了然于心,最好能手写出各种排序的代码,特别是冒泡排序、 交换排序和归并排序。
对于考研而言,C 语言是学习数据结构的基础。掌握 C 语言的结构体、指针等可以帮助我们更好地理解数据结构中的定义;掌握 C 语言的条件判断、循环结构、函数定义等可以帮助我们更好地理解数据结构中的算法。
在时间有限的情况下,学好王道的数据结构课就足够了,不必再看其他参考书。
对于跨考生来说,先学一门C语言,以C语言为基础学习数据结构会更轻松;在复习计算机考研各科的时候,优先复习数据结构也是比较合适的。
以上就是学长的全部分享,怎么学数据结构现在应该有头绪了吧!这样的干货分享大家觉得怎么样,有什么建议或者问题欢迎留言哦~