一、题目来源:

这个题目的由来是周围有人讨论到去面试(某8)的时候遇到了这个问题。另外正好HIT有个视频也有这个内容,故记录一下:

二、题目描述
    该人面试的时候问的是:
  1. 如何从二进制文件中等概率取整数?
    这个题目说的有点不清楚实际上是:一个二进制文件中有好多好多整数,你要随机取出一个。
三、题目分析
    这个问题的难点就在于你开始不知道有多少的整数,也就是说这个(1/n)你不知道n是多少。    

    这里我们要用到蓄水池抽样算法,这个算法的思想很简单,我们待会再看,先看上面的题目。
四、题目解法
    1)解法如下:
首先我们取到第一个数(暂时取的最后要不要还不一定呢),然后对第二个数以1/2的概率来确定是否                    用第二个数来替换他,然后对第二个数以1/3的概率来确定是否用第三个数来替换他。。。。一直这样下去直到第n个数。
经过上面的这个过程我们发现每个数取到的概率都变成了(1/n)。证明如下:
总结起来就是一句话每个数取到的概率等于取到该数且取不到该数后面所有数的概率。
如:取到第10个数的概率等于取到第十个数且取不到第11到第n个数的概率
现在我们回到较复杂的情况,也就是如何在一个N个数(开始不知道N是几)中随机取M个数。其实思想是一样的,就是先取出前M个,然后对后面的开始每个以(k/(i))的概率进行替换,这样我们得到的就是所要的结果,证明如下:
五、题目实现
OK!下面是python的代码实现
 
  1.  1 import random
     2 import copy
     3
     4 def reservoirSampling(seq, k):
     5     localSeq = copy.deepcopy(seq)
     6     N = len(localSeq)
     7     for i in xrange(k, N):
     8         M = int(random.uniform(0, i))
     9         if M < k :
    10             temp = copy.deepcopy(localSeq[M])
    11             localSeq[M] = copy.deepcopy(localSeq[i])
    12             localSeq[i] = temp
    13     return localSeq[0:k]
    14 def main():
    15     a = [4,5,6,3,4,7,7,4,3,3,2,4,5,5,6,9,5,4,3,45,3,23,44,55,33,5,8]
    16     k = 5
    17     print reservoirSampling(a, k)
    18 if __name__ == '__main__':
    19     main()

六、总结归纳
怎么说呢,实在是太佩服这个想法了,好好学习领悟吧。
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/MrLJC/p/4113276.html

【大数据算法】蓄水池抽样算法相关推荐

  1. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  2. 蓄水池抽样算法(reservoir sampling)

    蓄水池抽样算法(reservoir sampling) 场景:在长度未知的数据流中,等概率地采样一定数量的数据.即,数据量N未知,若要求采样k个数据,采样概率保证kN\frac{k}{N}Nk​. 要 ...

  3. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  4. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  5. 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)

    分类目录:<机器学习中的数学>总目录 蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度NNN很大, ...

  6. LeetCode Random Pick Index(蓄水池抽样算法)

    问题:给出一个数组,存在相同的数,随机输出目标数所在的下标 思路:使用蓄水池抽样算法,当第一次找到目标数时,作为选取.接着如果随机数等于0,则选取.在遍历完后,直接返回选取的值 具体代码参考: htt ...

  7. 大数据相关技术和算法

    大数据的关键技术: 大数据的关键技术分为分析技术和处理技术,可用于大数据分析的关键技术主要包括A/B测试,关联规则挖掘,数据挖掘,集成学习,遗传算法,机器学习,自然语言处理,模式识别,预测模型,信号处 ...

  8. 字王:大数据与黑天鹅算法2.0

    字王:大数据与黑天鹅算法2.0 wiki百科:"黑天鹅"隐喻那些意外事件:它们极为罕见,在通常的预期之外. 如果一种理论.模型和算法,能够在一年内,捕获一只黑天鹅,无疑是成功的.科 ...

  9. 大数据的几大经典算法

    大数据的几大经典算法 一. CART: 分类与回归树 CART, Classification and Regression Trees.在分类树下面有两个关键的思想:第一个 是关于递归地划分自变量空 ...

最新文章

  1. python樱花树画法图片_用Python敲出樱花绽放 | 附代码
  2. 解析没有id的html,网络爬虫干货,还在用正则匹配html?专业的解析组件了解一下...
  3. hibernate主配置文件中指定session与当前线程绑定
  4. Python语言程序设计之Python3 SMTP发送邮件
  5. vivado 综合报错 “ incorrect freePtr. Call out of sequence? “
  6. 黑盒攻击的分类_「图像分类」图像分类中的对抗攻击是怎么回事?
  7. Android 微信分享
  8. java 域_java四大域总结
  9. php取出多维数组的所有元素,php - 获取多维数组PHP中两个元素之间的所有数组 - SO中文参考 - www.soinside.com...
  10. python编程软件哪个好-来 看看谁最适合学Python编程
  11. 34. Element textContent 属性
  12. 华为云AI随笔(2)
  13. 解决mysql.sock连接不上问题:Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2)
  14. Java jmap与jcmd命令dump内存heap堆
  15. 解决ios以及mac yyyy-MM-dd HH:mm:ss格式不兼容
  16. 有个名叫史太滩的珠宝商带着块鸡蛋大的宝石乘船过江
  17. feifeicms 火车头文章采集 自动图片本地化
  18. indesign怎么查找拼音_用Indesign CS 巧排拼音的方法
  19. 一行代码引发的集群服务宕掉的血案分析
  20. 洛谷9月月赛 康娜的线段树

热门文章

  1. 代码没问题,请求无响应,超时
  2. js 数组修改watch_前端面试:专注Vue.js常见的问题答疑,掌握了基本上Vue就过关了...
  3. 调用手机相机相册_如果你用华为手机拍照!记得开启专业模式,照片好看十倍不止...
  4. 算法的威力:法国人用台式机打破由超级计算机创造的圆周率运算世界记录
  5. PKUWC2020游记与题面整理
  6. Luogu P5564 [Celeste-B]Say Goodbye (多项式、FFT、Burnside引理、组合计数)
  7. java在td中怎么用if_不在Java中使用if语句
  8. java 单引号的字符串类型_Java程序以字符串形式显示双引号和单引号
  9. Python学习笔记(二)——HelloWorld
  10. [ZJOI2008]瞭望塔