蓄水池问题(等概率抽取)详解

本文详细介绍了蓄水池问题,即如何在不断增长的数据流中等概率地选取k个元素。通过数学归纳法证明了算法的正确性,给出了等概率选择一个和多个元素的伪代码,并解释了如何实现k/j的概率选择第j个数。
摘要由CSDN通过智能技术生成

蓄水池问题

问题背景:如何在N个数据中 等概率地取出k个。如果N会随着时间增长呢?

  1. 我们先来考虑简单的,就是如何在数据总数会增长的情况下等概率取出其中一个。
    设想一段流水线不断流来产品,要求随机取出一个。第一个,很简单,直接取得即可
    概率为1/1。如果第二个到来,那么我们在0.5和1直接取得一个随机数,如果大于0.5那么用第二个替换掉第一个,否则不替换。这样前两个每个被选中的概率都是1/2。
    第三个来了,我们以1/3的概率选中第三个,如果选中了,则用它替换掉前面已经选中的
    这样前三个每个被选中的概率都是1/3。

    简单证明:很显然3被选中概率是1/3, 对于2,在前两轮中被选中概率是1/2,第三轮中不被替换的概率
    (即3不被选中的概率)是2/3,所以p(选中2) = 1/2 * 2/3 = 1/3, 同理1被选中的概率也是1/3。
    推广:对于总数为N的流水线等概率选择一个,令i = 2开始,以p = 1/i的概率选中当前数,来替换掉已经选中的
    数,这样可保证前i个数每个被选中的概率都等于1/i。
    数学归纳法:
    i=2,成立。
    假设i=j成立,则只需证明i=j+1也成立即可。
    i = j+1 时,取random(1,j+1),在i到j+1之间取一个随机数,如果等于1,那么用第j+1个数替换掉选中的数。
    由于p(随机数=1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值