1.将一个10×10对称矩阵M的上三角部分的元素mij(1≤i≤j≤10)按列优先存入C语言的一维数组N中,元素m7,2在N中的下标是:
A.15
B.16
C.22
D.23
答案:C
解析:上三角矩阵列优先存储模式:先存储具有一个元素第一列,再存储具有两个元素的第二列,以此类推。m7,2说明1-6列均已存满,故此元素是第1+2+3+4+5+6+2个被存储单元。注意:C语言数组的下标从0开始,故m7,2在N中的下标为23-1=22,即 N[22]。
2.对空栈S进行Push和pop操作,入栈序列a,b,c,d,e经过Push, Push, Pop, Push, Pop, Push, Push,Pop操作后得到的出栈序列是:
A.b,a,c
B.b,a,e
C.b,c,a
D.b,c,e
答案:D
解析:a入、b入、b出,c入、c出,d入、e入、e出。出栈序列为b,c,e。
3.对与任意一棵高度为5且有10个节点的二叉树,若采用顺序存储结构保存,每个结点占1个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元数量至少是:
A.31
B.16
C.15
D.10
答案:A
解析:以顺序结构存储二叉树时,为了保证任意性,需按其对应的满二叉树方式存放,无对应满二叉树的结点空,有对应满二叉树的结点存储。高度为5的满二叉树需要的存储单元为2^5-1=31。
4、已知森林F及与之对应的二叉树T,若F的先根遍历序列是a,b,c,d,e,f,中根遍历序列是 b,a,d,f,e,c,则T的后遍历序列是:
A.b,a,d,f,e,c
B.b,d,f,e,c,a
C.b,f,e,d,c,a
D.f,e,d,c,b,a
答案:C
解析:由先根遍历序列a,b,c,d,e,f和中根遍历序列b,a,d,f,e,c可知,a为T的根,{b}为a的左子树结点,{dfec}为a的右子树结点。由先根遍历序列c,d,e,f和中根遍历序列d,f,e,c可知a的右子树为c,c的左子树中的结点有{d,e,f},右子树为空。由先根遍历序列d,e,f和中根遍历序列d,f,e可知c的左子树为d,d的左子树为空,右子树的结点有{e,f}。由先根遍历序列e,f和中根遍历序列f,e可知d的右子树为e,e的右子树为空,左子树的结点有{f}。所以,T的后遍历序列为:bfedca.
5.下列给定的关键字输入序列中,不能生成如下二叉排序树的是:
A. 4, 5, 2, 1, 3
B. 4, 5, 1, 2, 3
C. 4, 2, 5, 3, 1
D. 4, 2, 1, 3, 5
答案:B
解析:基本概念题。
6.修改递归方式实现的图的深度优先搜索(DFS)算法,将输出(访问)顶点信息的语句移到退出递归前(即执行输出语句后立刻退出递归)。采用修改后的算法遍历有向无环图G,若输出结果中包含G中的全部顶点,则输出的顶点序列是G的:
A.拓扑有序序列
B.逆拓扑有序序列
C.广度优先搜索序列
D.深度优先搜索序列
答案:B
解析:应该是DFS的逆序,排除C,D。再看A和B,假设有向图为a->b->c, 执行修改后的DFS,结果为c,b,a,排除A,则有B可选。
DFS是一个递归算法,在遍历的过程中,先访问的点被压入栈底。拓扑有序是指如果点U到点V有一条弧,则在拓扑序列中U—定在V之前,深度优先算法搜索路径恰恰是一条弧,栈的输出是从最后一个被访问点开始输出,最后一个输出的点是第一个被访问的点,所以是逆拓扑有序序列。关于这个题目的解析不是几句话能说清楚,请查看DFS与拓扑排序相关内容。
7.已知无向图G如下所示,使用克鲁斯卡尔(Kruskal)算法求图G的最小生成树,加入到最小生成树中的边依次是:
A.(b,f)(b,d)(a,e)(c,e)(b,e)
B.(b,f)(b,d)(b,e)(a,e)(e,c)
C.(a,e)(b,e)(c,e)(b,d)(b,f)
D.(a,e)(c,e)(b,e)(b,f)(b,d)
答案:A
解析:基本算法,送分题8 .若使 AOE 网估算工程进度则下列叙述中正确的是:A .关键路径是从原点到汇点边数最多的一条路径;B .关键路径是从原点到汇点路径长度最长的路径;C .增加任一关键活动的时间不会延长工程的工期;D .缩短任一关键活动的时间将会缩短工程的工期。 答案:B 解析:基本概念,送分题9 .下列关于大根堆(至少含2 个元素)的叙述中正确的是: I .可以将堆看成一颗完全二叉树;II .可采用顺序存储方式保存堆;III .可以将堆看成一棵二叉排序树;IV .堆中的次大值一定在根的下一层。 答案:I 、II 、IV 解析:基础概念题。堆( Heap )具有以下特点: 1 )完全二叉树 2 )存储的值是偏序,大根堆( Max-heap ):父节点的值大于或等于子节点的值,一般用数组(顺序结构)来表示堆10 .依次将关键字5 ,6 ,9 ,13 ,8 ,2 ,12 ,15 插入初始为空的4 阶B 树后,根节点中包含的关键字是:A .8B .6 ,9C .8 ,13D .9 ,12 答案:B 解析: B 树是一种平衡的多路搜索树,结点最大的孩子数目称为 B 树的阶。一个 m 阶 B 树具有如下属性: 1. 定义任意非叶子结点最多只有 M 个儿子;且 M>2 2. 根结点的儿子数为 [ 2 , M ] 3. 除根结点以外的非叶子结点的儿子数为 [ M/2, M ] 4. 每个结点存放至少 M/2-1 (取上整)和至多 M-1 个关键字;(至少 2 个关键字) 5. 非叶子结点的关键字个数 = 指向儿子的指针个数 -1 6. 非叶子结点的关键字: K[ 1 ], K[2 ], … , K[ M-1 ] ;且 K[ i ]< K[ i+1 ] 7. 非叶子结点的指针: P[ 1 ], P[2 ], … , P[ M ] ;其中 P[ 1 ] 指向关键字小于 K[ 1 ] 的子树, P[ M ] 指向关键字大于 K[ M-1 ] 的子树,其它 P[ i ] 指向关键字属于 (K[ i-1 ],K[ i ]) 的子树 8. 所有叶子结点位于同一层11 .对大部分元素已有序的数组进行排序时,直接插入排序比简单选择排序效率更高,其原因是:I .直接插入排序过程中元素之间的比较次数更少;II .直接插入排序过程中所需要的辅助空间更少;III .直接插入排序过程中元素的移动次数更少。A .IB .IIIC .I, IID .I, II, III 答案:A 解析:基础概念题。直接插入排序与简单选择排序相比: 1 )直接插入排序元素比较次数少 2 )简单选择排序移动的元素少 3 )均为就地排序,空间复杂度均为 O(1)18. 下列关于“自陷”(Trap ,也称陷阱)的叙述中错误的是:A .自陷是通过陷阱指令预先设定的一类外部中断事件;B .自陷可用于实现程序调试时的断点设置和单步跟踪;C .自陷发生后 CPU 将转去执行操作系统内核相应程序;D .自陷处理完成后返回到陷阱指令的下一条指令执行。 答案:A 解析:自陷是内中断23. 若多个进程共享同一个文件F ,则下列叙述中正确的是:A .多个进程只能用“读”方式打开文件 F ;B .在系统打开文件表中仅有一个表项包含F 的属性;C .各进程的用户打开文件表中关于F 的表项内容相同;D .进程关闭F 时系统删除F 在系统打开文件表中的表项。 答案:B 解析: A :各进程既可以用读方式打开文件 F ,也可用写方式打开文件 F B :系统打开文件表只有一张,正确 C :打开文件表关于同样一个文件的表项内容不一定相同 D :进程关闭 F 时会使 F 的引用计数 -1 ,引用计数 =0 时才会删除表项24. 下列选项中支持文件长度可变,随机访问的磁盘存储空间分配方式是:A .索引分配B .链接分配C .连续分配D .动态分区分配 答案:A 解析: B :链接分配不支持随机访问 C :连续分配不支持长度可变 D :动态分区分配是内存管理方式25. 下列与中断相关的操作中,由操作系统完成的是:I 、保存被中断程序的中断点;II 、提供中断服务;III 、初始化中断向量表;IV 、保存中断屏蔽字。A .I, IIB .I, II, IVC .III, IVD .II, III, IV 答案:D 解析:中断点的保存需要由软硬件保存寄存器内容、由硬件保存 PC 、由 OS 保存 PSW26. 下列与进程调度有关的因素中在设计多级反馈队列调度算法时需要考虑的是:I .就绪队列的数量;II. 就绪队列的优先级; III. 各就绪队列的调度算法; IV. 进程在就绪队列间的迁移条件A .I,IIB .III,IVC .II,III,IVD .I,II,III,IV 答案: D 解析:多级反馈队列调度算法是时间片轮转调度算法与优先级调度算法的综合与发展,需要综合考虑队列数量,优先级、调度算法及进程在队列间的迁移条件。27. 某系统中有A,B 两类资源各6 个,t 时刻资源分配及需求情况如下表所示。注:a,b,c是动态变化的,它们所属集合是变化的。比如;第一次时,a=-25∈S2,b=-1∈S1,c=2∈S3,在a所属集合中取下一个值为-10,此时a=-10∈S2,b=-1∈S1,c=2∈S3,再在a所属集合中取下一个值为10,此时a=-1∈S1,b=2∈S3,c=10∈S2。
(2)C/C++语言描述。int short_dis(int S1[],int len_s1, int S2[],int len_s2,int S3[],int len_s3) { int min_d = 0x7fffffff; int index_s1 = 0; int index_s2 = 0; int index_s3 = 0; while ((index_s1 int temp_s1 = S1[index_s1]; int temp_s2 = S1[index_s2]; int temp_s3 = S1[index_s3]; int d = abs(temp_s1-temps2)+ abs(temp_s2-temps3)+abs(temp_s1-temps3) if (d min_d = d; if (min_d == 0) break; } if (temp_s1 <= temp_s2 && temp_s1 <= temp_s3 ) index_a++; else if (temp_s2 <= temp_s1 && temp_s2 <= temp_s3 ) index_b++; else if (temp_s3 <= temp_s1 && temp_s2 <= temp_s2 ) index_c++; break; } return mid_d;}
(3) 假设3个集合的长度分别为L1,L2和L3,则算法的时间复杂度为O(L1+L2+L3)=O(max(L1,L2,L3),空间复杂度为O(1)。42.
若任一个字符的编码都不是其他字符编码的前缀,则称这种编码具有前缀特性。
现有某字符集(字符个数≥2
)的不等长编码,每个字符的编码均为二进制的0
,1
序列,最长为L
位,且具有前缀特性。请回答下列问题:
(1)哪种数据结构适宜保存上述具有前缀特性的不等长编码?
(2)基于你所设计的数据结构,简述从 0/1 串到字符串的译码过程;
(3)简述判定某字符集的不等长编码是否具有前缀特性的过程。
解答:(1) 送分题,哈夫曼树。
(2)译码过程:译码过程与编码一样需要使用哈夫曼树。译码过程为:自左向右逐一扫描码文,并从哈夫曼树的根开始,将扫描得到的二进制串中的码位与哈夫曼树分支上标的 0、 1 相匹配,以确定一条从根到叶子的路径,一旦达到叶子,则译出了一个字符;再回到树根,从二进位串的下一位开始继续译码 ,直到扫描码文结束。
(3)只需判定存储有字符信息的节点是否全部为叶子结点即可。若存储有某个字符信息的节点非叶子结点,即有子节点,那么它的0/1编码一定是它孩子节点0/1编码的前缀,违反了前缀特性。
45. 现有5 个操作A 、B 、C 、D 和E ,操作C 必须在A 和B 完成后执行,操作E 必须在C 和D 完成后执行,请使用信号量的wait(), signal() 操作(P 、V 操作)描述上述操作之间的同步关系,并说明所用信号量及其初值。 解答:本题送分题。--D--\
--A--\ >E
>--C---/
--B--/
A、B与C同步,C、D与E同步,设4个信号量a,b,c,d,其中a和b用于A、B与C同步,c和d用于C、D与E同步,它们的初值均为0。A、B、C、D和E的同步算法描述如下: A(){ A操作; V(a); } B(){ B操作; V(b); } C(){ p(a); p(b); C操作; V(c); } D(){ D操作; V(d); } E(){ p(c); p(d); E操作; }46. 某32 位系统采用基于二级页表的请求分页存储管理方式,按字节编址,页目录项和页表项长度均为4 字节,虚拟地址结构如下: