收藏 分享(赏)

2015福州大学863_数据结构与程序设计_模拟题3答案.doc

上传人:精品资料 文档编号:10706721 上传时间:2019-12-29 格式:DOC 页数:13 大小:947.50KB
下载 相关 举报
2015福州大学863_数据结构与程序设计_模拟题3答案.doc_第1页
第1页 / 共13页
2015福州大学863_数据结构与程序设计_模拟题3答案.doc_第2页
第2页 / 共13页
2015福州大学863_数据结构与程序设计_模拟题3答案.doc_第3页
第3页 / 共13页
2015福州大学863_数据结构与程序设计_模拟题3答案.doc_第4页
第4页 / 共13页
2015福州大学863_数据结构与程序设计_模拟题3答案.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、 模拟题三参考答案1 C。 【解析】考查时间复杂度。在程序中,执行频率最高的语句为“i=i*3”。设该基本语句一共执行了 k 次,根据循环结束条件,有 n2*3kn/3,由此可得算法的时间复杂度为 O(log3n)。2 A。 【解析】考查出入栈操作的性质。当 P1=3,表示 3 最先出栈,前面 1、2 应在栈中,此时若出栈操作,则 p2 应为 2;此时若进栈操作(进栈 1 次或多次),则 p2 为 4、5、n 都有可能,故选 A。3. B。 【解析】考查队列的应用。图的广度优先搜索类似于树的层序遍历(形象地想象成一个扇形,以搜索起点为中心,逐层向相连的外圈搜索),同样需要借助于队列。前序遍历二

2、叉树是一个递归的过程,通常可以借助于栈,将递归算法转换为非递归算法。图的深度优先搜索类似于树的前序遍历,也是一个递归的过程,通常也可以借助栈来实现。4 C。 【解析】考查平衡二叉树的性质。在平衡二叉树的结点最少情况下,递推公式为N0=0, N1=1, N2=2,Nh=1+Nh-1+Nh-2 (h 为平衡二叉树高度,Nh 为构造此高度的平衡二叉树所需最少结点数)。通过递推公式可得,构造 5 层平衡二叉树至少需 12 个结点,构造 6层至少需要 20 个。5 C。 【解析】考查二叉排序树的构造过程。画出三个选项 ABC 构造的二叉排序树的草图即可知道答案,C 和 AB 构造的树形不同;再画出最后一

3、个选项 D 构造的二叉排序树即可验证答案,D 和 AB 两项的相同。6 B。 【解析】考查几种特殊二叉树的特点。二叉判定树描述了折半查找的过程,肯定是高度平衡的,因此不可能是 A。对于 B,此图中所有结点的关键值均大于左子树中结点关键值, 且均小于右子树中所有结点的关键值,B 符合。对于 C,此图中存在不平衡子树,错误。对于 D,此图不符合小根堆或大根堆的定义。7 C。 【解析】考查哈夫曼树的构造。将 16 个权值相等(设为 m)的字母看成 16 个独立的结点;从中任选两个结点构成一棵新的二叉树(共 8 棵),新树的权值为 2m;再从 8 棵树中任选2 棵构成新的二叉树(共 4 棵),新树的权

4、值为 4m,如此继续,刚好能构成一棵满二叉树。8 C。 【解析】考查图的基本性质。强连通有向图的任何顶点到其他所有顶点都有路径,但未必有弧,A 错误。图与树的区别是逻辑上的,而不是边数的区别,图的边数也可能小于树的边数。若 E中的边对应的顶点不是 V中的元素时,则 V和E 无法构成图,D 错误。9 D。 【解析】考查邻接矩阵的定义。一个含有 n 个顶点和 e 条边的简单无向图的邻接矩阵为nn 矩阵,共有 n2 个元素,其中非零元素个数为 2e,则零元素个数为 n2-2e。10 D。 【解析】考查图的基本性质。n 个顶点构成连通图至少需要 n-1 条边(生成树),但若再增加 1 条边,则必然会构

5、成环。如果一个无向图有 n 个顶点和 n-1 条边,可以使它连通但没有环(即生成树),但再加一条边,在不考虑重边的情形下,就必然会构成环。11 C。 【解析】考查散列表的性质。不同冲突处理方法对应的平均查找长度是不同的,I 错误。散列查找的思想是通过散列函数计算地址,然后再比较关键字确定是否查找成功,II 正确。平均查找长度与填装因子(即表中记录数与表长之比)有关,III 错误。在开放定址的情况下,不能随便删除表中的某个元素(只能标记为删除状态),否则可能会导致搜索路径被中断,IV 错误。12C。 【解析】考查各种内部排序算法的性能。选择排序在最好、最坏、平均情况下的时间性能均为 O(n2),

