海量数据等概率选取问题

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

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

i = 0
while more input lines
    with probability 1.0/++i
        choice = 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 N
    m = 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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/archive/2012/09/09/2677267.html

时间: 2024-11-05 19:00:18

海量数据等概率选取问题的相关文章

按概率随机选取

上一篇笔记的pygame游戏对敌人和白云的移动速度使用了随机函数randint(),游戏体验不是太好.如果是按概率随机选取设置速度的话,游戏体验会好一些. 据我了解,random.choice(seq)是等概率选取一个,不是我想要的.而 numpy.random.choice(seq, p, k)是按概率随机重复选取多个,这正是我想要的. 但是,我不想为这么一个函数引入巨大的numpy库,所以打算自己实现一个按概率随机选取的函数. 特此将代码记录如下: # 作者:hhh5460 # 时间:201

mysql 海量数据的存储和访问解决方案_Mysql

第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式.水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性:通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题:通过读写分离

不惧海量数据 软件定义存储助力媒资行业转型

    导读:高清.超高清电视.3D电影.互联网媒体等新应用已经把媒资行业推到IT转型的"风口浪尖".如何适应当前节目制播模式,主动应对海量数据,在存储空间.应用性能.数据管理和投资成本方面进行合理平衡,成为媒资行业IT转型成功的关键.浪潮推出以AS13000为核心的软件定义存储解决方案,提供96PB的超大存储空间.100GB的高带宽和数据智能管理平台,助力媒资行业成功转型. 海量数据,驱动媒资转型 近几年高清.超高清电视.3D电影.互联网媒体等新应用层出不穷,当前大众消费媒体的方式也

程序员眼中的统计学(3)】概率计算:把握机会

概率计算:把握机会 1 随机试验 1 随机试验的定义 我们将对自然现象的一次观察或进行一次科学试验称为试验. 2 随机试验的举例 举例1:硬币试验 E1: 抛一枚硬币,观察正(H)反(T) 面的情况. E2: 将一枚硬币抛三次,观察正反面出现的情况. E3: 将一枚硬币抛三次,观察出现正面的情况. E4: 电话交换台一分钟内接到的呼唤次数. E5: 在一批灯泡中任取一只, 测试它的寿命. 举例2:数学家去赌场 新闻:数学家3年赌赢156亿人民币,数学家在赌场里有什么优势? 令19名数学家惊喜的是

小议sqlserver数据库主键选取策略_MsSql

因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误.当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了.主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致.所以数据库在设计时,主键起到了很重要的作用. 常见的数据库主键选取方式有: 自动增长字段 手动增长字段 UniqueIdentifier "COMB(Combine)"类型 一.自动增长型字段 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单.

海量数据催生CMO与CIO合作 酝酿新商机

本文讲的是海量数据催生CMO与CIO合作 酝酿新商机,话起海量数据.大数据已不再限于概念和技术层面,当今业者讨论的更多是价值和实施层面.产生如此之大的转变源自大数据切切实实的开始为企业.为业务.为经营带来巨大的价值.浩瀚的数据海洋充满了客户的参数和特征,为CMO(首席营销官)提供了感知客户的基础和沃土,也提供发现商机的手段和条件. 经济是技术革新的催化剂 数据是洞悉商机的加速器 从历史角度看,每一次技术革命步伐总伴随着经济环境动荡的阵痛.第一次是以机器减少人力,以大规模工厂化生产取代个体工场手工

华夏银行:大数据时代 商业银行该如何治理海量数据?

ZD至顶网CIO与应用频道 03月11日 北京消息: "激烈的市场竞争趋势和日趋严格的外部监管要求,对我们商业银行数据的准确性提出了更高的要求.在大数据时代,如何有效治理结构化.半结构化和非结构化的海量数据,是我们现在重点考虑的问题.为保证数据的健康发展,我们将通过建立健全的大数据治理体系,推动业务发展的全面提升." --华夏银行股份有限公司架构部 商业银行的新课题 华夏银行股份有限公司(以下简称华夏银行)是一家综合实力非常强的全国性股份制商业银行.经过20多年的发展,目前,华夏银行在

对于坐拥海量数据的金融企业来说,大数据治理意味着什么?

玉不琢不成器,一块没有经过雕琢的美玉,需要经过琢磨打造之后,才能显现出它的真正价值.对于金融企业来说,数据不只包括自身业务系统中为支撑正常业务流转的数据,还包括从外界交易流中收获的大量第三方数据,这些数据就像是未经雕琢的美玉,需要"大数据治理"这一"雕琢"的过程来对数据进行价值发现. 对于坐拥海量数据的金融企业来说,大数据治理意味着什么? 责任编辑:editor004 |  2016-10-10 11:09:15 本文摘自:C114中国通信网 玉不琢不成器,一块没有

悄悄告诉你:华夏银行海量数据的治理策略

银行的信息化,从来都与高可靠与低风险相关.随着银行面对互联网金融的冲击,以"客户为中心"战略成为银行的核心竞争力之一.如何充分挖掘自身业务潜力?答案当然是数据!数据是银行的最重要资产. 本文将悄悄告诉你华夏银行海量数据的治理策略,华夏银行是国内排名最为靠前的商业银行之一,无论是资产规模还是服务质量都有据可查,笔者就是华夏银行的客户之一.说点官方数据:华夏银行目前在87个中心城市设立了38家一级分行.43家二级分行和10家异地支行,营业网点达到638家,形成了"立足经济发达城市