博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【大数据算法】蓄水池抽样算法
阅读量:4555 次
发布时间:2019-06-08

本文共 1240 字,大约阅读时间需要 4 分钟。

一、题目来源:

    这个题目的由来是周围有人讨论到去面试(某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] = temp13     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 = 517     print reservoirSampling(a, k)18 if __name__ == '__main__':19     main()
六、总结归纳
怎么说呢,实在是太佩服这个想法了,好好学习领悟吧。
 

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

你可能感兴趣的文章
第八遍:链接详解
查看>>
Qt5.5 使用smtp发邮件的各种坑
查看>>
js奇葩错误 字符串传递问题
查看>>
人之初,性本恶
查看>>
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>