知识复习

空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个有质量保证的结果。

数据流算法:是指数据源源不断地到来,根据到来的数据返回相应的部分结果。适用于两种情况:第一、数据量非常大仅能扫描一次时,可以把数据看成数据流,把扫描看成数据到来。第二、数据更新非常快,不能把所有数据都保存下来再计算结果,此时可以把数据看成是一个数据流。

在一些情况下,空间亚线性算法也叫数据流算法。

水库抽样(海量数据随机抽样问题)(蓄水池问题)

输入:一组数据,其大小未知

输出:这组数据的k个均匀抽样

要求:
仅扫描数据一次。
空间复杂度为O(K)。空间复杂度与整个数据量无关,只与抽样大小有关。
扫描到数据的前n 个数据时(n>k),保存当前已扫描数据的k个均匀抽样。

问题可以理解为:蓄水池(水库)的容量为k,对于n(n>k)个元素,如果第i个元素(i从1逐渐递增至n)以k/i的概率决定是否将它放入蓄水池,当i=n时,蓄水池中存放的是n个元素的均匀抽样,每个数字最终被存在数组中的概率相等,为k/n。见下面的证明

水库抽样算法描述

 

1、申请一个长度为k的数组A保存抽样。
2、保存首先接收到的k个元素
3、当接收到第i个新元素t时,以k/i的概率随机替换A中的元素(即生成[1,i]间随机数j,若j<=k,则以t替换A[j])

Init : a reservoir with the size: k

for i= k+1 to N

    M=random(1, i);

    if( M < k)

     SWAP the Mth value and ith value

end for

  

 
 

证明一

当接收到第i个新元素t时,以k/i的概率保存在水库中,所以在接收第i+1个数时,第i个数还能保存在水库当中的概率是1-1/(i+1),因为在接收到第i+1个数时要以k/(i+1)的概率随机替换,而第i个数被选中的概率是1/k,它们相乘即为1/(i+1)。1/(i+1)为第i个元素被换出水库的概率,所以1-1/(i+1)就是在接收第i+1个元素时第i个元素在数组中的概率。同理,在接收第i+2个元素时,第i个元素让然保留在水库中的概率为1-1/(i+2)。以此类推,当接收第n个元素时,第i个元素保存在水库中的概率为1-1/n。只有这些事件都放生了,最终第i个元素才能保留在水库当中。因此第i个元素最终被保留在水库抽样当中的概率,就是这些事件的概率的乘积,即

 

证明二

 

(1)第一步初始化。出现在水库中的前k个元素,直接保存在数组A中。前k个数被选中的概率都是一致的,都是1。

(2)第二步。在处理第k+1个元素时分两种情况:

情况1:第k+1个元素未被选中,数组中没有元素被替换;此时,数组中每个元素的出现概率肯定是一样的,这很显然。但具体是多少呢?就是第k+1个元素未被选中的概率:1-P(第k+1个元素被选中)=1-k/(k+1)=1/(k+1)。(由于第k+1个元素被选中的概率是k/(k+1)(根据公式k/i))

情况2:第k+1个元素被选中,数组中某个元素被第k+1个元素替换掉。第k+1个元素被选中的概率是k/(k+1)(根据公式k/i),所以这个新元素在水库中出现的概率就一定是k/(k+1)(不管它替换掉哪个元素)。下面来看水库中原有元素最终还能留在水库中的概率,水库中原有数据被替换的几率都相等为1/k。水库中任意一个元素被替换掉的概率是:(k/k+1)*(1/k)=1/(k+1),意即首先要第k+1个元素被选中,然后该元素在k个元素中被选中。那它未被替换的概率就是1-1/(k+1)=k/(k+1)。可以看出来,旧元素和新元素出现的概率是相等的。

(3)第k+1之后面每个元素都重复第二步,即第i (i>k+1)个元素以k/i的概率决定是否将它放入蓄水池,最终所有元素出现在水库中的概率相等。

 
 

水库抽样Reservoir Sampling(蓄水池问题)的更多相关文章

  1. 水塘抽样(Reservoir Sampling)问题

    水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 在高德纳的计算机程序设计艺术中,有如下问题: ...

  2. Reservoir Sampling - 蓄水池抽样

    问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...

  3. Reservoir Sampling - 蓄水池抽样问题

    问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...

  4. Reservoir Sampling 蓄水池采样算法

    https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d htt ...

  5. Reservoir Sampling - 蓄水池抽样算法&&及相关等概率问题

    蓄水池抽样——<编程珠玑>读书笔记 382. Linked List Random Node 398. Random Pick Index 从n个数中随机选取m个 等概率随机函数面试题总结 ...

  6. Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...

  7. 68. 蓄水池抽样(Reservoir Sampling)

    [本文链接] http://www.cnblogs.com/hellogiser/p/reservoir-sampling.html 问题起源于编程珠玑Column 12中的题目10,其描述如下: H ...

  8. 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)

    蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含 ...

  9. 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)

    问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...

随机推荐

  1. Tree-AC训练实录

    Tree-AC比赛记录 2018 ICPC nanjing     Bronze  120/310 ICPC qingdao    Bronze  153/360 2019 ZJPSC        ...

  2. 如何对react进行性能优化

    React本身就非常关注性能,其提供的虚拟DOM搭配上DIff算法,实现对DOM操作最小粒度的改变也是非常高效的,然而其组件的渲染机制,也决定了在对组件更新时还可以进行更细致的优化.  react组件 ...

  3. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

  4. Reference Type Casting

    5.5.1. Reference Type Casting Given a compile-time reference type S (source) and a compile-time refe ...

  5. 微服务Kong(四)——添加插件

    在本节中,您将学习到,如何配置使用KONG的插件来管理您的API.KONG的核心原则之一就是通过插件来实现API的扩展.插件可以使您更为简单的扩展和管理您的API. 在以下的步骤中,您将通过配置key ...

  6. MySQL的连接方式

    连接MySQL操作是连接进程和MySQL数据库实例进行通信.从开发的角度来说,本质上是进程通信.常用的进程通信方式有管道.命名管道.命名字.TCP/IP套接字.Unix域名套接字.MySQL提供的连接 ...

  7. HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)

    Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...

  8. SQL Serever学习11——数据库的安全管理

    公司管理软件设计完成,但是日常工作繁忙,向领导提出增加几个管理员,帮助管理和维护系统,领导同意了,但是要求一定要管理好这几个管理员用户,保证数据库的安全. 修改身份验证模式 数据库验证机制 sqlse ...

  9. xcopy命令的其他参数

    xcopy /s /e /h "c:\123" "D:\123\" 后面多一个斜杠,让程序知道是目录 以下还给您提供了 xcopy 命令的其他参数: /A 仅复 ...

  10. Jquery Ajax 复杂json对象提交到WebService

    在ajax的已不请求中,常常返回json对象.可以利用json.net给我们提供的api达到快速开发. 例子: using System;using System.Collections;using ...