多年以后,面对考卷,你将会回想起,教授带你去见识数据结构的那个遥远的下午。
数据结构是计算机最重要的专业课,只要还在干这行就逃不掉数据结构的学习和应用。这门课在统考中占到了45分(满分150分),然而这一门课又像毕加索一样抽象,对跨考的同学非常不友好,因此今天就来谈谈数据结构的复习。(本文前边废话较多,不想看的同学可以直接拉到最后一部分:怎样看书。)
知彼知己者,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必殆。所以我们先来看一下计算机统考大纲的数据结构部分(自命题高校出题范围也多与统考类似)。
01 线性表
(一)线性表的定义和基本操作
(二)线性表的实现
1.顺序存储
2.链式存储
3.线性表的应用
02 栈、队列和数组
(一)栈和队列的基本概念
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
(五)特殊矩阵的压缩存储
03 树与二叉树
(一)树的基本概念
(二)二叉树
1.二叉树的定义及其主要特征
2.二叉树的顺序存储结构和链式存储结构
3.二叉树的遍历
4.线索二叉树的基本概念和构造
(三)树、森林
1.树的存储结构
2.森林与二叉树的转换
3.树和森林的遍历
(四)树与二叉树的应用
1.二叉排序树
2.平衡二叉树
3.哈夫曼(Huffman)树和哈夫曼编码
04 图
(一)图的基本概念
(二)图的存储及基本操作
1.邻接矩阵法
2.邻接表法
3.邻接多重表、十字链表
(三)图的遍历
1.深度优先搜索
2.广度优先搜索
(四)图的基本应用
1.最小(代价)生成树
2.最短路径
3.拓扑排序
4.关键路径
05 查找
(一)查找的基本概念
(二)顺序查找法
(三)分块查找法
(四)折半查找法
(五)B树及其基本操作、B+树的基本概念
(六)散列(Hash)表
(七)字符串模式匹配
(八)查找算法的分析及应用
06 排序
(一)排序的基本概念
(二)插入排序
1.直接插入排序
2.折半插入排序
(三)气泡排序(bubble sort)
(四)简单选择排序
(五)希尔排序(shell sort)
(六)快速排序
(七)堆排序
(八)二路归并排序(merge sort)
(九)基数排序
(十)外部排序
(十一)各种内部排序算法的比较
(十二)排序算法的应用
推荐书目
1、《数据结构(C语言版)》 严蔚敏
这一版的数据结构应当是大家看得最多的,但是其中的代码介于C和伪码之间。
2、《算法与数据结构 C语言描述》 张乃孝
这一版的编程语言比较规范,但是看得人比较少。个人而言更喜欢这一本。
3、王道系列
4、天勤系列
王道和天勤是计算机考研最主流的教辅,天勤更适合跨考。另外教辅毕竟只是辅,不可替代教材。
5、《算法与数据结构考研试题精析》
俗称数据结构1800(不是汤家凤那个1800),目前已经出到第三版,不推荐买第二版,第二版很多题目的语言用的是pascal,这种语言现在考研基本不出现。
这本书的题目比较全面,包含很多学校的真题,如果把这本书的题目都做会了,数据结构考研问题就不大了。建议先从选择开始重点突破,解答题根据报考学校出题情况选择性练习。
学习视频
1、清华大学 邓俊辉
2、浙江大学 陈越
以上两位老师的数据结构视频在b站就可以找到。
语言基础
统考大纲要求c或者c++,部分院校还可以选用java。以c语言为例说下至少应该掌握哪些知识点。为了方便演示,在此以谭浩强教授第三版的《C程序设计》为例。其目录如下:
仅仅从数据结构应试的角度看,3-9章,10-12章(不看共用体)是需要看的。如果是纯碎零基础没写过代码那么前两章也要看看。其中最难理解的也是最重要的是第10章指针,新手需要理解一段时间。学完这些至少保证考试涉及到的代码能看懂,考试必备的算法涉及的语法基本会用。大多数院校或者统考不会涉及太高端的语法操作。
时间充裕的话可以自己上机敲代码试试,尤其是一些女童鞋,不要害怕敲代码,电脑不会吃人,拿出你们怼男朋友的气势来写代码。但是如果出了bug请你们反思自己而不是质疑编译器是不是不爱你了。
如果你是纯零基础或者不怎么写代码还是建议花上几天时间学一下c语言,不然会很痛苦,至于教材不一定用谭老师这本。如果你是写代码比较多的,有一些基础的就当我没说。
怎样看书和做题
01熟悉概念
这里的概念包括一些数据结构的概念以及算法的流程。很多概念的描述不是一时半会能理解的,没关系第一次看不要求深刻理解,先有个印象,然后进行实际操作,比如链表插入删除画图,二叉树遍历画图,手动排序等等,通过实际操作加深理解概念。在这一步不要过于纠结抽象的问题,也不要纠结代码,把这些工作当成乐高玩具就好。
02熟悉代码
熟悉了操作题目后就可以逐渐抄袭,模仿书上的示例代码,由于严蔚敏版的教材代码过于……,在这里可以学习下王道天勤的代码。下列基础代码一定要掌握,各类算法题以及选择都可以在从这里衍生:
以上代码一定要经常练习,反复练习,不要只背下来还有理解其原理,知道为什么这样写。
03做习题
关于习题的选择我优先推荐1800.这本书的题目比较全面,包含了很多学校的真题,优先做选择,时间充裕再做填空和解答题。如果时间不够可以只做王道或者天勤的题目。
习题中最令人棘手的当属算法设计题目,很多写代码少的同学感觉并没有思路。算法设计题目主要是两个问题,第一想不出算法或者想不出最优算法,第二想出来算法不会实现。
为了解决这两个问题,我们先来看看历年考了什么(题目和答案细节请参考你们买的书):
2017年:将二叉树转化为中缀表达式。解析:这个题目显然是在中序遍历基础上稍作修改。
2016年:n个正整数组成的集合A,将A划分成两个不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2的元素之和分别为S1,S2设计个算法满足|n1-n2|最小且|S1-S2|最大。解析:最朴素的思想是把最小的一半元素放在A1中其余的放在A2中,也就是对A进行划分,显然是在快排基础上做修改。
2015年:对于单链表中绝对值相等的节点只保留一个,链表长度m,节点绝对值<=n。解:用数组记录出现过的节点值,遇到重复就删除,这个题可以暴力破解。
2014年:计算二叉树叶节点带权路径长度之和。解:遍历就可以解决。
2013年:找主元素。解:想不出最优解可以暴力破解。
可以看到算法题主要集中在数组,链表和二叉树。如果是链表或者二叉树比较容易想到算法或者暴力算法。如果是数组的题目,最优算法还是存在一定难度,有些时候需要暴力破解。但是很多算法题目可以在教材中找到参考,而非给你个比较难的没有边际的题目,也不至于说考你设计个DP,Greedy,FSM之类的在LeetCode中都有可能是Hard的题目。因此还是要熟练掌握书上的算法,并多多研究各种习题的算法解答,最开始想不到没关系,一点一点学习模仿,不要想着有什么万能的办法可以速成算法题,这种题目不是一朝一夕可以成的,需要不断练习摸索 。
最后欢迎关注我们的公众号:计算机研究僧以及知乎专栏:计算机研究僧。