笔试题基础(第三篇
2015-09-05 21:28
281 查看
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:
Little Endian:
从上面两图可以看出,采用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
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是静态变量。
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是静态变量。
相关文章推荐
- swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )
- LeetCode(54)Spiral Matrix
- 打肿脸进展
- Redis学习笔记(一)--认识Redis
- 各种版本下载
- 继承object对象对python多继承的影响
- Android开发时手机无法真机测试怎么办?
- Visual Studio Attach Progress Debug
- 生活点滴
- 员工管理系统数组版-方法的构建以及在主程序中的调用
- 关于项目中出现一些非代码造成的错误
- Java多态
- POJ 3013最短路变形....
- php设计模式——单例模式(Singleton)
- Cocos2d-x v3.6制作射箭游戏(二)
- 关于git的一些用法
- linux之bash变量
- 调试rust的宏
- 新师徒第一次会议
- 【LeetCode】之Valid Palindrome