2022年计算机数据结构今年考研真题及答案 .pdf

上传人:Q****o 文档编号:25184608 上传时间:2022-07-10 格式:PDF 页数:23 大小:769.35KB
返回 下载 相关 举报
2022年计算机数据结构今年考研真题及答案 .pdf_第1页
第1页 / 共23页
2022年计算机数据结构今年考研真题及答案 .pdf_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《2022年计算机数据结构今年考研真题及答案 .pdf》由会员分享,可在线阅读,更多相关《2022年计算机数据结构今年考研真题及答案 .pdf(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、2009 1.为解决电脑与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是4.以下二叉排序树中,满足平衡二叉树定义的是5.已知一棵完全二叉树的第6 层设根为第 1 层有 8 个叶结点,则完全二叉树的结点个数最多是A.只有 II B.I 和 II C.I 和 III D.I、II 和 III 7.以下关于无向连通图特性的表达中,正确的选项是8.以下表达中,不符合m 阶 B 树定义要求的是9.已知关键序列 5,8,12,19,28,20,15,22 是小根堆最小堆,插入关键字 3,调整后得到的小

2、根堆是A3,5,12,8,28,20,15,22,19 B.3,5,12,19,20,15,22,8,28 C3,8,12,5,20,15,22,28,19 D.3,12,5,8,28,20,15,22,19 10.假设数据元素序列11,12,13,7,8,9,23,4,5 是采用以下排序方法之一得到的第二趟排序后的结果,则该排序算法只能是41.10 分带权图权值非负,表示边连接的两顶点间的距离的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假定从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:设最短路径初始时仅包含初始顶点,令当前顶点u 为初始顶点;选择离 u 最近且尚

3、未在最短路径中的一个顶点v,加入到最短路径中,修改当前顶点 u=v;重复步骤,直到u 是目标顶点时为止。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 23 页请问上述方法能否求得最短路径?假设该方法可行,请证明之; 否则,请举例说明。42.15 分已知一个带有表头结点的单链表,结点结构为假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k 个位置上的结点 k 为正整数。假设查找成功,算法输出该结点的data值,并返回 1;否则,只返回0。要求:1描述算法的基本设计思想2描述算法的详细实

4、现步骤3 根据设计思想和实现步骤, 采用程序设计语言描述算法 使用 C 或 C+或 JAVA 语言实现,关键之处请给出简要注释。2010 1、假设元素 a,b,c,d,e,f依次进栈,允许进栈、退栈操作交替进行。但不允许连续三次进行退栈工作,则不可能得到的出栈序列是A:dcebfa B:cbdaef C :dbcaef D :afedcb 2、某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,则不可能得到的顺序是A:bacde B :dbace C :dbcae D :ecbad 3、以下线索二叉树中用虚线表示线索,符合后序线索树定义的是4、在以下所示的平衡二叉树中插入关键字48 后

5、得到一棵新平衡二叉树, 在新平衡二叉树中, 关键字 37所在结点的左、 右子结点中保存的关键字分别是 A:13,48 B :24,48 C :24,53 D :24,90 5、在一棵度为 4 的树 T 中,假设有 20 个度为 4 的结点, 10 个度为 3 的结点,1 个度为 2 的结点, 10 个度为 1 的结点,则树 T 的叶节点个数是A:41 B :82 C :113 D :122 data link 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 23 页6、对 n(n 大于等于 2) 个权值均不相同的字符构成哈夫曼树,关于该

6、树的表达中,错误的选项是A:该树一定是一棵完全二叉树B:树中一定没有度为1 的结点C:树中两个权值最小的结点一定是兄弟结点D:树中任一非叶结点的权值一定不小于下一任一结点的权值7、假设无向图 G-V.E中含 7 个顶点,则保证图G在任何情况下都是连通的,则需要的边数最少是A:6 B :15 C :16 D :21 8、对以下图进行拓补排序,可以得到不同的拓补序列的个数是abcdeA:4 B :3 C :2 D :1 9、已知一个长度为 16 的顺序表 L,其元素按关键字有序排列,假设采用折半查找法查找一个不存在的元素,则比较次数最多是A:4 B :5 C :6 D :7 10、采用递归方式对顺

7、序表进行快速排序,以下关于递归次数的表达中,正确的选项是A:递归次数与初始数据的排列次序无关B:每次划分后,先处理较长的分区可以减少递归次数C:每次划分后,先处理较短的分区可以减少递归次数D:递归次数与每次划分后得到的分区处理顺序无关11、对一组数据 2,12,16,88,5,10进行排序,假设前三趟排序结果如下 第一趟: 2,12,16,5,10,88 第二趟: 2,12,5,10,16,88 第三趟: 2,5,10,12,16,88 则采用的排序方法可能是:A:起泡排序 B :希尔排序 C :归并排序 D :基数排序问题: 1请画出所构造的散列表;2分别计算等概率情况下, 查找成功和查找不

8、成功的平均查找长度。42.13 分设将 n(n,1) 个整数存放到一维数组R 中,试设计一个在时间和空间两方面尽可能有效的算法, 将 R中保有的序列循环左移P 0Pn 个位置,即将 R 中的数据由 X0X1 Xn-1变换为 XpXp+1 Xn-1X0X1 Xp-1要求:1给出算法的基本设计思想。2根据设计思想,采用 C或 C+ 或 JAVA语言表述算法关键之处给出注释。3说明你所设计算法的时间复杂度和空间复杂度2011 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 23 页1. 设 n 是描述问题规模的非负整数,下面程序片段的时间复杂

9、度是x = 2; while ( x n/2 ) x = 2*x; A.O(log2n) B.O(n) C.O(n log2n) D.O(n2) 3. 已知循环队列存储在一维数组A0.n-1 中, 且队列非空时 front和rear分别指向队头元素和队尾元素。 假设初始时队列为空, 且要求第 1 个进入队列的元素存储在 A0 处,则初始时 front和 rear 的值分别是A.0, 0 B.0, n-1 C.n-1, 0 D.n-1, n-1 4. 假设一棵完全二叉树有768 个结点,则该二叉树中叶结点的个数是5. 假设一棵二叉树的前序遍历序列和后序遍历序列分别为1, 2, 3, 4和 4,

10、3, 2, 1,则该二叉树的中序遍历序列不会是A.1, 2, 3, 4 B.2, 3, 4, 1 C.3, 2, 4, 1 D.4, 3, 2, 1 6. 已知一棵有 2011 个结点的树,其叶结点个数为116,该树对应的二叉树中无右孩子的结点个数是7. 对于以下关键字序列, 不可能构成某二叉排序树中一条查找路径的序列是A.95, 22, 91, 24, 94, 71 B.92, 20, 91, 34, 88, 35 C.21, 89, 77, 29, 36, 38 D.12, 25, 71, 68, 33, 34 8. 以下关于图的表达中,正确的选项是I. 回路是简单路径II. 存储稀疏图,

11、用邻接矩阵比邻接表更省空间III.假设有向图中存在拓扑序列,则该图不存在回路A.仅 II B.仅 I 、II C.仅 III D.仅 I 、III 9. 为提高散列 (Hash) 表的查找效率,可以采取的正确措施是I. 增大装填 ( 载) 因子II. 设计冲突 (碰撞) 少的散列函数III.处理冲突 (碰撞) 时防止产生聚集 ( 堆积) 现象A.仅 I B.仅 II C.仅 I 、II D.仅 II 、III 10. 为实现快速排序算法,待排序序列宜采用的存储方式是11. 已知序列 25, 13, 10, 12, 9是大根堆,在序列尾部插入新元素18,将其再调整为大根堆,调整过程中元素之间进行

12、的比较次数是41.(8 分)已知有 6 个顶点 (顶点编号为 0 5) 的有向带权图 G ,其邻接矩阵A 为 上 三 角 矩 阵 , 按 行 为 主 序 ( 行 优 先 ) 保 存 在 如 下 的 一 维 数 组 中 。要求: (1) 写出图 G的邻接矩阵 A。(2) 画出有向带权图 G 。(3) 求图 G的关键路径,并计算该关键路径的长度。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 23 页42.(15 分) 一个长度为 L(L1) 的升序序列 S,处在第 L/2 个位置的数称为S的中位数。例如,假设序列S1=(11, 13, 1

13、5, 17, 19),则 S1的中位数是 15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如, 假设 S2=(2, 4, 6, 8, 20),则 S1和 S2的中位数是 11。现有两个等长升序序列A和 B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和 B的中位数。要求:(1) 给出算法的基本设计思想。(2) 根据设计思想,采用 C或 C+ 或 JAVA语言描述算法, 关键之处给出注释。(3) 说明你所设计算法的时间复杂度和空间复杂度。2012 1、求整数 n(n0)阶乘的算法如下,其时间复杂度是() intfact(intn) if(n=1)return1; r

14、eturnn*fact(n-1); A.O(log2n) B.O(n) C.(nlog2n) D.O(n2) 2、已知操作符包括 +、 -、*、/、 (和)。将中缀表达式 a+b-a*(c+d)/e-f)+g 转换为等价的后缀表达式ab+acd+e/f-*-g+时, 用栈来存放暂时还不能确定运算次序的操作符,假设栈初始时为空, 则转换过程中同时保存栈中的操作符的最大个数是() 3、假设一颗二叉树的前序遍历序列为a,e,b,d,c ,后续遍历序列为b,c,d,e,a ,则根节点的孩子节点 () 4、假设平衡二叉树的高度为6,且所有非叶节点的平衡因子均为1,则该平衡二叉树的节点总数为 () 5、对

