1.有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?
A.A按行存,B按行存。
B.A按行存,B按列存。
C.A按列存,B按行存。
D.A按列存,B按列存。
答案:A
想到的是传统矩阵相乘的方法,时间复杂度为O(n3 ),但是这不是最优的方法,最优方法为Strassen矩阵相乘发,时间复杂度降低为O(n2.81),用分治的思想将矩阵分块计算,在这个算法中按行存储更有利。所以正确答案为A。
2.IP数据报头采用()字节序,在此字节序下从低地址到高地址0x1234的表示形式为 () 。
A.big_endian,0x12 0x34 0 0
B.little_endian,0x34 0x12 0 0
C.big_endian,0 0 0x12 0x34
D.little_endian, 0 0 0x34 0x12
答案:C
big_endian:高位在低地址;
small-endian:地位在低地址。
3.设集合A={1,2,3},A上的关系R={(1,1),(2,2),(2,3),(3,2),(3,3)},则R不具备 ()?
A.自反性
B.传递性
C.对称性
D.反对称性
答案:D
假设集合A,以及基于A上的关系R
自反: 如果a是A的元素,那么<a,a>是R的元素
反自反: 如果a是A的元素,那么<a,a>不是R的元素
对称:如果<a,b>是R的元素,那么<b,a>是R的元素
反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等
传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素
4.无锁化编程有哪些常见方法?
A.针对计数器,可以使用原子加
B.只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
C.RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
D.CAS(Compare-and-Swap),如无锁栈,无锁队列等待
答案:D
A 这方法虽然不太好,但是常见
B ProducerConsumerQueue就是这个,到处都是
C linux kernel里面大量使用
D 本质上其实就是乐观锁,操作起来很困难。。单生产者多消费者或者多生产者单消费者的情况下比较常见,也不容易遇到ABA问题。
5. 以下措施中,不可能改进分布式系统读写(IO)性能的有____。
A.网络从千兆网升级为万兆网
B.优化调度系统,尽量做到任务与数据相近(Locality)
C.数据预取机制
D.实现异步读写机制
答案:D
异步IO就是调用系统IO来完成实际的IO操作,而不需要应用程序自己写代码完成IO,每次系统IO完成后给应用程序返回一个IO完成的信号,从而实现应用程序真的的异步无阻塞式的IO,异步IO可以提高应用程序的性能,而对操作系统IO没什么影响。影响分布式系统读写(IO)性能的关键因素应该是请求数据,而数据可能在别的机器上,所以ABC都能明显改善性能。至于D,感觉在非分布式系统上都已经出现了,貌似对 分布式系统读写(IO)性能的影响不大。
6.假定x=500,求下面函数的返回值______ 。
int fun(int x) { int countx = 0; while (x) { countx++; x = x & (x – 1); } return countx; }A.2
答案:D
很有意思的一道题目,500(d)=(111110100)b,由于当x为2的整数次幂时,x&(x-1)==0,所以,500的二进制表示中有多少个二进制位就会循环多少次,问题得解