一个n个整数序列取m个数,使其概率相同问题

         这是今天上午在同济笔试百度的题目,当时没做出来,那个郁闷,现把思路放在此处纪念已逝的笔试。


        原题大概是这样的:一个服务器一天内会收到很多request,但是服务器只能存放m个request,试设计一种算法,使得在时时的reqest中选择m个保存,并保证最后各个request被选中的概率为大致相同。记住,不到最后,不知道request的总数n.


         其实,这个题目可以这样解:

         前m个request依次放入服务器中,当第m+1个来临时,以m/(m+1)的概率选中,并在已保存的m个request中等概率选择一个替换之。当第m+2个来临时,以

m/(m+2)的概率选中,并在已保存的m个request中等概率选择一个替换之。  依次类推,第N个request以m/N的概率被选择,并在已保存的m个request中等概率选择一个替换之。最终每个request被选择的概率为m/n.


         证明如下(数学归纳法):

         当n=m+1时,第m+1选中的概率为m/(m+1),而第一个被选中的概率为:1/(m+1) + m/(m+1) * (m-1)/m = m/(m+1);

         假设当n = N时,每个request被选择的概率为m/N;

         现证明当n = N+1时,每个request被选择的概率为m / (N+1).

         第N+1个被选中的概率当然为m/(N+1),而第一个request被选择的概率为:m/N * ( (N+1-m)/(N+1) + m/(N+1) * (m-1)/m =  m / (N+1);其余request被选择的概率也一样,得证当n = N+1时,每个request被选择的概率为m / (N+1)。

         

         综上得,第方法可以实现最最终每个request被选择的为m/n.

       


阅读更多
文章标签: 服务器 算法 百度
个人分类: 趣题
想对作者说点什么? 我来说一句

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

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