【需求】给定一个数据流,数据流长度N非常大,且N直到处理完所有数据之前都不可知,如何在只遍历一遍数据( 复杂度O(N) )的情况下,随机选取出m个不重复的数据。

这个需求通常会出现在大数据应用案例当中,通常是从大规模的数据集当中选择出一组目标数据。难点在于:
1、由于数据的规模庞大,无法一次性加载到内存中进行处理
2、只遍历一遍
3、要保证随机选取
4、每个数据被选到的的概率均等

这个需求其实和对庞大数据量中求取TOP(N)亦或者对庞大数据文件中的数据进行排序需求都有些相似的地方

我们可以发现,对于这类问题,有共性的解法,只不过在具体实现细节上有差别

共性在于:
1、寻找一个中间桥梁(数据结构容器,数组、队列、堆等等)来容纳求目标需求所必要的数据元素
2、确定数据进、出逻辑(Input、Output)
3、确定桥梁中数据替换办法(确定算法)

拿蓄水池算法来说
1、中间桥梁便可以是一个固定长度数组
2、数据源源不断地读入(一次遍历)、最终遍历完成后将数组数据写出
3、确定数组中容纳的m个数据的替换办法,也就是说对每一个元素,决定其是留在数组还是丢弃,只需保证每个元素被留下的概率均为m/N即可

那么重点在于确定第三点的替换算法

先看其中一个解决办法:我们只通过3个元素来以小见大,数组arr固定长度为2,也就是三选二,问题也就转化为我们让这依次过来的三个元素留在数组中的概率均为三分之二。

假设依次过来的三个元素为A、B、C

开始:
A、B入队,arr[0]=A,arr[1]=B
然后:
过来C,也只剩下C元素,那如何保证A留在数组中的概率为2/3

我们反过来想,是不是只需确保A被C取代的概率为1/3即可

那此时我们已知哪些条件?
1、总共过来了3个元素,3可用
2、数组长度为2,于是2可用
3、数组之外的元素个数为3-2=1,于是1可用

我们的目标就是要得到1/3这个值,那从排列组合角度来讲,我们很容想到,从三个数中任选一个数,那每个数被选中的概率刚好是1/3

也就是说,对于超过数组长度m的数,每来一个(第i个,i=m+1,m+2,m+3…),我们从[1,i]中取一个随机数,如果随机数大小落在数组长度内,我们就替换掉数组长度内的那个对应值,如果落在数组长度外,我们就不替换。

我们来验证这个结论:
还是先以上边的3个示例来验证
因为数组长度为2,对于过来的A、B两个元素,来了直接进数组,如果没有第三个元素,那么
A在数组中的概率为2/2=1
B在数组中的概率为2/2=1
如果有第三个元素(对应C),那么
A存在于数组中的概率为
[1,3]取随机值(取到1A就得被C替换),取到1的概率为1/3,那么取不到1的概率为2/3,则A最终被选中的概率为1*2/3=2/3
B同A
对于C,C想留在数组中,那么从[1,3]中取随机值,取到1或者2,C都可以留在数组中,其概率也为2/3

即符合我们的结论

推广其普适性:对于数组大小为m,流总长度为N,我们对第i个元素进行处理

还是一样,对于i<=m,过来的元素直接进入数组
从第i(=m+1)个元素开始,对[1,i]取随机数,落在[1,m]上则替换,落在[1,m]外则不替换

那么第i个元素,最终在数组中的概率为:第i个元素来的时候进入到数组中的概率*在后续第i+1到N个元素过来时均不被取代的概率

[1,i]中取的随机值落在[1, m]上(记为k): m/i
[1,i+1]中取的随机值落在k以外: (i+1-1)/(i+1) =i/(i+1)
[1,i+2]中取的随机值落在k以外: (i+2-1)/(i+2) =i+1/(i+2)

则第i个元素,最终在数组中的概率为:
m/i * i/(i+1) * (i+1)/(i+2)*…*(N-2)/(N-1)*(N-1)/N=m/N

即与推论吻合。

