西北大学851软件工程复习建议

1、851软件工程复习思路

首先是官方给出的参考教材

西大有数据结构的自编教材-《数据结构(耿国华版)》,从内容上来说这是一本很好的教材,内容非常全面,数据结构和算法全部用c语言实现,对于想要学好数据结构、学好算法的同学来说是一本不可多得的教材。

《数据结构(耿国华版)》

针对851的复习策略一般就是两个方向:①耿国华老师的教材+教材课后习题+往年真题。②《王道数据结构》+往年真题+教材课后习题(时间充裕情况下)。

对于考研来说,我个人是不赞同从头到尾按照西大的官方教材来复习的。如果你是外校来报考西大:①首先耿老师的教材编程有她自己的风格,你是否适应。②全书用c语言的指针来实现,是否能完全搞明白。③教材内容涉猎极广,考研不会都考。

王道数据结构

那么我的建议是:①王道数据结构(只需要一本即可,不需要再买什么天勤还是1800)+数据结构范例自己手动实现一遍(用c++,要比用c语言省事许多)+往年真题(一定要达到提到题就能直接陈述答案的地步)。

原因呢如下:

①数据结构是一门应用型的学科,划知识点背代码学的慢又死板,一本王道理解透彻顶的上看很多本,而且效果更好。其次王道代码很人性化,虽然大部分还是用c语言实现,但是部分生涩之处也用到c++的引用,比较简单。

②正如上一条所说,数据结构死记硬背基本没有提高,如果自己能抽时间全部手动实现一遍,知识点不背也能自己解释,而且遇到算法题思路非常清晰。

③c++的标准输入输出流cin、cout、c++的引用、c++的STL类-vector、queue、stack应用简单并且老师也喜欢看到、c++的new、delete也更简单,这些都可以用在考研中来简化程序同时老师也乐意看到。

④西大的试卷每年有一半以上的试题来自往年真题或者是往年真题的调整,这个大家做5-6年之后也可以感受到,所以西大的试卷很大一部分是可以在考试前准备好的,自己整理好往年试题最完美的答案,考场上会有很多原题。

2、试卷结构

西大考研的试题类型分布和我们本科考试的试卷极其相似,没有选择题和填空题,全部是大题。所以我们本科考试有一个潜规则“答满必过”,考研也亦是如此,不要遇到不会的题就一字不写。

整个试卷一般由这四部分构成:

一、简答问题。一般由4-5个算法知识点的问题组成。

二、方法选择。一般是通过考察算法的实现细节来做方法的选择、优化、分析,近两年有加入时间复杂度的分析题。

三、构造结构。根据查找、排序、树、图章节中核心算法对给定问题构造结构,实质上还是考算法原理

四、编写算法。一般会是一道线性表算法、两道树算法和一道图算法组成。线性表大多是双指针、树大多是递归、图的算法考法很单一。

那么在我看来,其实四道题都是在考算法,所以我一直坚信针对算法的程序手动实现是一切之本,能够手动实现意味着后部分得大题基本都是手到擒来,第一部分的大题则需要辅助以基础知识的记忆。

下面是一份16年西大851的试卷,大家来看一看,如今的试卷19-20-21等难度早已大大增加,这里可以参考来了解题型。

西大官方公布过13-18年的试卷,而18年后只有网上的回忆版,这里13-18的试卷我分享给大家:

西大851软件工程-13-18

或者百度网盘:

链接:https://pan.baidu.com/s/1oKQ8ibq2-A4hizgCcXQsqQ 
提取码:bp50 
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享

16年851试卷:

西北大学2016年招收攻读硕士学位研究生试题

科目名称:数据结构             科目代码:851

适用专业:计算机技术 软件工程         共2页

答案请答在答题纸上,答在本试题上的答案一律无效。

[注]算法描述可采用类语言描述,写清注释。

一、简答 [每小题5分,共20分]

1.栈、队列和字符串都是限定性线性表,它们各自有什么限定?

2.折半查找的前提条件是什么?

3.在图的遍历过程中,访问标志数组visited[]如何防止结点被遗漏访问和重复访问的?

4.简述排序的稳定性,列举至少2个稳定的排序算法和2个不稳定排序算法。

二、分析 [每小题10分,共30分]

1.若一个具有n个结点、k条边的非连通无向图是一个森林(n>k),则该森林包含多少棵树?

