【游戏算法】蓄水池算法在抽奖中的应用

蓄水池算法

分析一下蓄水池算法在抽奖中的应用。

应用场合

考虑参加抽奖的用户基数很大且未知,也可以说是这个基数可能会动态地增加,那么在这种情况下,固定选取k个人中奖,如何保证实时参加抽奖的n个用户中每个人中奖的概率为k/n呢?(为何不在最终结果n出来时再来随机抽取k个样本,保证概率为k/n呢?其实这种想法有些时候是不可行的,数据是动态增长的,可能缓存系统存储不了所有的样本信息,但却足够存储k个样本的信息,即空间复杂度可以从O(n)降到O(k),k相对n来说是非常小的。所以储水池算法还是很有应用价值的)

具体步骤

1.先把前k个数放入蓄水池

2.对第i(i>k)个样本,以k/i概率决定换入蓄水池,换入时又随机选取池里的一个样本作为替换项

3.一直做下去,对于任意的样本空间n,对单个样本的选取概率为k/n

复杂度

时间复杂度O(n)

空间复杂度O(1

)

参考文章

https://kknews.cc/tech/om2jgrq.html

posted @ 2020-10-10 21:33  鸵鸟洵  阅读(362)  评论(0编辑  收藏  举报