【面试题之概率部分】蓄水池抽样

本文探讨了在大数据场景下如何从n个数中等概率抽取m个样本的问题,分析了等概率抽取法的效率问题,并介绍了蓄水池抽样算法的原理与实现,适用于n值不确定或非常大的情况。该方法通过保留前m个数并以一定概率替换蓄水池中的元素,确保了随机性的均匀分布。同时,蓄水池抽样也可应用于连续网络流和链表中随机取样问题。
摘要由CSDN通过智能技术生成

相关面试题:

1.n个数中随机取m个 n值非常大

2.连续的网络流中等概率的抽取一个数据包

3.长度为N的链表中(不知道N具体值)一次遍历随机取K个元素


解法:

让我们先来考察第一个问题:n个数中随机选取m个数(此时n值有可能不大)

方法1——等概率抽取法

我们最先想到也是最容易想到的是等概率抽取法,每次都随机在(0,n-1)之间抽取一个数,并与之前的数相比较,若相同,则继续随机生成;若不相同,则继续随机抽取,直到生成一个与之前所有生成数不同的数,将上述这样的随机生成做m次。

那么问题来了,如果m较大呢?

带来的变化是每次调用rand()生成的数与之前的数相重合的概率会变大,换句话说,我要随机取出m个的值,则调用rand()函数的次数会增多,这样的方法开销肯定会增大。

那到底开销有多大呢,我们来考察一下rand()函数的调用次数:

假设前面已经生成了x个数,要生成第x+1个数,那么:

调用1次rand()函数就成功生成该数的概率为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值