题目
41.(13 分)已知一个整数序列 A=(a0,a1,…,an-1),其中0≤an/2(0≤Pk(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或 Java 语言描述算法,关键之处给出注释。(3)说明你所设计算法的时间复杂度和空间复杂度。
(1)给出算法的基本设计思想∶(4分)
算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元素 Num。然后重新计数,确认Num 是否是主元素。
算法可分为以下两步:
① 选取候选的主元素∶依次扫描所给数组中的每个整数,将第一个遇到的整数 Num 保存到c中,记录 Num 的出现次数为1;若遇到的下一个整数仍等于 Num,则计数加 1,否则计数减1; 当计数减到0时,将遇到的下一个整数保存到c中,计数重新记为1,开始新一轮计数, 即从当前位置开始重复上述过程,直到扫描完全部数组元素。
②判断 c 中元素是否是真正的主元素∶再次扫描该数组,统计c 中元素出现的次数,若大于n/2,则为主元素;否则,序列中不存在主元素。
(2)算法实现∶(7分)
int Majority(int A[ ], int n)
{
int i, c, count=1; //c用来保存候选主元素,count 用来计数
c A[0]; //设置A[0]为候选主元素
for(i=1; iif(A[i]] ==c)
COunt++; //对 A中的候选主元素计数
else
if( count >0) //处理不是候选主元素的情况
count--;
Else //更换候选主元素,重新计数
{c= A[i];
count = 1;
if(count>0)
for(i=count=0;iif(A[i] = =c)
Count++;
if( count>n/2) return c; //确认候选主元素
else return -1; //不存在主元素
}
【(1)、(2)的评分说明】
① 若考生设计的算法满足题目的功能要求且正确,则(1)、(2)根据所实现算法的效率给分,细则见下表:
int Majorityl(intA[],intn)//采用计数排序思想,时间:O(n),空间∶O(n)
{
int k,* p, max;
p=(int *)malloc(sizeof( int)*n ); // 申请辅助计数数组
for(k=0; kmax=0;
for(k=0; k{p[A[k]]++; // 计数器+1
if(p[A[k] ]>p [ max ])max = A[k]; //记录出现次数最多的元素
}
if(p[ max]>n/2) return max;
els return -1;
}
② 若在算法的基本设计思想描述中因文字表达没有非常清晰反映出算法思路,但在算法实现中能够清晰看出算法思想且 正确的, 可参照①的标准给分。
③ 若算法的基本设计思想描述或算法实现中部分正确,可参照①中各种情况的相应给分标准酌情给分。
④参考答案中只给出了使用C 语言的版本,使用C++或 Java 语言的答案视同使用C语言。
(3)说明算法复杂性∶(2分)
参考答案中实现的程序的时间复杂度为O(n),空间复杂度为O(1)。
【评分说明】若考生所估计的时间复杂度与空间复杂度与考生所实现的算法一致,可各给1分。

多做几道

41.(10 分)带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法∶
①设最短路径初始时仅包含初始顶点,令当前顶点u为初始顶点;
② 选择离u最近且尚未在最短路径中的一个顶点v,加入最短路径中,修改当前顶点u=v;
③ 重复步骤②,直到u是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举例说明。
42. (5分)已知一个带有表头结点的单链表,结点结构为
Data/link
假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法;查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回1∶否则,只返回0。要求∶
1)描述算法的基本设计思想。
2)描述算法的详细实现步骤。
3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或 Java 语言实现),关键之处请给出简要注释。
43.(8分)某计算机的CPU主频为 500Mz,CPI为5(即执行每条指令平均需5个时钟周期)。假定某外设的数据传输率为 0.5MB/s,采用中断方式与主机进行数据传送,以 32 位为传输单位,对应的中断服务程序包含 18条指令,中断服务的其他开销相当于2条指令的执行时间。请回答下列问题,要求给出计算过程。
1)在中断方式下,CPU用于该外设I/O的时间占整个CPU时间的百分比是多少?
2)当该外设的数据传输率达到5MB/s 时,改用DMA 方式传送数据。假定每次 DMA传送块大小为 5000B,且DMA预处理和后处理的总开销为 500个时钟周期,则 CPU用于该外设 I/O 的时间占整个 CPU时间的百分比是多少(假设 DMA与CPU 之间没有访存冲突)?
44.(13 分)某计算机字长为16位,采用16位定长指令字结构,部分数据通路结构如下图所示,图中所有控制信号为1时表示有效、为 0时表示无效。例如,控制信号MDRinE 为1表示允许数据从 DB打入 MDR,MDRin为1表示允许数据从内总线打入 MDR。假设 MAR 的输出一直处于使能状态。加法指令"ADD(R1),RO"的功能为(RO)+(R1))→(R1),即将R0中的数据与 R1的内容所指主存单元的数据相加,并将结果送入 R1的内容所指主存单元中保存。
下表给出了上述指令取指和译码阶段每个节拍(时钟周期)的功能和有效控制信号。请按表中描述方式用表格列出指令执行阶段每个节拍的功能和有效控制信号。
时钟:功能/有效控制信号
C1:MAR←(PC)/PCout, MARin
C2:MDR←M(MDR) PC←(PC)+1/MemR, MDRinE, PC+1
C3:IR←(MDR)/MDRout, IRin
C4:指令译码/无
45.(7分)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用 produce()生成一个正整数并用 putO)送入缓冲区某一空单元中;P2每次用 getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用 geteven()从该缓冲区中取出一个偶数并用 counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义(要求用伪代码描述)。

该科目易错题

该题目相似题