2.设10000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则快速排序、简单选择排序、堆排序、直接插入排序、归并排序中,哪些排序方法效率较高,简要说明理由。

3.分析冒泡排序的最好情况和最坏情况性能。

三、构造结果 [每小题10分,共50分]

1.已知一棵二叉树的先序遍历是ABDEGCF,中序遍历是DBGEACF,试画出这棵二叉树,并将其后序线索化。

2.给定权值{3,4,5,6,7,8,9},构建Huffman树,并计算其带权路径长度。

3.图的邻接表存储结构如图1所示。基于该存储结构,写出从V1点出发的深度遍历序列以及深度优先生成树,并给出该图的邻接矩阵存储方式。

4.对以下关键字序列建立哈希表: {19,13,20,21,23,27,26,30},哈希表长度为10,哈希函数为H(K)=关键字%7。用线性探测再散列解决冲突,计算在等概率情况下查找成功和不成功的平均查找长度。

5.已知关键字集合:{19,13,20,11,23,27,16,30},分别写出简单选择排序和直接插入排序的前三趟排序结果。

四、编写算法 [每小题10分,共20分]

1.某顺序表中的元素为整型,设第一个元素为key。编写尽可能高效的算法,将小于等于key的元素全部放在其前面,大于key的元素全部放在其后面。

2.在二叉排序树中查找关键字为key的结点。若找到,返回该结点的地址:否则返回NULL。

五、编写算法 [共15分]

对带头结点的单链表Head进行简单选择排序,排序后结点值从小到大排序。

六、编写算法 [共15分]

某有向图采用邻接表存储,编写算法输出该图的拓扑序列。

3、博客可以获得的帮助

其实我的博客中已经把大部分算法都用c++实现了,后面的算法手动实现主要就是增加知识点和算法整理。大家可以翻阅我之前的博客。

考研编程-线性表

考研编程-树

考研编程-图

考研编程-排序算法

试题答案我这里给出一份16年我写的解析(仅供参考):

[2016]

一、简答 [每小题5分,共20分]

1.栈、队列和字符串都是限定性线性表,它们各自有什么限定?

答:(1)栈是只允许在一端插入和删除的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底。

(2)队列是只允许在一端删除,在另一端插入的线性表。允许删除的一端叫做队头,允许插入的一端叫做队尾。

(3)串是限定了元素为字符的线性表。

2.折半查找的前提条件是什么?

答:折半查找只适用于有序顺序表。

3.在图的遍历过程中,访问标志数组visited[]如何防止结点被遗漏访问和重复访问的?

答:辅助数组visited[]的初始状态为0,在图的遍历过程中,一旦某一个结点i被访问,就让visited[]为1,防止它被多次访问。当visited[]全部置为1时,所有结点都被访问。

4.简述排序的稳定性,列举至少2个稳定的排序算法和2个不稳定排序算法。

答:(1)、如果在记录序列中有两个记录r[i]和r[j],它们的排序码值k[i]=k[j],且在排序之前,记录r[i]排在r[j]前面。如果在排序之后,记录r[i]仍在记录r[j]的前面,则称这个排序方法时稳定的。

(2)、稳定的排序方法:直接插入排序,折半插入排序,冒泡排序,归并排序,基数排序。

(3)、不稳定的排序方法:快速排序,简单选择排序,堆排序。

二、分析 [每小题10分,共30分]

1.若一个具有n个结点、k条边的非连通无向图是一个森林(n>k),则该森林包含多少棵树?

答:该森林包含n-k棵树。

假如将这个森林用左孩子右兄弟表示法转化为一棵二叉树,则n个顶点会对应n-1条边。比k条边多出来的n-1-k条边就是用来连接下一棵树根节点的边。所以这个森林一共有(n-1-k)+1=n-k棵树。

2.设10000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则快速排序、简单选择排序、堆排序、直接插入排序、归并排序中,哪些排序方法效率较高,简要说明理由。

答:归并排序、快速排序、直接插入排序在最后一趟排好之前都无法保证把前30个最小的元素找出来。

堆排序和简单选择排序均可以实现在当前无序的区间中找出序列中最小的一个元素。能在不把所有元素排好序的情况下找出前10个最小的元素。

