第一题 简答题
1. 多线程和多进程模式有什么区别?在用两种模型开发服务程序时,分别有什么优缺点?采用长连接和短连接模式有什么区别?分别有什么优缺点?采用同步和异步模式有什么区别?分别有什么优缺点。
进程一般指一个程序,线程是指程序中一个单一的顺序控制流,进程间的关系比较疏远,各个进程在自己独有的地址空间内执行,寄存器和堆栈动态数据堆静态数据程序代码都是独立的。线程之间共享同一地址空间,共享动态堆、静态数据及程序代码。为保持自己的控制流线程独有寄存器和堆栈。线程是处理机调度的基本单位。用多线程模式开发服务,可以提高系统运行性能,充分发挥多cpu体系结构的优势。
2.请写出以下程序的运行结果,并解释导致这样运行结果的关键性原因。
#include
using std::cout;
class P
{
public:virtual void print()
{
cout << “P”;
}
};
class Q: public P
{
public: virtual void print()
{
cout << “Q”;
}
};
int main()
{
P * p = new P;
Q * q = static_cast (p);
q->print();
delete p;
cout << endl;
q = new Q;
p = q;
q->print();
p->print();
cout << endl;
p = new (q) P;
q->print();
p->print();
cout << endl;
p->~P();
delete q;
return 0;
}
P
QQ
PP
第二题 算法与程序设计题
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)
初始化M[n][n];
bool function
{ while(i i++;
flag=i-1;
return Search(M,k,flag)
}
Search (M[n][n],k,flag)
{
if (n==flag) return false;
else
{
if(k>M[n-1][n-1]) return false;
else
{
if(第n行和第n列中的元素都不等于k)
return Search(M[n-1][n-1],k,flag)
else return true;
}
}
}
时间复杂度O(n*n)
2.设 一个64位整型n,各个bit位是1的个数为a个. 比如7, 2进制就是 111, 所以a为3。
现在给出m个数, 求各个a的值。要求代码实现。
Int countone(int aa){
Int counter=0;
For(int e=0;e<64;e++){
If( 2^e&aa !=0)
Counter++;
}
}
Int main(){
Int[] m={1,2,3,4,5};
Int len=sizeof(m)/sizeof(int);
For(int i=0;i
Printf(“%d”,countone(m[i]);
}
第三题 系统设计题
实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
提示:
1、可以预处理日志
2、假设query不超过10亿条,每个query不超过50字节。
3、考虑在大查询量的情况下如何实现分布式服务