2011年10月16日百度笔试归来,献上杭州卷及答案

一、基础部分

C++ STLvector的问题:
1、调用push_back时,其内部的内存分配是如何进行的?

这个部分直接开c++看源码就行了,勇乔多说无益


2、调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?

关于内存的释放

struct temp

{

     char pid[100];

     int i;

}

std::vector <temp> *tp

pVec->clear()再 tp->swap( (std::vector <temp>)(*tp) )就能实现内存的释放。

二、算法设计
1、设randst)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n个点,并给出时间复杂度分析。

解法1

.思路:这个使用数学中的极坐标来解决,先调用[s1t1]随机产生一个数r,归一化后乘以半径,得到R*r-s1/t1-s1),然后在调用[s2t2]随机产生一个数a,归一化后得到角度:360*a-s2/t2-s2

上面这个方法想出来的就是变态啊!!有木有!!

解法2

 对X随机,然后根据X求出Y的范围,然后对Y随机

这个解法有缺陷,虽然种子与随机策略是我们不知道的,但是Y的随机还是基于X的随机出的值。

解法3:

分别对XY进行(-RR)的随机,然后对所得值进行判断是否在圆内即可。落入的概率达到πr²/4r²,也就是π/4,那么时间复杂度就是On=4n/π

点评:笔试的时候先想出了第二种方法,然后用第三种方法交在答卷上的。感觉第三种策略比较靠谱,不知道对不对。

对于策略一是百度到的。感觉有点强人所难了,毕竟大一的知识,能做出来的真心不多。


2、为分析用户行为,系统常需存储用户的一些query,但因query非常多,故系统不能全存,设系统每天只存mquery,现设一算法,对用户时时请求的query进行随机选择m个,请给一个方案,使得每个query被抽中概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。
如果用户查询的数量小于m,那么直接就存起来。如果用户查询的数量大于m,假设为m+i,那么在1-----m+i之间随机产生一个数,如果选择的是前面m条查询进行存取,那么概率为m/m+i),如果选择的是后面i条记录中的查询,那么用这个记录来替换前面m条查询记录的概率为m/m+i*1-1/m=(m-1)/(m+i),当查询记录量很大的时候,m/m+i== (m-1)/(m+i),所以每个query被抽中的概率是相等的

三、系统设计
正常用户端每分钟最多发一个请求至服务端,服务端需做一个异常客户端行为的过滤系统,设服务器在某一刻收到客户端A的一个请求,则1分钟内的客户端任何其它请求都需要被过滤,现知每一客户端都有一个IPv6地址可作为其ID,客户端个数太多,以至于无法全部放到单台服务器的内存hash表中,现需简单设计一个系统,使用支持高效的过滤,可使用多台机器,但要求使用的机器越少越好,请将关键的设计和思想用图表和代码表现出来。

PsIPV6存储128位,时间存储如果考虑每天归零,那么就只要考虑小时分钟和秒,也就是32+64+64(各个位最大值245959也就是对应的6+7+7位)

如果对地址作为id,然后这个问题就不知道了。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