15、有 n 个节点、 e条边且使用邻接表存储的有向图进行广度优先遍历,其算法时间复杂度 () A.O(n) B.O(e) C.O(n+e) D.O(n*e) 6、假设用邻接矩阵存储有向图,矩阵中主对角线以下的元素均为零,则关于该图拓扑序列的结构是() A.存在,且唯一B.存在,且不唯一7、如下有向带权图,假设采用迪杰斯特拉Dijkstra算法求源点 a 到其他各顶点的最短路径,得到的第一条最短路径的目标顶点是b,第二条最短路径的目标顶点是 c,后续得到的其余各最短路径的目标顶点依次是() A.d,e,f B.e,d,f C.f,d,e D.f,e,d 精选学习资料 - - - - - - - -

16、- 名师归纳总结 - - - - - - -第 5 页,共 23 页8、以下关于最小生成树的说法中,正确的选项是() 、最小生成树的代价唯一、所有权值最小的边一定会出现在所有的最小生成树中、使用普里姆 Prim算法从不同顶点开始得到的最小生成树一定相同、使用普里姆算法和克鲁斯卡尔Kruskal算法得到的最小生成树总不相同、9、已知一棵 3 阶 B-树,如以下图所示。删除关键字78 得到一棵新 B-树,其最右叶结点中的关键字是() B.60,62 C.62,65 10、在内部排序过程中, 对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。以下排序方法中, 每一趟排序结束都至少能够确定一个元素

