zoukankan      html  css  js  c++  java
  • 68. 蓄水池抽样(Reservoir Sampling)

    [本文链接]

    http://www.cnblogs.com/hellogiser/p/reservoir-sampling.html

    问题起源于编程珠玑Column 12中的题目10,其描述如下:

    How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select and print one random line, when you don’t know the number of lines in advance?

    (1)在不知道文件总行数n的情况下,如何从文件中随机的抽取一行?

    解:先选择第一个行,并使用1/2的概率选择第二个行,使用1/3的概率选择第三行,使用1/i的概率选择第i行,以此类推。在过程结束时,每个对像被选中的概率都是1/n。

    用P(i)表示处于第i行时第i行被选中的概率。

    P(1)=1

    P(2)=1/2

    P(3)=1/3

    则选择第3行的时候,对于第1行来讲选中的概率=第一行被选中概率*第二行没被选中*第3行没被选中概率。

    p(1)all=P(1)*(1-P(2))(1-P(3))=1/3

    p(2)all=P(2)*(1-P(3))=1/3

    p(3)all=P(3)=1/3

    证明:

    1最终被选中的概率:1被选中的概率*2没有被选中的概率*3没有被选中的概率*…*n没有被选中的概率

    p(1)all=1*(1-1/2)(1-1/3)*…*(1-1/n)=1/n

    m最终被选中的概率:m被选中的概率*m+1没有被选中的概率*m+2没有被选中的概率*…*n没有被选中的概率(1<=m<n)

    p(m)all=1/m*[1-1/(m+1)][1-1/(m+2)]*…*[1-1/n]=1/n

    (2)对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?

    给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)。

    解:先选中前k个, 从第k+1个元素到最后一个元素为止, 以k/i (i=k+1, k+2,...,N) 的概率选中第i个元素,并且随机替换掉一个原先选中的元素, 这样遍历一次得到k个元素, 可以保证完全随机选取。

    证明:

    n最终被选中的概率: n被选中的概率*[(n+1)没有被选中的概率+(n+1)被选中概率*n没被替换的概率]

    p(n)all=k/n*[(1-k/(n+1))+k/(n+1)*(1-1/k)]=k/(n+1)

    【参考】

    http://www.cnblogs.com/ttltry-air/archive/2012/08/10/2632215.html

    [本文链接]

    http://www.cnblogs.com/hellogiser/p/reservoir-sampling.html

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    Android getResources的作用和需要注意点
    Android 中的Affinity
    关于Android下各个布局方式里面LayoutParams的用法
    kaifa xin
    imageVIew
    实验三 区域四连通填充算法
    实验四 二维几何变换
    OpenGL开发库的详细介绍zz
    附加实验2 OpenGL变换综合练习
    实验3 OpenGL几何变换
  • 原文地址:https://www.cnblogs.com/hellogiser/p/reservoir-sampling.html
Copyright © 2011-2022 走看看