zoukankan      html  css  js  c++  java
  • 蓄水池算法

    问题:

    如何从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. 综上得证。

    应用:

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

  • 相关阅读:
    ZOJ 3556
    ZOJ 2836
    HDU 2841
    HDU 4135
    POJ 3695
    POJ 2773
    HDU 4407
    HDU 1796
    ZOJ 3688
    ZOJ 3687
  • 原文地址:https://www.cnblogs.com/encode/p/4928666.html
Copyright © 2011-2022 走看看