[本文链接]

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

68. 蓄水池抽样(Reservoir Sampling)的更多相关文章

  1. 随机抽样问题(蓄水池问题Reservoir Sampling)

    转自:孤影醉残阳 http://hi.baidu.com/siyupy/item/e4bb218fedf4a0864414cfad 随机抽样问题(蓄水池问题Reservoir Sampling) 随即 ...

  2. 水塘抽样(Reservoir Sampling)问题

    水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 在高德纳的计算机程序设计艺术中,有如下问题: ...

  3. 水库抽样Reservoir Sampling(蓄水池问题)

      知识复习 空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到 ...

  4. Reservoir Sampling 蓄水池采样算法

    https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d htt ...

  5. Reservoir Sampling - 蓄水池抽样

    问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...

  6. Reservoir Sampling - 蓄水池抽样问题

    问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...

  7. 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)

    蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含 ...

  8. 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)

    问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...

  9. 蓄水池抽样算法 Reservoir Sampling

    2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求 ...

随机推荐

  1. 我的android学习经历34

    用类对象作为ArrayAdapter绑定的基本数据类型(和SimpleAdater效果类似) 一般ArrayAdapter绑定的基本数据类型是String,接下来介绍一下类对象作为基本数据类型: 首先 ...

  2. Sprint(第四天11.17)

    燃尽图

  3. KDE、GNOME 和 XFCE 桌面比较

    KDE.GNOME 和 XFCE 桌面比较   这么多年来,很多人一直都在他们的 linux 桌面端使用 KDE 或者 GNOME 桌面环境.在这两个桌面环境多年不断发展的同时,其它的桌面也在持续增加 ...

  4. IndexOutOfBoundsException ArrayList 访问越界

    java.lang.IndexOutOfBoundsException: Index: 3, Size: 2

  5. Linux 系统启动过程

    linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行init. 系统初始化. 建立终端 . 用户登录系统. 内核引 ...

  6. 整理一下以前的Html+css3复习笔记

    一.html5新特性  常用语义标签:nav footer header section mark  功能标签 video audio iframe canvas(画布和绘图功能)  input新ty ...

  7. src与href

    href是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接. src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求src资源时会将其指向的 ...

  8. springmvc__SimpleUrlHandlerMapping(对访问地址进行加工,以键值对的形式)

    1.配置web.xml(这里配置url-pattern为/) <!-- 编码过滤器 --> <filter> <filter-name>characterEncod ...

  9. 基于双向链表的增删改查和排序(C++实现)

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表 ...

  10. jQuery实现加入购物车飞入动画效果

    <script src="jquery.js"></script> <script src="jquery.fly.min.js" ...