从蓄水池算法到大数据算法一般性的一点看法相关推荐

  1. 大数据算法_大数据算法解析,如何创建用户画像实现千人千面?

    " 一面科技,一面生活 技术与社交电商的完美融合 打开了全新的幸福视界 " 幸福蜜糖  2020·11·5 大数据算法无处不在 "处在如今的时代中,数据越来越值钱,如何 ...

  2. 《大数据算法》一1.2 大数据算法

    本节书摘来华章计算机<大数据算法>一书中的第1章 ,第1.2节,王宏志 编著, 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.2 大数据算法 这一节我们概 ...

  3. 大数据算法与分析技术国家工程实验室将建设

    国家发展改革委近日正式下发通知,同意由西安交通大学作为承担单位,国家电网公司全球能源互联网研究院作为联合共建单位,筹建"大数据算法与分析技术国家工程实验室". 国网信通部落实公司党 ...

  4. 大数据算法(课后答案总汇)

    第一讲 大数据算法概述 大数据算法概述 第一讲作业 第二讲 亚线性算法 亚线性算法概述 亚线性算法概述单元测验 第三讲 亚线性算法例析 亚线性算法例析 第三讲作业 第四讲 外存算法概述 外存算法概述 ...

  5. 大数据算法系列——布隆过滤器

    大数据算法系列--布隆过滤器 一.简介 Bloom filter介绍 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集 ...

  6. 基于PyTorch重写sklearn,《现代大数据算法》

    HyperLearn是一个基于PyTorch重写的机器学习工具包Scikit Learn,它的一些模块速度更快.需要内存更少,效率提高了一倍. 专为大数据而设计,HyperLearn可以使用50%以下 ...

  7. 大数据算法_【中科大】大数据算法(2020年春季)

    算法与理论是计算机科学的核心领域之一.随着大数据时代的来临,传统的算法理论已经不能很好地解决人工智能. 物联网.工业制造等领域所遇到的实际问题.本门课程主要介绍基于大数据的新型算法技术,如随机采样.数 ...

  8. 漫画趣解大数据算法建模:买瓜

    大数据开发如何转型算法? 算法建模主要做什么?调参为什么玄学? 如何通俗理解算法建模过程.. 夕阳下的村东头,有一人来买瓜. 1 引子(买瓜) 忙碌的一天刚刚结束,村里的小张就匆匆的骑上车,准备买个西 ...

  9. 郦旭东小可爱的大数据算法课程期末复习

    郦旭东小可爱的大数据算法课程期末复习 kmeans问题 kmeans原始问题和kmeans alg算法问题 kmeans问题 kmeans原始问题和kmeans alg算法问题 kmeans 原始问题 ...

最新文章

  1. WebStorm 运行Rect Native 项目
  2. 腾讯精选练习 50 题(Leetcode)笔记 PDF下载!
  3. ppt怎么加注解文字_ppt注释的使用方法
  4. ngrep 比 tcpdump 更方便查看的抓包显示工具
  5. 明日科技的python书籍怎么样_零基础学习Python不可错过的5本书籍
  6. U3D prefab
  7. 深度学习(batch,mini-batch,其它算法)
  8. 从入门到入土:Python requests代理 proxy配置 HTTP
  9. frameset ,iframe的使用
  10. jquery 插件 分析
  11. (16)机器学习_ROC曲线绘制
  12. JMX 和 管理系统简介(一)
  13. 针孔相机畸变成像详解
  14. Android动态更改通知图标,修改通知标志  |  Android 开发者  |  Android Developers
  15. 跑步耳机哪款好用,排行前五的运动耳机推荐
  16. isosurface matlab,matlab isosurface
  17. 线性规划单纯形法python实现与代码详细解读
  18. 杨振宁 莫言 范曾 《开讲啦》
  19. vw 前端_【前端适配】vw+rem自适应适配方案
  20. 浅析日常管理中推进5s管理的4种办法

热门文章

  1. uniapp调用百度智能云身份证识别
  2. 微信红包支付--发放普通红包
  3. 送学计算机男生什么礼物好,【送男生礼物】送男生礼物_送男生|男朋友|老公什么礼物比较好...
  4. 毕达哥拉斯(勾股定理)
  5. Ubuntu16.04安装ROS Kinetic详细步骤
  6. [人工智能-综述-5]:人工智能课程学习的10大基本问题与学习方法的建议
  7. 成功解决需要Xmanager软件来处理X11转发需求
  8. python怎么安装bokeh_安装Bokeh | 交互式数据可视化库Bokeh的安装
  9. Docker迁移备份武林秘籍
  10. 高德地图628一元购狂欢节——O2O 不是说说而已