面试中的概率问题 - 等概率方案

问题描述:

这是今年微软的一个面试题,从网络进入一个整数流,长度不定,接收端会接收这个整数流中的一个整数,请提供一个方案,使得接收端接收这个整数流中的每个整数的概率都是相同的?

 

分析过程:

这种方案肯定是可行的,把所有整数全部存储起来,统计出整数个数N,然后rand出0~N-1的随机数,选择相应的整数即可。

 

但是,由于整数流的长度不定,可能会浪费非常非常多的空间。

 

那么,我们试图来节省这些空间,意味着,我们不能把整数流中的整数保存起来。基于这些考虑,我们应该能够假设,读取第M个数前,前M-1个数是等概率获取;读取第M个数后,这M个数也是等概率获取的。

 

我们同样可以做这样的假设,如果总共有N个数,那么每个数获取的概率值和为1。(当然这里确实是一个假设,sum(Pi)=1不是一定得满足的,只是我的思考过程是这样假设的)

 

那么,在获取M-1个数时,我们并不知道还有第M个数,那么在读取第M个数前,前面M-1个数的概率均为1/(M-1)

 

在读取第M个数时,我们做了一些处理工作,使得选择当前数的概率为1/M,并且之前的所有数的被选择概率也变为1/M

 

其实从上面2段黑体字,已经找到了解决方案:

遇到第M个数时,用1/M的概率来判断是否选择当前数,用(M-1)/M的概率保持之前选择的数,那么对于之前每个数,选择的概率为(M-1)/M * 1/(M-1) = 1/M

 

最终答案:

遇到第M个数时,用1/M的概率判断是否选择这个数,用(M-1)/M的概率保持之前选择的数,这样空间复杂度是O(1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值