baidu-2011

来源:互联网 发布:php redis抢红包源代码 编辑:程序博客网 时间:2024/05/21 10:33

1、随即采样问题:设rand(s,t)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n个点,并给出时间复杂度分析。

:方案1:

选择2个随即数X=rand(-R,R),Y =rand(-R,R),然后选取X2 + Y2 < R2的点,可以证明选取这些点的概率是相等

时间复杂度 O(N2);

While(N){

X=rand(-R,R);

Y=rand(-R,R);

If( X*X + Y*Y < R * R)

   N --;

}

 

方案2:

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

个人觉得应该先产生rand(0,sqrt(R)),再产生rand(0,360),但是0,和360度是重复的,而且圆的边界上也会选到点。

 

2、为分析用户行为,系统常需存储用户的一些query,但因query非常多,故系统不能全存,设系统每天只存m个query,现设计一个算法,对用户请求的query进行随机选择m个,请给一个方案,使得每个query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。

(1)

先存储m个,
当第N(N>m)个请求来时,m/N概率存储该请求,随机替换m个存储好的请求中的一个.

可见 第N个请求被存储的概率 m/N;

第N-1个请求被存储的概率 m/(N-1)*(1-1/m) = (m-1)/ (N-1)同理类推,当N很大时近似相等?可以得到局部最优解

 

(2)

思路:如果用户查询的数量小于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被抽中的概率是相等的。

原创粉丝点击