【大数据算法】蓄水池抽样算法_weixin_30633507的博客-程序员秘密

技术标签: 面试  python  大数据  

一、题目来源:

    这个题目的由来是周围有人讨论到去面试(某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()
六、总结归纳
怎么说呢,实在是太佩服这个想法了,好好学习领悟吧。
 



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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30633507/article/details/97270782

智能推荐

Linux 备份与恢复(dump、restore命令)_restore mode_Zheng__Huang的博客-程序员秘密

  服务器管理中,定时备份并在必要时恢复是保障服务器稳定运行的必要条件。下面我们就来了解Linux备份与恢复的相关知识。备份概述 备份对象Linux系统中,需要进行备份操作的重要目录主要有:目录说明/root超级用户家目录/home普通用户的家目录/var/spool/mail系统邮件目录(如果有)/etc配置文件目录/boot系统启动相关目录/var/log系统日志(用于事故调查)另外,还有一些对服务器重要的数据资料(apa.

转载:一篇文章了解相见恨晚的 Android Binder 进程间通讯机制_cc0410的博客-程序员秘密

概述最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而各种函数之间花式跳转,看的我都怀疑人生。毫不夸张的讲每看一遍都是新的内容,跟没看过一样。后来又看到了Gityuan的博客看到了一些图解仿佛发现了新大陆。下面就以图解的方式介绍下Binder机制,相信你看这篇文章,一定有所收获。什么是 Binder?Binder是Android系统中进程间通讯(IP

android USB Accessory_android usbaccessory_bzzbzz7的博客-程序员秘密

AOA插上,系统广播接收不到Intent(包含ACCESSORY_ATTACHED Action),但是activity能够收到系统发送的Intent(包含ACCESSORY_ATTACHED Action) 1 在AOA插上,activity能够收到系统发送的Intent(包含ACCESSORY_ATTACHED Action) <intent-filter> <actio

触摸屏:Linux输入子系统:多点触控协议_星号的博客-程序员秘密

转载:http://blog.csdn.net/droidphone/article/details/8434768 简介 ------------ 为了发挥新近的多点触摸和多用户设备的强大功能,为多点触摸定义一种上报详细数据的方法(比如有多个物体直接接触到设备的表面),是非常有必要的。这篇文档描述了多点触摸协议(multi-tou

配置centos网络yum源_centos 5.5 yum源_china0551021的博客-程序员秘密

centos默认的网络源为官方源,官方源为国外的站点,下载与更新速度有点慢,这时将网络源设置为国内的就会比较完美了,国内的开源镜像站点主要有:阿里云、网易、清华大学。在这里我将以阿里云、网易的进行演示。先备份CentOS-Base.repo,以后可随时恢复。下载新的CentOS-Base.repo 到 /etc/yum.repos.d/ 目录下。# 阿里的 ,根据自己的版本选择下载[[email protected] ~]# wget -O /etc/yum.repos.d/CentOS-Base..

NTFS中的$MFT详解_vrix的博客-程序员秘密

NTFS是Windows NT引入的新型文档系统,他具备许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文档在NTFS卷上的分布。NTFS中,卷中任何存放的数据均在一个叫$MFT的文档中,叫主文档表(Master File Table)。而$MFT则由文档记录(File Record)数组构成。File Record的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linux中的i

随便推点

二分图最大匹配及常用建图方法_「已注销」的博客-程序员秘密

转载百度文库算法———艺术二分图匹配剖析很多人说,算法是一种艺术。但是对于初学者的我,对算法认识不是很深刻,但偶尔也能感受到他强大的魅力与活力。这让我追求算法的脚步不能停止。下面我通过分析匈牙利算法以及常用建图方式,与大家一起欣赏算法的美。匈牙利算法匈牙利算法是用来解决最大二分图匹配问题的,所谓二分图即 “一组点集可以分为两部分,且每部分内各点互不相连,两部分的点之间可

全排列和去重全排列---递归实现_fern_girl的博客-程序员秘密

一、全排列的概念: 根据360百科,我们知道从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。二、全排列的算法:递归实现全排列(存在重复数字交换问题,于是又有了第二种方法)去重全排列非递归实现全排列(循环交换,由小到大)三、接下来我们学习第一种方法—–递归实现全排列算法实现:#include<s

关于WinNT和WinCE中使用NTP协议_wince ntp_穿女装的程序员的博客-程序员秘密

这篇文章是目前能搜索到的包括完整的代码及文档的最完整的Windows平台使用NTP的示例;NTP工作原理:转自:http://blog.163.com/yzc_5001/blog/static/2061963420121283050787/相关文档下载地址:http://download.csdn.net/detail/passfuhao/9583415

where()_qwbtc的博客-程序员秘密

可以对Subject.where(id: [12, 23, 11, 22, 44])可以对一个数组进行查找, 得到数组中id号的多个subject实际应用:_subject.html.erb中:########!!!!重要!!!!非常重要=》" /> 其中value=的值即为选中checkout时params传递的值, 所以此html中要value="", 当选中checkout时传递

J2EE基础 用Struts框架开发MVC系统步骤_j2ee开发系统的步骤_wqxbc的博客-程序员秘密

由于Struts已经为我们提供了一个非常好的MVC框架,我们利用Struts开发MVC系统时可以大大加快开发的速度。在开发时可以采用的一个开发流程如下:   1. 收集和定义应用需求。 2. 基于数据采集和显示的原则定义和开发"屏幕显示"需求 。 3. 为每一个"屏幕显示"定义访问路径。 4. 定义ActionMappings建立到应用业务逻辑之间的联系。 5. 开发满足"屏幕

使用Spring的IOC案例(基于XML/注解)_friendA3103的博客-程序员秘密

数据库:create table account( id int primary key auto_increment, name varchar(40), money float)character set utf8 collate utf8_general_ci;insert into account(name,money) values('aaa',1000);inser...