6、归并排序在最好、最坏、平均情况下的时间性能均为 O(nlog2n)。各种排序方法对应的时间复杂度见下表。13C。 【解析】考查初始堆的建立。首先对以第 n/2 个结点为根的子树(也即最后一个结点的父结点为根的子树)筛选,使该子树成为堆,之后向前依次对各结点为根的子树进行筛选,直到筛选到根结点。14 A。 【解析】考查查折半查找的平均查找长度。假设有序表中元素为 A011,不难画出对它所对应的折半查找判定树如下图所示,圆圈是查找成功结点,方形是虚构的查找失败结点。从而可以求出查找成功的 ASL=(1+22+34+45)/12 =37/12,查找失败的 ASL=(33+410)/13。15B。 【

7、解析】考查快排过程。以 28 为基准元素,首先从后向前扫描比 28 小的元素,此元素位置为 L0,把此元素放到前面基准元素位置,而后再从前向后扫描比 28 大的元素,此元素位置 L1,并将其放到 L0 位置,从而得到了(5,16,L1,12,60,2,32,72)。而后继续重复从后向前扫描,记录找到的比 28 小的元素位置 L2,把此元素放到 L1,再从前往后扫描的操作找到比 28 大的元素,此元素位置 L3,并将其放到 L2 位置,直到扫描到相同元素,一趟排序完毕。最后得到(5,16,2,12)28(60,32,72).16.D 构造函数没有类型说明修饰符的,他是一类特殊的函数。函数名跟类名

8、一样。17. D。首先 A 肯定错的,int 表示整型,char 表示字符型,都不是答案。无返回值的话,就用 void 来修饰,表示返回类型是空的。18. B。复用不能派生出新的类,只有继承才可以派生新类,多继承和单继承都是继承,最佳答案是 B。19. C 。默认参数必须是从形参表的右边开始定义的,答案 C 违背了这个原则。20.B。回忆一下视频里面讲过的,虚基类之所以被提出来就是为了解决在一个多继承体系中,对于一个派生类多次继承于某个类,当调用某个继承而来的函数时,如果他的父类们都有这个函数,编译器不知道要调用哪个的问题。比如有一个类 D,他继承与 B 和 C,而 B 和 C 又继承于 A,

9、同时 A 里面有个函数叫 display,当我们调用 d.display 时,就有可能会出错,这时候就要考虑用虚基类了。21.B。B 之外的其他操作符都是逻辑操作符,这行代码,然后编译运行,发现程序很快就运行结束了。然后找到这个程序的 PE 文件,也就是 test.exe,对他进行反汇编。其中ebp-8就是变量 i。分析汇编代码mov dword ptrebp-8,0 /将 0 赋值给 iCmp dword ptrebp-8,0 /将 i 和 0 比较Je short 009F1386 /如果 i 和 0 相等则跳转到 009F1386 继续执行好了,分析完毕。跳转到 009F1386 也就是

10、 xor eax,eax 所在那行,程序再执行几行代码也就返回了。由此可以看出,程序没有跳入到循环体里面,也就是 009F137B009F1384 所在的代码,因此循环体没有被执行,循环 0 次。26.A。你会发现这道题在两份试卷里面都有,意思就是要让你分清楚 const 修饰函数和变量的区别。做个总结:指针使用 cosnt:(1)指针本身是常量不可变 (char*) const pContent;const (char*) pContent;(2)指针所指向的内容是常量不可变const (char) *pContent;(char) const *pContest;(3)两者都不可变cons

