蓄水池算法介绍和证明[原创]

蓄水池算法要解决的问题就是在不知道流入数据量多少的情况下,依旧可以随机从这些数中选取K个,乍一听好神奇,其实分析一下背后的概率知识,思想还是很简单的,相信看完我的介绍和证明,你也会觉得很简单。

假设要求随机选择K个元素,假设一共流入的元素有n个。

  首先数组a[0...k-1]表示最后返回的结果,最开始流入的k个元素依次放入a[0...k-1]中;

  那么从第k+1到第n个元素每一次都有可能把数组a中的元素踢走换成自己,假设现在流入了第i个元素,搞个随机数生成器,pos=rand()%i,如果pos<k,那么就把这个元素放到pos这个位置上,把以前这个位置上的元素剔除。

  最后,返回数组a就可以了,就是概率相等的k个元素。

下面来证明所有的元素都是等概率的:

首先,来看第1~k个元素:

最后存在的概率是:

1*[k/(k+1)]*[(k+1)/(k+2)]*[(k+2)*(k+3)]*...*[(n-1)/n]=k/n

来分析一下,前k个元素,初始选中概率为1,后面每增加一个元素把前k个元素中的某一个替换掉的概率依次是[k/(k+1)],[(k+1)/(k+2)],[(k+2)*(k+3)]。。。

这样到最后一个元素,分子分母相约,得到概率是k/n;

再看第k+1~n个元素:

从第k+1开始,k+1<= i <=n,现在有i-1个元素,进来一个元素时选中它的概率是k/i,而后面的元素再把它替换掉的概率是:

[i/(i+1)],[(i+1)/(i+2)],[(i+2)*(i+3)] ... [(n-1)/n]

最后得到概率是[k/i]*[i/(i+1)]*[(i+1)/(i+2)]*[(i+2)*(i+3)]* ... *[(n-1)/n]=k/n

综上,得到蓄水池算法得到k个元素都是等概率的。

时间: 2024-10-16 05:21:21

蓄水池算法介绍和证明[原创]的相关文章

[原创]jQuery的this和$(this)

网上有很多关于jQuery的this和$(this)的介绍,大多数只是理清了this和$(this)的指向,其实它是有应用场所的,不能一概而论在jQuery调用成员函数时,this就是指向dom对象. $(this)指向jQuery对象是无可厚非的,但this就是指向dom对象,这个是因为jQuery做了特殊的处理. 在创建dom的jQuery对象时,jQuery不仅仅为dom创建一个jQuery对象,而且还将dom存储在所创建对象的数组中. elem = document.getElement

[原创]对结对编程的感受

本周出于老师作业的要求,本周体验了一下结对编程,刚开始还觉得这没什么稀奇,一样都是编程嘛,体验了之后才知道结对编程的优点. 结对编程,从字面上讲,就是两个人一起编程.而1+1=?这个问题一直是一个疑问,可以大于2,可以等于2,可以小于2,从这次编程经历看来,结对编程(至少是我们这次结对编程),这个式子的答案应该是大于2. 关于结对编程的许多优点和好处,在邹欣老师的博客中http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html都可以看到

[原创]国外iOS开发资源

这个网站 http://www.scoop.it/t/pandalit 的iOS开发内容挺丰富的,以前自己都是拿网上的第三方库来达到自己所希望获得的效果,看了看这网站的内容,我觉得我有必要去写些自己想要的code效果了.

[原创]收集比较有意思的iOS开源项目

IOS研究之美女图片采集器实现(源码+解析)详解(四十七) IOS研究之智能聊天机器人实现(源码+解析)详解(四十八)

[原创]iOS 简化冗余代码

正在给深圳某家智能家居开发iPad版本,在已经存在的iPhone版上修改,该app的界面采用的是xib.xib相比代码来写界面,快速高效,但是可维护性和可读性太差.言归正传,看到这些代码后,我的心情很复杂. 任何一门编程领域,任何人都可以参与,就拿iOS开发来说,有的人写出的代码是能执行,但不仅仅要求是能执行,当项目的功能不断增加时,不整洁的编写风格会让人看着想吐,就不用谈什么可维护性了,简直是一团糟. else if (devTypeID==13||devTypeID==14) { XRDim

[原创]修正DejalActivityView在iOS8之前系统上存在的Bug

DejalActivityView是国外的第三方库,可自定义文本内容和文本长度的菊花转加载指示器效果.该第三方库与其它hud存在不同,能够遮盖键盘:可以自定义遮盖NavigationBar或不遮盖NavigationBar,能够在status bar显示activity view等效果.该库github地址:https://github.com/Dejal/DejalActivityView DejalActivityView在iOS 8 之前的系统上存在bug,今天使用github上的最新版本

[原创]mac终端前面的计算机名怎么改??

1.修改-之前的名称 mac环境,系统 OS X Yisemite,打开终端, 执行下面命令“Tmp”是你想要改的电脑名称 sudo scutil --set HostName Tmp 执行前,执行后对比: 成功修改,大功告成!(ps:执行过后命令,需要强行退出终端,重新打开就好了) 2.如果想修改-之后的名称,那就修改当前管理员名称即可:

算法初级面试题07——前缀树应用、介绍和证明贪心策略、拼接字符串得到最低字典序、切金条问题、项目收益最大化问题、随时取中位数、宣讲会安排

第六课主要介绍图,不经常考,故今天先讲第七课的内容,介绍比较常考的树和贪心算法 介绍前缀树 何为前缀树? 如何生成前缀树? 可以查有多少个字符串以"be"为前缀. 如果要判断有没有"be"这个节点,每个节点上加上一个数据项,有多少个字符串以当前节点结尾的(可以查加了多少次特定字符串). 给一个字符串.返回多少个字符串以这个为前缀. 再加一个数据项,记录该节点被划过多少次. 大概实现: 删除逻辑: 根据path是否变为0,来判断是否继续往下删. 可以解决以下问题: 一

采样方法(二)MCMC相关算法介绍及代码实现

采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Dark_Scope/article/details/78937731 0.引子 书接前文,在采样方法(一)中我们讲到了拒绝采样.重要性采样一系列的蒙特卡洛采样方法,但这些方法在高维空间时都