一个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.

       


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值