中国科学院软件研究所
一九九八年招收硕士学位研究生入学考试试题答案
试题名称:软件基础
第一部分:程序设计和数据结构
选择合适的答案填空(1分×20)
(a),(d),(e);
(b);
(c),(a),(d);
(c);
(b);
(b);
(d);
(e);
(b),(c);
(b);
(b);
(c);
(b);
(c);
(a);
除A[2] = 1外,其余各分量均为0。
A中分量均为0。
Demo的功能是二进制数的增量(加上)操作,A相当于一个二进制计数器。
n次连续调用Demo的总时间的上界应为O(n),详细分析如下:
Demo操作的时间代价正比于二进制数A中位(每个A[i]相当于二进制数的位)的翻转次数,而n次连续的Demo操作是从0开始的,因此在这n次增量操作中:A[0]共翻转n次,A[1]共翻转 次,……,A[i]共翻转 次(i );当i 时,位A[i]根本不翻转(因为数n的二进制表示最多有 位),所以n次增量操作发生的位翻转总次数为:
Procedure transpose(G:adjlist;var GT:adjlist)
{
for i:=1 to n do //初始化转置图GT的邻接表
{
GT[i].firstarc := nil;
GT[i].vexdata := G[i].vexdata;
}
for i :=1 to n do
{
p := G[i].firstarc;
while p≠nil do
{ //依次搜索vi的邻接点vj
j := p↑.adjvex; //<vi,vj>是G的边
new(q); // 申请一表结点
q↑.adjvex := i;
q↑.nextarc := GT[j].firstarc;
GT[j].firstarc := q; //将<vj,vi>插入到GT[j]的邻接表头上
p := p↑.nextarc; //取vi的下一邻接点
} //end of while
} // end of for
}
时间复杂度:O(n+e),这里n=|V|,e=|E|。
第二部分:操作系统和编译
操作系统的作用是:屏蔽系统的硬件特性,提供功能更强的虚拟机;管理计算机系统资源,使之得到有效利用;提供方便友好的用户接口。其主要特征是并发和共享。
系统调用是操作系统提供给用户的系统服务程序,是应用程序申请操作系统服务的接口。系统调用运行在系统态,而一般的程序过程运行在用户态;应用程序以直接转入执行的方式调用一般过程,但必须通过中断方式转入执行系统调用,而不能直接转入执行。
由于多通道程序系统中引入了过多的程序道数,使得运行进程的大部分时间都用在进行页面的换入换出,而几乎不能完成任何有效的工作。
虚拟设备是由脱机或假脱机技术实现的将独占、低速、单台的物理设备改造而成的共享、高速、多台的观念上存在的设备。
UNIX系统中有两种读磁盘的方式:一般读方式和提前读方式;三种写方式:一般写方式、异步写方式和延迟写方式。
不满足“有限等待”准则,当每个哲学家都只拿到一把叉子时,发生死锁。一种改进的算法如下:
var fork:array[0..4] of semaphore;
var matex:semaphore;
fork[0] := fork[1] := fork[2] := fork[3] := fork[4] := 1;
matex :=1;
parbegin
Pi : repeat //第i个哲学家的生活过程
ThinkForWhile;
P(matex);
P(fork[i]);
P(fork[(i+1) mod 5]);
V(matex);
EatForWhile;
V(fork[i]);
V(fork[(i+1) mod 5]);
until false
parend
E E or T | T
T and F | F
F not F | p | q | (E)
i是静态变量;
这和编译时的代码生成策略有关。对于表达式(i+abs(1))*fact(),因两个子表达式都有函数调用,因此先产生左子表达式代码,后产生右子表达式代码。当abs(1)改成1后,先产生右子表达式代码。
因此有不同的结果。