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

    问题:

    蓄水池抽样问题是,从一个长度为n的流中随机选取k个元素,使得n个元素中的每个元素都以相同的概率被采样到,通常情况下n是一个未知的很大的数目,而且无法将其载入主存中。

     

    算法的正确性证明

    定理:该算法保证每个元素以 k / n 的概率被选入蓄水池数组。

    证明:首先,对于任意的 i,第 i 个元素进入蓄水池的概率为 k / i;而在蓄水池内每个元素被替换的概率为 1 / k; 因此在第 i 轮第j个元素被替换的概率为 (k / i ) * (1 / k) = 1 / i。 接下来用数学归纳法来证明,当循环结束时每个元素进入蓄水池的概率为 k / n.

    假设在 (i-1) 次迭代后,任意一个元素进入 蓄水池的概率为 k / (i-1)。有上面的结论,在第 i 次迭代时,该元素被替换的概率为 1 / i, 那么其不被替换的概率则为 1 - 1/i = (i-1)/i;在第i 此迭代后,该元素在蓄水池内的概率为 k / (i-1) * (i-1)/i = k / i. 归纳部分结束。

    因此当循环结束时,每个元素进入蓄水池的概率为 k / n. 命题得证。

    解法:

    算法首先创建一个长度为 k 的数组(蓄水池)用来存放结果,初始化为 N的前 k 个元素。然后从 k+1 个元素开始迭代直到数组结束,在 N的第 i 个元素,算法生成一个随机数 j[1,i]j∈[1,i], 如果 j <= k, 那么蓄水池的第 j 个元素被替换为 N 的第 i 个元素。

    伪代码:

    1 Init : a reservoir with the size: k 
    2 for i= k+1 to N
    3      j=random.randint(1, i);
    4         if( j < k)
    5              SWAP the jth value and ith value
    6    end for
  • 相关阅读:
    mybatis 动态sql
    linux shell 之 crontab(定时任务)详解
    FTP定时批量下载文件(SHELL脚本及使用方法 )
    腾讯云数据库团队:MySQL5.7 JSON实现简单介绍
    Chisel Tutorial(七)——模块
    大数问题解决模板
    可靠的功能測试--Espresso和Dagger2
    hdoj 1698 Just a Hook 【线段树 区间更新】
    平衡二叉树
    WPF中DependencyObject与DependencyProperty的源代码简单剖析
  • 原文地址:https://www.cnblogs.com/zle1992/p/8708975.html
Copyright © 2011-2022 走看看