11、t char* const pContent;(4)还有其中区别方法,沿着*号划一条线:如果 const 位于*的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量;如果 const 位于*的右侧,const 就是修饰指针本身,即指针本身是常量。函数中使用 CONST(1)const 修饰函数参数a.传递过来的参数在函数内不可以改变(无意义,因为 Var 本身就是形参)void function(const int Var);b.参数指针所指内容为常量不可变void function(const char* Var);c.参数指针本身为常量不可变(也无意义,因为 char*

12、Var 也是形参)void function(char* const Var);d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:void function(const Class /引用参数在函数内不可以改变void function(const TYPE /引用参数在函数内为常量不可变27.A.比较简单,不解释了。28.B.经过编辑、编译、连接和运行四个步骤。编辑是将 C+源程序输入计算机的过程,保存文件名为 cpp。编译是使用系统提供的编译器将源程序 cpp 生成机器语言的过程,目标文件为 obj,由于没有得到系统分配的绝对地址,还不能直接运行。连接是将目标文件 obj转换为可执

13、行程序的过程,结果为 exe。运行是执行 exe,在屏幕上显示结果的过程。29.A。This 指针是隐藏的,比如说有一个类 A,那么他的对象比如说有 a,b,c。非常多,那么这些对象,每一个都有一个 this 指针,可以用来访问他们自己的成员变量。this 指针跟他的子类没有一毛钱关系,他的子类的对象有他们自己的 this 指针。30.C。首先要看懂这句 a=aa-,a-的返回值是 a 本身,-a 的返回值是(a-1)。剩下的没难度了,请自行分析。二、填空题1 继承,封装和多态性 2 C 3 包含头文件 4 10 5 0 解释:AB *a10= 7. 重载 虚函数 8. 抽象类 9. 13 1

14、0. delete ptr; 三、阅读程序1、13422.n=11n=12解析:int* pn=这句说明 pn 是个指针,并且他指向 n。int* 这句看起来比较复杂,我们可以这样理解,既然可以把 pn 的值赋值给 rn,那 rn 首先是个指针,而且是整型指针也就是 int*。然后看到 rn 的前面有(*rn)+;这两句实际上都在操作 n,因为他们都指向 n。3、A:a=1A:a=1A:a=1解析:其实这题就是看你对多态性质的理解。B 和 C 都继承于 A,并且都定义了各自的show 函数,所以 B,C 从 A 继承而来的 show 会被重写。然后定义了一个 A 类型的指针 p,分别用父类指针

15、 p 去指向 a,和他的子类对象 b,c。每次都调用一次 show(),但是实际上调用的都是 A 类的 show。原因在于指针 p 是 A 类型的,他只懂得到 A 类中去找 show 函数。其实这也是多态性质提出的原因,人们想通过父类指针来调用它真实对象的函数。在A 类的 show 函数中加上前缀 virtual 就形成多态了。答案也会变得不同。4、Constructor of CBase. m_data=abcdConstructor of CDerived. m_data =abcdDestructor of CBase. m_data=abcd解析:问题在于析构过程中只调用了基类的析构函

16、数。正确的析构应该是先执行 CDerived的析构函数,再执行 CBase 的析构函数。 在CBase()加上 virtual 关键字即可。四、算法设计题第一题解答第二题解答:(1)基本的基本设计思想: 设置二叉树的平衡标记balance ,以标记返回二叉树bt 是否为平衡二叉树,若为平衡二叉树,则返回1,否则返回0;h为二叉树bt 的高度。采用前序遍历的递归算法: 若bt为空,则高度为0,balance=1。 若bt仅有根结点,则高度为 1,balance=1。 否则,对 bt 的左、右子树执行递归运算,返回左、右子树的高度和平衡标记,bt 的高度为最高子树的高度加 1。若左、右子树的高度差

17、大于 1,则 balance=0;若左、右子树的高度差小于 1,且左、右子树都平衡时,balance=1,否则 balance=0。(2)算法的实现如下:void Judge_AVL(BiTree bt,int /左、右子树的平衡标记和高度 if(bt=NULL) /空树,高度为0 h=0; balance=1; else if(p-lchild=NULL balance=1; else Judge_AVL(bt-lchild,bl,hl);/递归判断左子树 Judge_AVL(bt-rchild,br,hr);/递归判断右子树 h=(hlhr?hl:hr)+1;if(abs(hl,hr)b,

18、则舍弃序列 A 中较大的一半,同时舍弃序列 B 中较小的一半,要求舍弃的长度相等。 在保留的两个升序序列中,重复过程 1)、2)、3),直到两个序列中只含一个元素时为止,较小者即为所求的中位数。(2) 算法的实现如下:(3) 算法的时间复杂度为 O(log2n),空间复杂度为 O(1)。预测题:解题思路-显然并查集了。思路可以很清晰的,一开始假设大家都各自信仰一个宗教,那么总的数目 ans 就是学生数目,每当发现有一对学生信仰同一个宗教,那么 ans-;1. #include 2. using namespace std; 3. 4. const int MAXN = 50005; /*结点数

19、目上线*/ 5. int paMAXN; /*px表示 x 的父节点*/ 6. int rankMAXN; /*rankx是 x 的高度的一个上界*/ 7. int n, ans; 8. 9. void make_set(int x) 10. /*创建一个单元集*/ 11. pax = x; 12. rankx = 0; 13. 14. 15. int find_set(int x) 16. /*带路径压缩的查找*/ 17. if(x != pax) 18. pax = find_set(pax); 19. return pax; 20. 21. 22. /*按秩合并 x,y 所在的集合*/

20、23. void union_set(int x, int y) 24. 25. x = find_set(x); 26. y = find_set(y); 27. if(x = y)return ; 28. ans-; /统计 29. if(rankx ranky)/*让 rank 比较高的作为父结点 */ 30. 31. pay = x; 32. 33. else 34. 35. pax = y; 36. if(rankx = ranky) 37. ranky+; 38. 39. 40. /answer to 2524 41. int main() 42. 43. int m, i, j = 1, x, y; 44. while(scanf(“%d%d“, 47. for(i = 1; i = n; i+) 48. make_set(i); 49. ans = n; 50. for(i = 0; i m; i+) 51. 52. scanf(“%d%d“, 53. union_set(x, y); 54. 55. printf(“Case %d: %dn“, j, ans); 56. j+; 57. 58. return 0; 59.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报