17、最终位置的方法是 () .简单项选择择排序.希尔排序.快速排序.堆排序.二路归并排序、11对一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是 () 二、问答题。41、10分设有 6 个有序表 A、B、C、D、E、F,分别含有 10、35、40、50、60 和 200个数据元素,各表中元素按升序排列。要求通过5 次两两合并,将 6 个表最终合并成 1 个升序表,并在最坏情况下比较的总次数到达最小。请答复以下问题。1给出完整的合并过程,并求出最坏情况下比较的总次数。2根据你的合并过程,描述N(N2)个不等长升序表的合并策略,并说明理由。42、13分假定采用带头结点的单链表保

18、存单词,当两个单词有相同的后时缀,则可共享相同的后缀存储空间,例如,“loaging”和“ being”,如以下图所示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 23 页设 str1 和 str2 分别指向两个单词所在单链表的头结点,链表结点结构为data,next ,请设计一个时间上尽可能高效的算法,找出由str1 和 str2 所指向两个链表共同后缀的起始位置如图中字符i 所在结点的位置 p。要求:1给出算法的基本设计思想。2 根据设计思想,采用 C 或 C+或 java 语言描述算法关键之处给出注释。3说明你所设计算法的时复

19、杂度。2013 1. 已知两个长度分别为m 和 n 的升序链表,假设将它们合并为一个长度为m+n 的降序链表,则最坏情况下的时间复杂度是A. O(n) B. O(m*n) C. O(min(m,n) D. O(max(m,n) 2. 一个栈的入栈序列为1, 2,3, ,n , 其出栈序列是p1, p2, p3, pn 。 假设 p2 = 3,则 p3 可能取值的个数是 : A. n-3 B. n- 2 C. n-1 D. 无法确定3. 假设将关键字1,2,3,4,5,6,7 依次插入到初始为空的平衡二叉树T 中,则 T 中平衡因子为 0 的分支结点的个数是A. 0 B. 1 C. 2 D. 3

20、 4. 已知三叉树 T 中 6 个叶结点的权分别是2,3,4,5,6,7,T 的带权外部路径长度最小是A. 27 B. 46 C. 54 D. 56 5. 假设 X 是后序线索二叉树中的叶结点, 且 X 存在左兄弟结点 Y, 则 X 的右线索指向的是A. X 的父结点B. 以 Y 为根的子树的最左下结点C. X 的左兄弟结点 Y D. 以 Y 为根的子树的最右下结点6. 在任意一棵非空二叉排序树T1 中,删除某结点v 之后形成二叉排序树T2,再将 v 插入 T2 形成二叉排序树 T3。以下关于 T1 与 T3 的表达中,正确的选项是I. 假设 v 是 T1 的叶结点,则 T1 与 T3 不同I

21、I. 假设 v 是 T1 的叶结点,则 T1 与 T3 相同III. 假设 v 不是 T1 的叶结点,则 T1 与 T3 不同IV. 假设 v 不是 T1 的叶结点,则 T1 与 T3 相同A. 仅 I、III B. 仅 I、IV C. 仅 II、III D. 仅 II、IV 7. 设图的邻接矩阵 A 如下所示。各顶点的度依次是精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 23 页A. 1,2,1,2 B. 2,2,1,1 C. 3,4,2,3 D. 4,4,2,2 8. 假设对如下无向图进行遍历,则以下选项中,不是广度优先遍历序列的

22、是A. h,c,a,b,d,e,g,f B. e,a,f,g,b,h,c,d C. d,b,c,a,h,e,f,g D. a,b,c,d,h,e,f,g 9、以下的 AOE 网表示一项包含 8 个活动的工程。 通过同时加快假设干活动的进度可以缩短整个工程的工期。以下选项中,加快其进度就可以缩短整个工程的工期的是:A c 和 e B d 和 e C f 和 d D f 和 h 10、在一棵高为 2 的 5 阶 B 树中,所含关键字的个数最少是A 5 B 7 C 8 D14 A= ( 0 ,5,5,3,5,7,5,5 ) ,侧 5 为主元素;又如A= ( 0 ,5,5,3,5,1,5,7 ),则A

23、 中没有主元素。假设A 中的 n个元素保存在一个一维数组中,请计一个尽可能高效的算法,找出A 的主元素。假设存在主元素,则输出该元素;否则输出 -1。要求:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 23 页1给出算法的基本设计思想。2根据设计思想,采用C 或 C+或 Java语言描述算法,关键之处给出释。3说明你所设计算法的时间复杂度和空间复杂度。42.10分设包含4 个数据元素的集合S= do,for, repeat , while,各元素查找概率依次为: ,p3=0. 15 ,。将S保存在一个长度为4 的顺序表中,采用折半查找

24、法,查找成功时的平均查找长度为。请答复:1假设采用顺序存储结构保存 S,且要求平均查找长度更短,则元素应如何排列?应使用何种查找方法?查找成功时的平均查找长度是多少?2假设采用链式存储结构保存 S,且要求平均查找长度更短,则元素应如何排列?应使用何种查找方法?查找成功时的平均查找长度是多少?2014 1. 以下程常段的时间复杂度是count=0; for(k=1;k=n;k*=2) for(j=1;j=n;j+1) count+; A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2) 2. 假设栈初始为空, 将中缀表达式 abcdefg 转换为等价后缀表达式的过程中,当扫

25、描到f 时,栈中的元素依次是AB. C. D. 3. 循环两列放在一维数组A0M-1 中,end1指向队头元素, end2指向队尾元素的后一个位置。 假设队列两端均可进行入队和出队操作,队列中最多能容纳 M-1 个元素。初始时为空,以下判断队空和队满的条件中,正确的选项是A.队空: end1=end2 ;队满: end1=(end2+1)modM B.队空: end1=end2; 队满: end2=(end1+1)mod(M-1) C.队空: end2=(end1+1)modM ; 队满: end1=end2+1modM D.队空: end1=end2+1modM; 队满: end2=(end

26、1+1)mod(M-1) 4. 假设对如下的二叉树进行中序线索化,则结点x 的左、右线索指向的结点分别是A.e,c B.e,a C.d,c D.b,a 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 23 页5. 将森林 F 转换为对应的二叉树T,F 中叶结点的个数等于A.T 中叶结点的个数B.T 中度为 1 的结点个数6. 5个字符有如下 4 种编码方案,不是前缀编码的是A.01,0000,0001,001,1 B.011,000,001,010,1 C.000,001,010,011,100 D.000,001,010,011,10

27、0 7. 对如下所示的有向图进行拓扑排序,得到的拓扑序列可能是A.3,1,2,4,5,6 B.3,1,2,4,6,5 C.3,1,4,2,5,6 D.3,1,4,2,6,5 8. 用哈希散列方法处理冲突碰撞时可能出现堆积聚集现象,以下选项中,会受堆积现象直接影响的是A.存储效率B.数列函数9.在一棵具有 15个关键字的 4 阶 B 树中,含关键字的结点数最多是10. 用希尔排序方法对一个数据序列进行排序时,假设第1 趟排序结果为9,1,4,13,7,8,20,23,15 ,则该趟排序采用的增量间隔可能是11. 以下选项中,不可能是快速排序第2 趟排序结果的是A.2,3,5,4,6,7,9 B.

28、2,7,5,6,4,3,9 C.3,2,5,4,7,6,9 D.4,2,3,5,7,6,9 41.13 分二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和,给定一棵二叉树T,采用二叉链表存储,节点结构为:b d x e a c 1 2 5 4 6 3 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 23 页其中叶节点的 weight 域保存该结点的非负权值。设root 为指向 T 的根节点的指针,设计求 T 的 WPL 的算法。要求:1给出算法的基本设计思想;2使用 C 或 C+语言,给出二叉树结点的数据类型定义;3根

29、据设计思想,采用C 或 C+语言描述算法,关键之处给出注释。2015 1已知程序如下:int s(int n) return (n=0) ? 0 : s(n-1) +n; void main() coutS(1)-S(0) BS(0)-S(1)-main() Cmain()-S(0)-S(1) DS(1)-S(0)-main() 2先序序列为a,b,c,d的不同二叉树的个数是A13 B14 C 15 D 16 3 以下选项给出的是从根分别到达两个叶节点路径上的权值序列,能属于同一棵哈夫曼树的是A24,10,5 和 24,10,7 B 24 ,10 ,5 和 24 ,12 ,7 C24 ,10

30、,10和 24,14,1 1 D 24,10,5 和 24,14,6 4现在有一颗无重复关键字的平衡二叉树 AVL树,对其进行中序遍历可得到一个降序序列。以下关于该平衡二叉树的表达中,正确的选项是A根节点的度一定为2 B树中最小元素一定是叶节点C最后插入的元素一定是叶节点D树中最大元素一定是无左子树5 设有向图G=(V,E) , 顶点集V=V0,V1,V2,V3, 边集 E=,,, 假设从顶点 V0 开始对图进行深度优先遍历,则可能得到的不同遍历序列个数是A2 B3 C 4 D 5 6求下面带权图的最小代价生成树时,可能是克鲁斯卡 kruskal 算法第二次选中但不是普里姆 Prim算法从 V

31、4 开始第2 次选中的边是 A(V1,V3) B(V1,V4) C(V2,V3) D(V3,V4) left weight right 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 23 页7以下选项中,不能构成折半查找中关键字比较序列的是A500,200,450 ,180 B 500 ,450,200,180 C180 ,500,200,450 D180,200 ,500 ,450 8已知字符串S 为“abaabaabacacaabaabcc ”.模式串t 为“abaabc”,采用 KMP算法进行匹配,第一次出现“ 失配”(si

32、!= ti) 时,i=j=5,则下次开始匹配时, i 和 j 的值分别是Ai=1,j=0 B i=5,j=0 C i=5,j=2 Di=6,j=2 9以下排序算法中元素的移动次数和关键字的初始排列次序无关的是A直接插入排序 B起泡排序C基数排序 D快速排序10已知小根堆为8,15,10,21,34,16,12,删除关键字8 之后需重建堆,在此过程中,关键字之间的比较数是A1 B2 C 3 D 4 11希尔排序的组内排序采用的是A直接插入排序 B折半插入排序 C快速排序 D归并排序41. 用单链表保存m 个整数,节点的结构为(data,link),且|data|=2)个顶点的邻接矩阵为B 则,B

