从数据流中随机取m个数

本文详细介绍了如何从无限大的输入流中等概率随机抽取m个记录的方法,通过分配有限内存区域并应用特定的概率选择机制实现。证明了此方法能确保每个记录被选中的概率相等,提供了解决类似数据处理挑战的有效解决方案。

还记得百度网页搜索部面试的时候,面试官问了这个问题,回答的一塌糊涂,今天恰好找到了这个答案,记录一下,对了还发现了一个非常好的网站,是关于程序员面试算法的

http://www.jiuzhang.com/problem/


Q:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中等概率随机取得m个记录。

 

A:开辟一块容纳m个记录的内存区域,对于数据流的第n个记录,以m/n的概率将其留下(前m个先存入内存中,从第m+1个开始),随机替换m个已存在的记录中的一个,这样可以保证每个记录的最终被选取的概率都是相等的。

 

面试官视角:

 

这个题目除了需要给出正确解答以外,还需要证明你的解答。考察的是对概率随机问题的掌握情况和归纳法的运用。下面给出一个简单的证明:

 

设数据流中已经有n个记录流过,在内存中的m个记录中,假设都是等概率取得的,每个数命中的概率都为:m/n。对于第n+1个记录,以m/(n+1)的概率选中,

1)如果没有选中,则内存中的m个记录均被留下来,每个数【原来m个】留下来其概率为:m/n * (1-m/(n+1)) = m(n+1-m)/(n(n+1));

2)如果选中,新留下来的数概率自然是m/(n+1),而原来内存中的m个数中留下来m-1个数,每个数【原来m个】留下来的概率是:m/n*((m-1)/(n+1)) = m(m-1)/(n(n+1))。两种情况下概率之和为m(m-1)n(n+1)+m(n+1-m)n(n+1)=m/(n+1),即为原来被选中数,继续被选中的概率。由此我们不难得出,内存中每个数被选中概率一直都是m/n。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值