1、问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行,并且每行被抽中的概率相等?

首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand()函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机。这个概念即蓄水池抽样(Reservoir Sampling)。
有了这个概念,我们便有了这样一个解决方案:定义取出的行号为choice,第一次直接以第一行作为取出choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推,可用伪代码描述如下:

i = 0
while more input lineswith probability 1.0/++ichoice = this input line
print choice

这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。

具体操作可参考如下伪代码:

Element RandomPick(file):
Int count = 0;
while(count <= file.size) If(random(0,count) == 0) picked = file[count]; ++ count;
Return picked 

证明如下:

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

类比下即可得到答案,即先把前k个数放入蓄水池,对于第 i>=k+1,我们以 k/i 概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。
伪代码:

init a reservoir with the size k
add the first k elements into the reservoir
for i = k+1 to Nm = random(1,i);if(m < k)swap the m_th value and i_th value
end for

数学证明:

一些等概率选取相关的题目:

1.等概率随机排列数组(洗牌算法)
问题描述:假设有一个数组,包含n个元素。现在要重新排列这些元素,要求每个元素被放到任何一个位置的概率都相等(即1/n),并且直接在数组上重排(in place),不要生成新的数组。用 O(n) 时间、O(1) 辅助空间。

思路:先想想如果可以开辟另外一块长度为n的辅助空间时该怎么处理,显然只要对n个元素做n次(不放回的)随机抽取就可以了。先从n个元素中任选一个,放入新空间的第一个位置,然后再从剩下的n-1个元素中任选一个,放入第二个位置,依此类推。按照同样的方法,但这次不开辟新的存储空间。第一次被选中的元素就要放入这个数组的第一个位置,但这个位置原来已经有别的(也可能就是这个)元素了,这时候只要把原来的元素跟被选中的元素互换一下就可以了。很容易就避免了辅助空间。
详情:http://www.gocalf.com/blog/shuffle-algo.html

2.单次遍历,等概率随机选取问题 
问题描述:假设我们有一堆数据(可能在一个链表里,也可能在文件里),数量未知。要求只遍历一次这些数据,随机选取其中的一个元素,任何一个元素被选到的概率相等。O(n)时间,O(1)辅助空间(n是数据总数,但事先不知道)。
详情:http://www.gocalf.com/blog/random-selection.html

3.单次遍历,带权随机选取问题
问题描述:有一组数量未知的数据,每个元素有非负权重。要求只遍历一次,随机选取其中的一个元素,任何一个元素被选到的概率与其权重成正比。
详情:http://www.gocalf.com/blog/weighted-random-selection.html

本文转自阿凡卢博客园博客,原文链接:http://www.cnblogs.com/luxiaoxun/archive/2012/09/09/2677267.html,如需转载请自行联系原作者

海量数据等概率选取问题相关推荐

  1. 一次遍历等概率选取字符串中的某个字符

    http://blog.chinaunix.net/uid-7921481-id-3022614.html 存在一个等概率的0.1发生器. 给一个文本流,给定一个指定的字符'x',写一个函数,等概率地 ...

  2. 从n个数中随机选取m个

    咋一看,这是个很简单的问题,但是如果n是个不确定的数呢?比如服务器每天会收到数以亿计的请求,但是目前服务器端不希望保存所有的请求,只想随机保存这些请求中的m个.试设计一种算法,能够使服务器实时保存m个 ...

  3. 电能质量监测平台95概率大值统计流程设计优化

    电能质量监测平台95概率大值统计流程设计优化 Abstract: Calculate the 95% probability values of mass data is a difficult pr ...

  4. SVD分解——潜在语义分析LSA(I)——概率性潜在语义分析PLSA(I)

    SVD分解 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0. 正定矩阵:如果对于所有的非零实系数向量 z z z ...

  5. 【算法】未知长度序列等概率采样

    问题是这样的,给一个序列,长度未知,要求从中随机等概率采样出m个元素. 最直观的解法是首先遍历序列,得到序列长度n,然后以m/n的概率从中随机取出m个元素.先不论从长度为n的序列中如何高效率的随机取出 ...

  6. 概率随机问题【2】 取样与概率

    概率随机问题[1]相关C语言知识:http://blog.csdn.net/hxz_qlh/article/details/12843131 概率随机问题[3]http://blog.csdn.net ...

  7. 【excel】根据单元格公式随机生成人名、及按概率生成不同值的测试数据

    目录 excel根据行号轮流选取不同的填充值 按概率选取填充值 随机生成18位数字(伪身份证号) 生成2到3字的随机人名 注意,在excel中应用公式时,单元格格式应设为常规. excel根据行号轮流 ...

  8. 自动驾驶路径规划——基于概率采样的路径规划算法(RRT、RRT*)

    目录 1. RRT算法背景 1.1 RRT算法核心思想 1.2 RRT算法优缺点 2. 经典RRT算法 2.1 RRT算法流程 2.2 RRT伪代码 3. 基于目标概率采样 4. RRT*算法 4.1 ...

  9. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

最新文章

  1. html 提交表单,图片和文字一起提交,图片存入服务器,图片地址和表单信息存入数据库,带后端php代码
  2. html 中设置样式方式,在html元素中设置css样式的方式是什么
  3. vmware redhat5.4 磁盘阵列 RIDA
  4. macOS完全卸载Android Studio方法
  5. 西瓜创客张平曦:从商业目标出发解决数据治理中的困境
  6. .Net之代码优先gRPC服务
  7. 为什么要使用 Kubernetes 准入控制器
  8. ffmpeg检测文件是否损坏_[音视频] 下载M3U8加密视频文件
  9. java orientation_Java WritableCellFormat.setOrientation方法代码示例
  10. jflash烧录教程_3.烧录方式及烧录软件的使用
  11. 顶级域名、一级域名、二级域名与IP
  12. ADNI数据集阅读整理
  13. CSS知识全面汇总——速查手册
  14. Spring Cloud Ribbon 详解
  15. JavaScript中onblur事件
  16. 用Acrobat打印小册子
  17. Paravirtualization
  18. 【快应用】菜单遮挡内容?教你一招快速搞定!
  19. JavaWeb概述 [JavaWeb]
  20. Python微信点赞

热门文章

  1. 昵图网显示内部服务器错误,为什么博客老是显示网页错误?无法正常打开
  2. Echarts13-- 多条纵轴下控制背景线条数
  3. 易基因|3文一览:简化甲基化测序(RRBS)技术优势及研究成果(医学+物种保护+农学)
  4. 老九学堂之分布式设计教材
  5. juniper:SRX-产品简介
  6. 锦城学院计算机系考研,考研心得分享
  7. python英语单词 扇贝英语安卓下载_扇贝单词英语版
  8. Camtasia“喀秋莎”2022一款录屏神器
  9. 2020年吉林省考申论指导:解题思路总结
  10. 手机计算机怎么玩24点游戏,计算器游戏怎么玩 新手前期玩法介绍