您的位置:首页 > 其它

企鹅2015校招笔试之(三)C/S模型压力算法设计实现

2015-04-23 00:27 253 查看

背景

小伙伴参加了企鹅厂的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;  // 计算等待时间
}
}


总结

企鹅厂这道题的考察点由传统的纯底层算法考察,转换为框架类算法考察,主要看应试者是否拥有分析需求,处理问题的能力。同时更重要的是考察应试者是否具备多人合作开发的某项潜质。整道题以小见大,但是相较于社招还是过于简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息