笔试题基础(第三篇

来源:互联网 发布:战地4后悔重置数据了 编辑:程序博客网 时间:2024/05/21 22:54

1)无锁化编程有哪些常见方法?
A) 针对计数器,可以使用原子加
B) 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
C) RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
D) CAS(Compare-and-Swap),如无锁栈,无锁队列等待
解答:D

2)设集合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,a>是R的元素;
  即 a∈A  =》 <a,a>∈R
b) 反自反: 如果a是A的元素,那么<a,a>不是R的元素 ;
  即 a∈A  =》 <a,a>∉R
c) 对称:如果<a,b>是R的元素,那么<b,a>是R的元素 ;
  即 <a,b>∈R =》 <b,a>∉R
d) 反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等;
  即 <a,b>∈R 且 <b,a>∈R =》 a = b
e) 传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素;
  即 <a,b>∈R 且 <b,c>∈R  =》 <a,c>∈R
  由于 <3,2> ∈R 且 <2,3> ∈R ,但 3≠2,不满足”定义d)” ,即 R不满足“反对称性”。选D。

3)在N个乱序数字中查找第k大的数字,时间复杂度可以减小至?
A) O(N*logN)
B) O(N)
C) O(1)
D) O(2)
解答:B
  这是一个顺序统计量问题,用基数排序和桶排序均可做到O(n)。

4)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 是指低地址存放最高有效字节( MSB ),而 little endian 则是低地址存放最低有效字节( LSB )。
  比如,数字 0x12345678 在两种不同字节序 CPU 中的存储顺序如下所示:
  //数字:0x12345678
Big Endian:

 低地址                                  高地址              ----------------------------------------->    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |    12   |   34    |   56   |   78   |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian:

 低地址                                  高地址              ----------------------------------------->    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |    78   |   56    |   34   |   12   |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。由于IP数据报头采用“big endian”,所以0x1234 的big endian形式为:0 0 0x12 0x34

5)有两个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
  这个题最开始我选的是B,想到的是传统矩阵相乘的方法,时间复杂度为O(n^3 ),但是这不是最优的方法,最优方法为Strassen矩阵相乘发,时间复杂度降低为O(n^2.81),用分治的思想将矩阵分块计算,在这个算法中按行存储更有利。所以正确答案为A。

6)Fill the blanks inside class definition

class Test{    public:        ____ int a;        ____ int b;    public:        Test::Test(int _a , int _b) : a( _a )        {             b = _b;        }};int Test::b;int main(void){    Test t1(0 , 0) , t2(1 , 1);    t1.b = 10;    t2.b = 20;    printf("%u %u %u %u",t1.a , t1.b , t2.a , t2.b);    return 0;}

Running result : 0 20 1 20
A) static/const
B) const/static
C) –/static
D) const static/static
E) None of above
解答:BC
  对于成员变量a,若它为const类型,那么必须要使用Test::Test(int _a , int _b) : a( _a )这种初始化形式,若它为普通成员变量,也可以采取Test::Test(int _a , int _b) : a( _a )这种形式,所以a可以为const或者普通类型,由于b没有采取Test::Test(int _a , int _b) : b( _b )这种形式,所以b一定不是const类型,有main()中的t1.b和t2.b的输出都是20可以知道,b是静态变量。

0 0
原创粉丝点击