背景
小伙伴参加了企鹅厂的2015校招笔试,有五道大题,拿出三道算法类的题尝试着实现实现。这是第三道题:C/S模型压力算法设计
第一题:抽奖算法实现可以看这里
第二题:整形长度计算算法可以看这里
题目
第三题的大意是:在某个C/S模型中,服务器最大的处理量是每秒10000次,设计一个算法,保证服务器可以正常运行。
分析
这道题主要考察C/S模型中,服务器保护方面的知识,考虑到这是一道校招题,参加校招的都是项目经验相对缺少的学生,因此这道题主要考察的方向应该是算法思想方面的内容。我认为这道题可以通过这种方案来实现:
- 客户端每发出一个请求,都保存在服务端的请求队列中,若服务端请求队列等于10000,以后的请求,都不加入队列,且对客户端做出异常反馈。
- 客户端每发来一个请求,处理完请求后,计算等待时间,若等待时间大于1秒,将请求队列中的所有请求发送给服务端处理功能模块,清空等待队列,清空等待时间
- 周而复始进行循环
源代码
注:这里的源代码并不能编译运行,只是一个思路的代码提现
#include<time.h>
double Clock_start = 0; // 记录开始时间
double Clock_end = 0; // 记录等待时间
int count = 0; // 记录请求队列数目
bool client = false; // 是否有客户请求
// 算法实现
void ProtectServer()
{
while(1){ // 使服务端一直运行
if(1000 <= Clock_end) // 如果等待时间大于一秒
{
/* 处理当前等待队列的所有请求 */
Clock_start = clock(); // 记录当前时间
count = 0;
}
/* 接收客户端请求,有客户请求时,将client赋值为true */
if(client) // 如果有客户接入
{
if(count<10000) // 当前客户请求队列是否大于10000
{
count++; // 客户队列+1
/* 将客户端请求信息存储在请求队列 */
}
else // 请求队列满时抛出异常
{
/* 给服务器抛出满载异常 */
}
}
client = false; // 客户请求初始化
Clock_end = clock() - Clock_start; // 计算等待时间
}
}
总结
企鹅厂这道题的考察点由传统的纯底层算法考察,转换为框架类算法考察,主要看应试者是否拥有分析需求,处理问题的能力。同时更重要的是考察应试者是否具备多人合作开发的某项潜质。整道题以小见大,但是相较于社招还是过于简单。