33、m(2=mlink; /*p 和 q 指向链表表头结点的下一个结点*/ while(p!=NULL) if(countlink;/*q 移到下一个结点 */ p=p-link; /*p 移到下一个结点 */ if(countdata); /* 查找成功 */ return (1);/else/SearchN 2010 1-5:DCDCB 6-11:ACBBDA 41.1构造的散列表如下下标0123456789关键字714811301892查找成功的平均查找长度:ASL 成功=12/7。查找不成功的平均查找长度:ASL 不成功 =18/7。42. 1 给出算法的基本设计思想: 先将 n 个数据

34、x0 x1xpxn-1 原地逆置,得到 xn-1xpxp-1x0,然后再将前 n-p 个和后 p 个元素分别原地逆置, 得到最终结果:xpxp+1xn-1x0 x1xp-1。2算法实现:void reverse(int r,int left,int right) int k=left,j=right,temp; /k 等于左边界 left,j 等于右边界 right while(k0&pn) reverse(r,0,n-1);/ 将全部数据逆置reverse(r,0,n-p-1);/ 将前 n-p 个元素逆置reverse(r,n-p,n-1);/ 将后 p 个元素逆置 3说明算法复杂性:上述

35、算法的时间复杂度为O(n),空间复杂度为 O(1)。2011 1-5:ABBCC 6-10:DACBA 41.高分笔记图最后一题42.(1)算法的基本设计思想: (5 分) 1) 比较笨的方法:将两升序序列归并排序,然后求其中位数,时间复杂度精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 23 页是 O(n),空间复杂度 O(n)。2) 高效的方法:分别求两个升序序列A 和 B 的中位数,设为 a 和 b。如果 a=b,则 a或者 b 即为所求的中位数。原因:如果将两序列归并排序,则最终序列中,排在子序列ab 前边的元素为先前两序列中