对于堆排序,为得到序列中前k(k=10)个最小的数,我们先将序列中的元素a[0...k-1]建立成大根堆,再将a[k...n-1]逐个输入,与堆顶元素比较。如果新输入的元素x比堆顶的元素大,则不放入堆中;如果新输入的元素比堆顶的元素小,则将堆顶的元素覆盖,并调整。保持堆里元素始终有k个,最终堆中剩余的k个元素即为前k最小的数。时间复杂度O(nlogk),空间复杂度为O(1)。

对于简单选择排序,求前k个数,需要遍历整个序列k次。时间复杂度为O(nk),空间复杂度为O(1)。

综上所述,堆排序和简单选择排序可用来求序列前10个最大的元素。

3.分析冒泡排序的最好情况和最坏情况性能。

答:冒泡排序的时间代价受记录的初始排列影响。

最好的情形是记录的初始排列已经按排序码的值从小到大排好序时,此算法只进行一趟冒泡,做n-1次排序码比较,不移动记录。

最坏情形是所有记录在一开始就已经按其排序码值逆序,这种情况算法执行n-1趟冒泡,第i趟做n-i次排序码比较,执行n-i次记录交换。在最坏情形下总的排序码比较次数KCN和记录移动次数RMN为:

KCN==*n*(n-1)

RMN==*n(n-1)

三、构造结果 [每小题10分,共50分]

1.已知一棵二叉树的先序遍历是ABDEGCF,中序遍历是DBGEACF,试画出这棵二叉树,并将其后序线索化。

答:该二叉树如下:

后序线索化:

2.给定权值{3,4,5,6,7,8,9},构建Huffman树,并计算其带权路径长度。

答:Huffman树如下:

带权路径长度WPL=2*(8+9)2+(7+5+6)*3+(3+4)*4=116

3.图的邻接表存储结构如图1所示。基于该存储结构,写出从V1点出发的深度遍历序列以及深度优先生成树,并给出该图的邻接矩阵存储方式。

图1 某图的邻接表存储结构

答:深度遍历序列:V1、V4、V3、V5、V2、V6。

深度优先生成树:

邻接矩阵:

4.对以下关键字序列建立哈希表: {19,13,20,21,23,27,26,30},哈希表长度为10,哈希函数为H(K)=关键字%7。用线性探测再散列解决冲突,计算在等概率情况下查找成功和不成功的平均查找长度。

答:建立哈希表如下:

查找成功的平均查找长度:ASLsucc=*(1+1+2+1+1+2+3+5)=2

查找不成功的平均查找长度:ASLunsucc=*(2+1+3+2+1+7+6)=

5.已知关键字集合:{19,13,20,11,23,27,16,30},分别写出简单选择排序和直接插入排序的前三趟排序结果。

答:简单选择排序:

{11,13,20,19,23,27,16,30}

{11,13,20,19,23,27,16,30}

{11,13,16,19,23,27,20,30}

直接插入排序:

{13,19,20,11,23,27,16,30}

{13,19,20,11,23,27,16,30}

{11,13,19,20,23,27,16,30}

四、编写算法 [每小题10分,共20分]

1.某顺序表中的元素为整型,设第一个元素为key。编写尽可能高效的算法,将小于等于key的元素全部放在其前面,大于key的元素全部放在其后面。

答:算法思想:可以利用快速排序的思想来对顺序表的元素进行分割

2.在二叉排序树中查找关键字为key的结点。若找到,返回该结点的地址;否则返回NULL。

答:算法思想:二叉排序树的结点左孩子值小于自己,右孩子值大于自己,设置一个指针p从根节点开始往下遍历,如果没有找到key,p就会走到叶子结点的左右孩子域返回的就是NULL,如果找到返回p指针所指的地址。

五、编写算法 [共15分]

对带头结点的单链表Head进行简单选择排序,排序后结点值从小到大排序。

答:算法思想:对链表就行简单选择排序,每趟找出当前待排序区间的最小结点与待排序区间第一个结点交换data值,已排序区间不断增大,直到排序完成。

六、编写算法 [共15分]

某有向图采用邻接表存储,编写算法输出该图的拓扑序列。

答:这里用广度优先遍历来实现,也可以用深度优先遍历,广度需要一个出边表,这里其实没有写到出边表的实现,所以这算一个伪代码,但是作为考试可以得满分。后面会给大家将算法题全部c++实现。

数据结构的考研,归根结底就是动手能力。理解透彻才能应用自如,数据结构没有偏题怪题,所有思想都是类似和相同的。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值