中国科学院软件研究所 一九九七年招收硕士学位研究生入学考试试题答案 试题名称:软件基础 是非题(1分×10) 1.√ 2.√ 3.× 4.× 5.√ 6.× 7.× 8.× 9.× 10.× 程序阅读题(共18分) (2分×5) ① 1 , 1 ,f(m,n-1), n ② 9 (nine) (2分×4) C[i]表示数组A中值等于i的元素的个数(1≦i≦n); C[i]表示数组A中值小于等于i的元素的个数(1≦i≦n); B[1..n]有序 O(n) 注:这是一个计数排序算法。 (10分) proc HeapInsert(var heap:HEAP; key:keystype) { if heap.size ≧ max then error(“overflow”) else { heap.size := heap.size + 1; i := heap.size; //新结点作为树叶先插入i位置 while (i > 1) and (heap.keys[parents(i)] < key) do { //向上调整最多至根 heap.keys[i] := heap.keys[parents(i)]; i := parents(i); //相当于新结点往上调整至双亲 }//end of while heap.keys[i] := key } //end of if } //end of proc 这里parents(i)是一函数,返回值为 。 此题要点如题中的提示,必须从size+1位置往上调整使其满足堆性质; 另一要点是将数组keys看作是完全二叉树的顺序存储结构,若从上往下调 整,难以保证筛下的元素恰好是数在size+1的位置。 (12分) func Rank(T:TREE;x:↑node):int { //可设x≠nil if x↑.lchild = nil then r := 1 else r := x↑.lchild↑.size + 1; y :=x; while y ≠ T do { //循环不变量:r表示以y为根的子树中,结点x↑的Rank值 //当y等于根T时,即为所求 if y = y↑.parents↑.rchild then { //当y↑是其双亲的右子时,y↑的双亲结点的左子树中所有结点及 //y↑的双亲本身均应排在y↑的前面(指中根序列) if y↑.parents↑.lchild = nil then r := r + 1; else r := r + y↑.parents↑.lchild↑.size + 1; } y := y↑.parents; }//end of while return r; }//end of func. 此题要点:先找x↑在以x↑为根的子树中的排列序号r,因为x↑的 左子树中所有结点在中根序列中均处于x↑之前,所以有: r:=x↑左子树的大小(size)+1; 这里加1是包括x↑本身。当x↑左子树为空时,相当于左子树size为0。 注意:x↑在以x↑为根的子树中的r值并非它在整个树T中的排列序号, 所以要从x↑上溯到其双亲,当x↑是其双亲的左子树时,r值不变;当 x↑是其双亲的右子树时,必须加上双亲结点本身及其左子树中所有结点数 作为新的r值。此过程最多上溯至根。所以执行时间不超过树的高度。 (1分×9) ①相当容量的辅存;②一定容量的主存;③地址变换机构。 抖动。 独占、共享、虚拟。 提高硬件的并行操作程度、减少对CPU的中断次数。 (共16分,第一题4分,其余二题各6分) 裸机、CPU调度和PV操作、内存管理、作业管理、设备管理、文件管理、命令管理、用户。 产生死锁的必要条件有:①独占条件(互斥条件);②请求和保持条件;③不剥夺条件;④环路条件(循环等待条件)。 解决死锁问题常用的方法有:①死锁的检测和解除;②死锁的预防。 UNIX进程映像由PROC结构、正文段、数据段三部分组成。 PROC结构为进程控制块PCB的一部分,它含有进程最常用的信息:进程状态、进程优先级、进程特征、地址和大小信息等。 正文段内容为可重入的程序代码,可以为若干个进程共享。 数据段由用户栈区、用户数据区、系统数据区三部分组成。 (10分) (15分) 程序的流程为下,方框表示基本块。 各结点的必经结点集合分别为: D(n0) = {n0} D(n1) = {n0,n1} D(n2) = {n0,n1,n2} D(n3) = {n0,n1,n3} D(n4) = {n0,n1,n3,n4} D(n5) = {n0,n1,n3,n5} D(n6) = {n0,n1,n3,n6} D(n7) = {n0,n1,n3,n6,n7} 回边有n6 ——→n1一条。 该回边所表示的循环为{n1,n2,n3,n4,n5,n6}。入口为n1,出口为n6。