36、排在a和 b 前边的元素 ;排在子序列 ab后边的元素为先前两序列a和 b 后边的元素。所以子序列ab一定位于最终序列的中间,有因为a=b,显然a就是中位数。如果 ab(假设 a 原因:同样可以用归并排序后的序列来验证,归并后排序后必然有形如ab的序列出现,中位数必然出现在(a,b)范围内。因此可以做如下处理:舍弃 a 所在序列 A 之中比较小的一半,同时舍弃 b 所在序列 B 之中比较大的一半。在保留的两个升序序列中求出新的中位数a 和 b,重复上述过程, 直到两个序列只含一个元素为止,则较小者即为所求中位数。(2)算法实现 (高效方法 ):(8 分) int Search(int A, i

37、nt B, int n) int s1,e1,mid1,s2,e2,mid2; s1=0;e1=n-1;s2=1;e2=n-1; while(s1!=e1|s2!=e2) mid1=(s1+e1)/2; mid2=(s2+e2)/2; if(Amid1=Bmid2) return Amid1; if(Amid1len2) longList=L1-next; shortlist=L2-next; L=len1-len2;/表长之差 /if else longList=L2-next; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 23

38、 页 shortlist=L1-next; L=len2-len1;/表长之差 /else While(L-) longList=longList-next; while(longList!=NULL) if(longList=shortList)/同步寻找共同结点 return longList; else longList=longList-next; shortlist=shortlist-next; /else /while return NULL; /Search_First_Common 3算法的时间复杂度为O(len1+len2),空间复杂度为O(1) 。2013 1-5:DCD

39、BA 6-10:CCDCA 41. 1给出算法的基本设计思想: 4 分算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元素Num。然 后重新计数, 确认Num是否是主元素。算法可分为以下两步: 选取候选的主元素:依次扫描所给数组中的每个整数,将第一个遇到的整数Num保存到 c中记录 Num的出现次数为1; 假 设 遇到的 下 一 个整 数仍 等于Num 则计数加一,否则计数减一;当计数减到0 时,将遇到的下一个整数保存到c中,计数重新记为1,开始新一轮计数,即从当前位置开始重复上述过程,直到扫描完全部数组元素。判断 c中元素是否是真正的主元素:再次扫描该数组,统计 c中元素出现的次

40、数,假设大于n/2,则为主元素;否则,序列中不存在主元素。2算法实现:7 分int Majority ( int A , int n ) int i, c, count=1; / / c 用来保存候选主元素,count用来计数 c = A0; / / 设置 A0 为候选主元素for ( i=1; i 0) count-;/ / 处理不是候选主元素的情况else / / 更换候选主元素,重新计数 c = Ai; count = 1; /else /forif ( count0 )for ( i=count=0; i n/2 ) return c; / / 确认候选主元素else return -

41、1; / / 不存在主元素/Majority42.1采用顺序存储结构,数据元素按其查找概率降序排列。2 分采 用 顺序 查 找 方 法 。 1 分 查 找 成 功 时 的 平 均 查 找 长 度 = 。 2分2 【答案一】采用链式存储结构, 数据元素按其查找概率降序排列, 构成单链表。2 分采用顺序查找方法。1 分查找成功时的平均查找长度。2 分 【答案二】 采用二叉链表存储结构,构造二叉排序树,元素存储方式见以下图。2 分2014 1-5:CBADC 6-11:DDDDBC 41 解答:考查二叉树的带权路径长度,二叉树的带权路径长度为每个叶子结点的深度与权值之积的总和,可以使用先序遍历或层次

42、遍历解决问题。1算法的基本设计思想:基于先序递归遍历的算法思想是用一个static变量记录wpl ,把每个结点的深度作为递归函数的一个参数传递,算法步骤如下:假设该结点是叶子结点,那么变量 wpl 加上该结点的深度与权值之积;假设该结点非叶子结点,那么假设左子树不为空,对左子树调用递归算法,假设右子树不为空,对右子树调用递归算法,深度参数均为本结点的深度参数加一;最后返回计算出的wpl 即可。基于层次遍历的算法思想是使用队列进行层次遍历,并记录当前的层数,当遍历到叶子结点时,累计wpl;当遍历到非叶子结点时对该结点的把该结点的子树加入队列;当某结点为该层的最后一个结点时,层数自增1;队列空时遍

43、历结束,返回 wpl 2)二叉树结点的数据类型定义如下:typedef struct BiTNode 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 23 页int weight; struct BiTNode *lchild,*rchild; BiTNode,*BiTree; 3)算法代码如下:基于先序遍历的算法:intWPL(BiTreeroot) return wpl_PreOrder(root,0); /int intwpl_PreOrder(BiTreeroot,intdeep) static int wpl=0;/定义一个

