1、下列描述错误的是()
A、读取SATA硬盘数据的速度约为500Mbps。
B、读取18XDVD光盘数据的速度为1Gbps。
C、千兆以太网的数据读取速度约为1Gbps。
D、读取DDR3内存数据的速度约为100Gbps。
答案:D
2、()不能用于Linux中的进程间通信
A、共享内存
B、命名管道
C、信号量
D、临界区
答案:D
解析:
进程间通信(Inter-Process Communication)
(1)管道(pipe):半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,通常指父子进程,named pipe,允许无亲缘关系的进程间通信。
(2)信号量(semophore):是一个计数器,可以用来控制多个进程对共享资源的访问,如内存,常被用做锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。主要用作进程间或同一进程不同线程间的同步手段。
(3)消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列表示符表示。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(4)信号(sinal):信号是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。
(5)共享内存:是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个内存可都可以访问。是最快的IPC方式,它是针对其它进程间通信方式运行效率低专门设计的。往往与其他通信机制配合使用,如信号量,实现进程间的同步和通信。
(6)套接字(Socket):是一种
(7)临界区(Critical section)实际上指一段代码,在执行之前需要独占一些额外共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行控制。
3、设在内存中有P1,P2,P3三道程序,并按照P1,P2,P3的优先级次序运行,其中内部计算和IO操作时间由下表给出(CPU计算和IO资源都只能同时由一个程序占用):
P1:计算60ms –> IO 80ms –> 计算20ms
P2:计算120ms –> IO 40ms –> 计算40ms
P3:计算40ms –> IO 80ms –> 计算40ms
完成三道程序比单道运行节省的时间是()
A.80ms
B.120ms
C.160ms
D.200ms
答案:
解析:
假设P1、P2、P3不可抢占,则串行执行耗时:160+200+160=520
CPU顺序:P11(60)>P21(120)>P13(20)>P31(40)>P23(40)>等待IO(40)>P33(40)
IO顺序: 等待CPU(60)>P12(80)>等待CPU(40)>P22(40)>等待CPU(20)>P32(80)
组后执行完成的是CPU,则CPU执行时间为总耗时:60+120+20+40+40+40+40=360
4、两个"等价线程"并发的执行下列程序,a为全局变量,初始为0,假设printf、++、–操作都是原子性的,则输出不可能是哪个()
void foo() {
if(a <= 0) {
a++;
}
else {
a--;
}
printf("%d", a);
}
A.01 B.10 C.12 D.22
答案:A
对于B答案,P1执行程序,输出1,P2执行程序,输出0;
对于C答案,初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行判断语句,并执行输出,得到1,P1然后继续执行,此时它该执行a++,这时a=1,执行并输出,结果为2;
对于D答案,初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行a++,得到a=1,中断,P1继续执行a++,a=2,P1输出,得到2,P1结束,P2继续执行输出语句,得到2;
5.给定fun函数如下,那么fun(10)的输出结果是()
int fun(int x) {
return (x==1) ? 1 : (x + fun(x-1));
}
A.0
B.10
C.55
D.3628800
递归展开,f(10)=10+f(9)=10+9+f(8)+……+1=55
6、在C++程序中,如果有一个整型变量频繁使用,最好将它定义为
A、auto
B、extern
C、static
D、register
答案:D
解析:C语言四个存储说明符:auto、extern、static、register
(1)auto 动态存储(默认)
:在函数中定义的自动变量;动态存储,在定义该变量的函数被调用时,才分配存储单元;
(2)static 静态存储
用静态存储方式存储变量,生命周期为进程的整个执行时间
分类:在函数体外定义的静态全局变量(它可以用extern在其他文件中声明并引用此静态全局变量)
在函数体内定义的静态变量叫静态局部变量(它使用存在,并只能在声明的函数中访问,其他函数无权访问,系统在未赋值情况下自动赋值为0)
静态全局变量的说明
静态全局变量要是定义在.cpp文件中,那么这个变量只能被这个.cpp文件中的函数访问
静态全局变量要是定义在.h文件中,那么这个变量可以被任何包含了这个.h文件的.cpp文件访问
“注意不要在头文件中生命static变量和全局变量(demo1\demo2\main)”
(3)register寄存器存储
这种变量直接放在CPU的寄存器中,不需要访问内存,而直接从寄存器中读取,这样提高效率。
(4)extern引用声明
作用:
其他文件的函数,通过在正常的函数声明前加上extern声明外部函数
调用其他文件的全局变量,通过在全局变量声明前加上extern声明外部函数
7、长为n的字符串中匹配长度为m的子串的算法复杂度为
A、O(n) B、O(n+m)C、O(n+logm)D、O(m+logn)
答案:B
普通匹配在最坏情况下时间复杂度为O(m*(n-m+1));
KMP算法时间复杂度为O(m+n);
找子串中的next[j]序列,即子串中某一位跟前面哪一个重复
让子串向右移动的尽可能远一些来达到降低复杂度的目的。
子串 ababaabab
nextj1234234
最大右移 112222555
next[j]表示若比对到j位,发生不匹配,则子串向右移动next[j]位。
KMP算法待改进
8、判断一包含n个整数的数组a[]中是否存在i、j、k满足a[i]+a[j]=a[k]的时间复杂度最小值为()
A、O(n3)B、O(n2logn)C、O(n^2)D、O(nlogn)
9、下列排序算法中最坏复杂度不是n(n-1)/2的是
A.快速排序 B.冒泡排序 C.直接插入排序 D.堆排序
答案:
解析:只有堆排序和归并排序的最坏复杂度为O(nlogn)
10.三次射击能中至少一次的概率是0.95,请问一次射击能中的概率是多少?
A.0.32 B.0.5 C.0.63 D.0.85
答案:
解析:1-(1-p)^3=0.95+估算
二、不定项选择
11、以下哪些进程状态转换是正确的()
A.就绪到运行 B.运行到就绪 C.运行到阻塞 D.阻塞到运行 E.阻塞到就绪】
答案:D
解析:1、就绪》执行 2、执行》就绪 3、执行》阻塞 4、阻塞》就绪
12.一个栈的入栈数列为:1、2、3、4、5、6;下列哪个是可能的出栈顺序
13.下列哪些代码可以使得a和b交换数值
A、b=a+b;a=a+b;b=b-a
14.A和B晚上无聊就开始数星星。每次只能数K个(20<=k<=30)A和B轮流数。最后谁把星星数完谁就获胜,那么当星星数量为多少时候A必胜?(选项不记得)
A、2013 B、2888 C、3935 D、4062 E、25051
答案:ABCDE
首先,A先取,使剩余的星星为50的倍数。然后数星星的顺序为B、A、B、A……。B数k个星星,则A就数50-k个,使剩余星星始终为50的倍数,最后,一定是A数最后的星星。A必胜。
三、填空问答题
15.已知一个整数数组A和数组长度为n,设计一个简洁的程序(<20行代码)完成数组元素在原地倒叙,比如输入时A为{1,2,3,4},则程序结束时,A为{4,3,2,1}。要求使用加减乘除赋值和逻辑控制语句,不得调用类库函数。
看到卷子,得了4分
void revense(int * a,int n) {
if(n<=0)break;
else
{
int i,j,temp;
for(i=0,j=n-1;;i n/2;i++,j–)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
16.给你三个线程,分别采用先来先分配的策略和最短执行之间的调度策略,然后计算每个线程从提交到执行完成的时间。
题目实在太长,还有几个表格。考察的是操作系统里面作业调度算法先进先出和最短作业优先。
17.某工程师总结了一下近半年上班苦逼的经历,得出一些苦逼的数据,他忘记设闹铃的概率是0.2;上班路上堵车的概率时0.5;他还记录下一个表。请计算他60个工作日中迟到天数的期望值。
事件 迟到概率
忘记设闹铃,堵车 1.0
忘记设闹铃,没堵车 0.9
设了闹铃,堵车 0.8
设了闹铃,没堵车 0.0
答案:
计算60个工作日中迟到的天数的期望
(1)忘记设闹铃,堵车的天数:0.20.560=6;
(2)忘记设闹铃,没堵车:0.2(1-0.5)60=6;
(3)设了闹铃,堵车:0.80.560=24;
(4)设了闹铃,没堵车:0.80.560=24;
则其迟到天数的概率分布为
6 6 24 24
1 0.9 0.8 0
故其期望值为61+60.9+240.8+240=6+5.4+19.2+0=30.6
18、在某战场有n个战士,n>4,每个战士都知道一些不同的战报。他们期望通过一些双方交流(如:打电话)来共享战报,达到每个人都知道所有战报的效果。每次交流都能使双方得知对方知道的所有战报。请设计一个高效的算法来达到这个目标,并求出双方交流次数和最小值(不用写代码)。
参考其他人解法:
1、分成两组:1) 2个node,2) n-2个node
2、2个node需要连接1次,使得2个node拥有2个节点信息;
3、n-2个node至少需要n-3次连接,使得最后连接的2个node拥有这n-2个node的信息;
4、第一组的2个node与第n-2组的最后两个node(即获得该组全部信息的2个nodes)分别连接;于是4个节点得到全部信息,连接了2次。这里是为什么节约了一次连接的关键。
5、剩下的n-4个node都没有获得全部信息,每个node至少需要一次连接。因此至少需要n-4次连接。用拥有全部信息的其中一个node与剩下的n-4个node连接。则只需要n-4次。
6、得总过需要1+(n-3)+2+(n-4)= 2n-4.
19、房间里有N-1为群众和1位明星。每位群众都认识该明星,群众之间的认识状况未知, 而该明星却不认识任何一位群众。假设你是机器人,具有问一个人是否认识另一个人的功能,每次耗费时间O(1)。请设计一个最优算法在这N个人中找到该明星,并分析复杂度。(不用写代码,不分析复杂度不得分)
这个问题等价于找未知序列数中的最小数
四、综合题
淘宝网某金冠卖家,在各城市共建有n个仓库,形成如图所示的一个环形。开始时,每个仓库的存货量不等。因为供销的需要,卖家想调整各仓库,使所有仓库的存货量都一样。请帮卖家设计一种算法,用最少的费用(即最小搬运量)到达他的目的。搬运货物时,只能在相邻的仓库间搬运。