2011年山东科技大学数据结构与操作系统--真题及参考答案.docVIP

2011年山东科技大学数据结构与操作系统--真题及参考答案.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2011年山东科技大学数据结构与操作系统--真题及参考答案.doc

《数据结构》部分 4、请比较普里姆算法与克鲁斯卡尔算法解决图最小生成树问题的时间复杂度。(课本P175) (最小生成树:P173;普里姆算法P173;克鲁斯卡尔算法P175) 答:普里姆算法的时间复杂度为O(n2)(假设网中有n个顶点),与网中的边数无关,因此适用于求边稠密的网的最小生成树。 而克鲁斯卡尔算法恰恰相反,它的时间复杂度为O(eloge)(e为网中边的数目),因此它相对于普里姆算法而言,适合于求边稀疏的网的最小生成树。 二、应用题(50 分) 1、已知二叉树的前序遍历、中序遍历的结果分别是: ABDEFGCHIJ 和 DBFEGAHCIJ,请画出对应的二叉树,给出后序遍历的结果,并将它转换成等价的树或森林。( 10 分) (二叉树的前序遍历、中序遍历P128;树P137;森林P138) 答: 2、某带权有向图及它的邻接表如下: (1)试写出它的深度优先搜索序列。(深度优先搜索P167;邻接表P163;广度优先搜素P169) 答:A--B--D--C--F--E--G--H(提示:不要画图,直接根据邻接表画) (2)根据普里姆(Prim)算法,求它的从顶点 A 出发的最小生成树。( 10 分)(普里姆算法P173;克鲁斯卡尔算法P175) 答:(没有有向图,也就没权重,没法做,领会精神) 3、画出向小顶堆中加入数据 4, 2, 5, 8, 3, 6, 10, 1 时,每加入一个数据后堆的变化。( 15 分) (堆P280;) 4. 一组关键字集合为(25,10,8,27,32,68),设哈希函数 H(k)=k mod 7,分别用线性探测和链地址法两种解决冲突的方法构造长度为 8 的哈希表,要求画出具体的哈希表并求查找成功且等概率情况下各自的平均查找长度。 (15 分)(线性探测和链地址法两种解决冲突的方法P257和P258;平均查找长度P260) 答:哈希表如下: 线性探测平均查找长度:(1*4+2*1+3*1)/6=9/6 链地址法平均查找长度:(1*5+2*1)/6=7/6 三、算法设计题(30 分) 答题要求: ①用自然语言说明所采用算法的思想; ②给出每个算法所需的数据结构定义,并做必要说明; ③用C语言写出对应的算法程序,并做必要的注释。 1 、已知一个带表头结点的单链表,结点的结构为假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找该链表中倒数第 k 个位置上的结点( k 为正整数)。查找成功,输出结点的 data 值,并返回 1 ;否则,只返回 0。 (15 分)(单链表P27;单链表c语言结构定义P28) 【解析】本题详细解析如下: (1)算法的基本设计思想:问题的关键是设计一个尽可能高效的算法,通过链表的一趟 遍历,找到倒数第k个结点的位置。算法的基本设计思想是:定义两个指针变量p和q,初始 时均指向头结点的下一个结点(链表的第一个结点)。p指针沿链表移动;当p指针移动到第 k个结点时,q指针开始与p指针同步移动;当p指针移动到最后一个结点时,q指针所指示结 点为倒数第k个结点。以上过程对链表仅进行一遍扫描。 (2)算法的详细实现步骤: ①count=0,p和q指向链表表头结点的下一个结点; ②若p为空,转⑤; ③若count等于k,则q指向下一个结点;否则,count=count+1; ④p指向下一个结点,转②; ⑤若count等于k,则查找成功,输出该结点的data域的值,返回1;否则,说明k值超过 了线性表的长度,查找失败,返回0; ⑥算法结束。 (3)算法实现: typedef struct Node{ ElemType data; struct Node *next; } *Pointer; Pointer LinkList; int Search_k(Pointer list, int k) //查找链表list倒数第k个结点,并输出该结点data域的值 { p = list-next; q = list-next; //指针p、q指示第一个结点 int count = 0; while (p!=NULL) { //遍历链表直到最后一个结点 if (countk) count++; //计数,若countk只移动p else q = q-next; p = p-next; //之后让p、q同步移动 } //while if (countk) return 0; //查找失败返回0 else { //否则打印并返回1 printf (%d, q-data); return 1; } } //Search_k 提示:算法程序题,如果能够写出数据结构类型定义、正确的算法思想都会至少给一半

文档评论(0)

三哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档