码迷,mamicode.com
首页 > 编程语言 > 详细

蓄水池算法

时间:2015-11-01 22:36:56      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

问题:

如何从N个元素中等概率抽取K个元素(N > K)

 

方法:

首先构建一个可放k个元素的蓄水池,将序列的前k个元素放入蓄水池中,然后从第k+1个元素开始,以k/i (k<i<=n)的概率来决定该元素是否被替换到池子中,并且从池子中等概率淘汰一个球。

    1. 对于第i个数(i<k),在前k步被选中的概率是1, 从第k+1步开始,i不被选中的概率为k/k+1,那么读到第n个数时, 第i个数(i<k)被选中的概率 = 被选中的概率 * 以后每一步都不被换走的概率,即
      1 * k/k+1 * k+1/k+2 n-1/n = k/n

    2. 对于第j个数(j>=k)被选中的概率为: 在他出现时被选中的概率 * 在他出现以后不被换走的概率,即: 
      k/j * j /j+1 。。。n-1/n = k/n

    3. 综上得证。

 

应用:

玩家登陆的那一刻即可知道是否中奖,不用等到收集完所有上线玩家,且只需维护一个中奖池而不是一个玩家池。

蓄水池算法

标签:

原文地址:http://www.cnblogs.com/encode/p/4928666.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!