蓄水池算法(实时确保流中数据的等概率性)

本文介绍了蓄水池算法在处理实时数据流时如何确保每个用户被等概率选中的方法。当网站有大量用户访问,需要实时抽取一定数量的幸运用户时,传统的等概率抽取策略不再适用。通过分析问题,提出了两种情况的解决方案,并讨论了算法的概率正确性和实时性,确保每个用户首次登录时进行计算,保证实时更新和公平性。
摘要由CSDN通过智能技术生成

蓄水池算法

假如某个网站每日有1亿+的用户量访问,而今天有一个活动,需要抽取100个在今天登陆的幸运用户,要求:

  1. 要求每个用户被选中的概率是相等的;
  2. 这100个幸运用户实时更新,在当日的24点过后马上公布名单;

问题分析

首先分析等概率问题:

一般情况下,在需要等概率的情况下,我们只需要在总数n个中,抽取1个,连续抽取k次(遇到已经抽过的再放回重新抽取)。

分析实时更新问题:

前面的等概率抽取的情况,必须在总数n确定的情况下才能够进行,而实时更新问题,在n的数量级与抽取的数量较小时且机器性能较好时,能够做到一定的“假实时更新”,而此网站数量访问量庞大且总数n是动态变化的,所以前一种思路不能够解决这个问题。


解决思路

分为两种情况:
  • 幸运用户名单还没满:前100个直接选入,因为总数n < 入选人数k,入选成功率为100%
  • 幸运用户名单已经满了:100个之后,第n个用户,要使得当前的用户以 100 / n的几率入选,而入选的同时,幸运用户名单中要有一个以1 / 100的几率被淘汰出去。
算法之外需要做的事
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值