44、 static变量存储 wpl if(root-lchild= =NULL&root-lchild=NULL)/假设为叶子结点, 累积 wpl wpl+=deep*root-weight; if(root-lchild!=NULL)/ 假设左子树不空,对左子树递归遍历wpl_PreOrder(root-lchild,deep+1); if(root-rchild!=NULL)/ 假设右子树不空,对右子树递归遍历wpl_PreOrder(root-rchild,deep+1); return wpl; /wpl_PreOrder 基于层次遍历的算法:#defineMaxSize100 /设置队列

45、的最大容量int wpl_LevelOrder(BiTree root) BiTree qMaxSize; /声明队列, end1为头指针, end2为尾指针int end1, end2; /队列最多容纳 MaxSize-1 个元素end1=end2=0; /头指针指向队头元素,尾指针指向队尾的后一个元素int wpl=0, deep=0; /初始化 wpl 和深度BiTree lastNode; /lastNode用来记录当前层的最后一个结点BiTree newlastNode; /newlastNode用来记录下一层的最后一个结点lastNode=root; /lastNode初始化为根节

46、点newlastNode=NULL; /newlastNode初始化为空qend2+=root; /根节点入队while(end1!=end2) /层次遍历,假设队列不空则循环BiTree t=qend1+; / 拿出队列中的头一个元素if(t-lchild=NULL&t-lchild=NULL) wpl+ =deep*t-weight; /假设为叶子结点,统计wpl 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 23 页if(t-lchild!=NULL) /假设非叶子结点把左结点入队qend2+=t-lchild; newlas

