蓄水池算法
假如某个网站每日有1亿+的用户量访问,而今天有一个活动,需要抽取100个在今天登陆的幸运用户,要求:
- 要求每个用户被选中的概率是相等的;
- 这100个幸运用户实时更新,在当日的24点过后马上公布名单;
问题分析
首先分析等概率问题:
一般情况下,在需要等概率的情况下,我们只需要在总数n个中,抽取1个,连续抽取k次(遇到已经抽过的再放回重新抽取)。
分析实时更新问题:
前面的等概率抽取的情况,必须在总数n确定的情况下才能够进行,而实时更新问题,在n的数量级与抽取的数量较小时且机器性能较好时,能够做到一定的“假实时更新”,而此网站数量访问量庞大且总数n是动态变化的,所以前一种思路不能够解决这个问题。
解决思路
分为两种情况:
- 幸运用户名单还没满:前100个直接选入,因为总数n < 入选人数k,入选成功率为
100%
- 幸运用户名单已经满了:100个之后,第n个用户,要使得当前的用户以
100 / n
的几率入选,而入选的同时,幸运用户名单中要有一个以1 / 100
的几率被淘汰出去。