47、tNode=t-lchild; /并设下一层的最后一个结点为该结点的左结点if(t-rchild!=NULL) /处理叶节点qend2+=t-rchild; newlastNode=t-rchild; /if if(t=lastNode)/ 假设该结点为本层最后一个结点,更新lastNode lastNode=newlastNode; deep+=1; /层数加 1 /if /while return wpl; /返回 wpl /wpl_LevelOrder 注意:上述两个算法一个为递归的先序遍历,一个为非递归的层次遍历,读者应当选取自己最擅长的书写方式。直观看 去, 先序遍历代码行数少 ,

48、不用运用其他工具, 书写也更容易,希望读者能掌握。 在先序遍历的算法中, static是一个静态变量,只在首次调用函数时声明wpl 并赋值为 0,以后的递归调用并不会使得wpl 为0,具体用法请参考相关资料中的static关键字说明,也可以在函数之外预先设置一个全局变量, 并初始化。不过考虑到历年真题算法答案通常都直接仅仅由一个函数构成,所以参考答案使用static 。假设对 static不熟悉的同学可以使用以下形式的递归:int wpl_PreOrder(BiTree root,intdeep) int lwpl, rwpl; /用于存储左子树和右子树的产生的wpl lwpl=rwpl=0;

49、 if(root-lchild= =NULL&root-lchild=NULL) /假设为叶子结点,计算当前叶子结点的wpl return deep*root-weight; if(root-lchild!=NULL) /假设左子树不空,对左子树递归遍历lwpl=wpl_PreOrder(root-lchild,deep+1); if(root-rchild!=NULL) /假设右子树不空,对右子树递归遍历rwpl=wpl_PreOrder(root-rchild,deep+1); return lwpl+rwpl; /wpl_PreOrder 精选学习资料 - - - - - - - - -

50、 名师归纳总结 - - - - - - -第 21 页,共 23 页C/C+语言基础好的同学可以使用更简便的以下形式:int wpl_PreOrder(BiTree root,int deep) if(root-lchild= =NULL&root-lchild=NULL) / 假设为叶子结点,累积wpl return deep*root-weight; return(root-lchild!=NULL?wpl_PreOrder(root-lchild,deep+1):0)+ (root-rchild!=NULL?wpl_PreOrder(root-rchild,deep+1):0); /wp

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com