蓄水池问题

for i in [n+1 N]
  M=rand(1,i)
  if(M<=n)
    swap the ith and Mth data

证明方法:

1.初始情况,当尚未选择时,出现在pool中的n个元素的概率相同都是1,证明当第n+1葛元素以n/(n+1)的概率

被选中时,前n个元素在pool中的概率为n/(n+1)即可;

即任意元素被替换的概率为:n/(n+1)*1/n=1/(n+1)

所以前n个元素被替换的概率为n/(n+1)

1.假设当第i个元素以n/i的概率选中时,前i-1个元素被选中的概率同样n/i

2.证明当第i+1个元素以n/(i+1)的概率选中时,前i个元素被选中的概率同样为n/(i+1)

证明:第i+1个元素的情况为:前i个元素被选中的概率有两种情况:

a:如果第i+1次选择之前,这i个元素在pool中,有假设可知,前ige元素被选中的概率为n/i

b:第i+1此选择没有替换掉现在pool中元素:

先算任意元素被替换的概率:(n/(i+1))*(1/n)=1/(i+1)

因此没有被替换掉的概率为:1-1/(i+1)=i/(i+1)

ab相乘为:n/i*i/(i+1)=n/(i+1);

时间: 2024-12-19 19:40:35

蓄水池问题的相关文章

算法学习之---蓄水池抽样问题

问题:如何在无限大的数据流中随机选取K个数据,保证当前遍历过的i个元素中每一个元素被选中的概率均为 k/i?从而对于n个元素,每个元素被选中的概率均为 k/n. 解:对于前k个元素,我们直接选中放入一个虚拟的蓄水池中,对于第 k+1 个元素,我们用 k/(k+1) 的概率选中它,一旦选中了,就随机替换掉蓄水池中的某一个元素,这样前 k 个被选中的元素在第 k+1 个元素到来时依然被选中的概率即为它不被替换掉的概率: p = 1*(1-被替换掉的概率q) q = k/(k+1) * 1/k    

蓄水池算法

问题: 如何从N个元素中等概率抽取K个元素(N > K) 方法: 首先构建一个可放k个元素的蓄水池,将序列的前k个元素放入蓄水池中,然后从第k+1个元素开始,以k/i (k<i<=n)的概率来决定该元素是否被替换到池子中,并且从池子中等概率淘汰一个球. 对于第i个数(i<k),在前k步被选中的概率是1, 从第k+1步开始,i不被选中的概率为k/k+1,那么读到第n个数时, 第i个数(i<k)被选中的概率 = 被选中的概率 * 以后每一步都不被换走的概率,即1 * k/k+1

MySTL:蓄水池抽样算法

给你一个长度为N的链表.N很大,但你不知道N有多大.你的任务是从这N个元素中随机取出k个元素.你只能遍历这个链表一次.你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等). 这一题应该可以用来解决微信红包分配之类的那种问题,主要是概率的证明挺有意思. 1 #include <iostream> 2 #include <algorithm> 3 #include <time.h> 4 5 using namespace std; 6 7 typedef

Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)

之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^;) 这里是题目: ---------------------------分割线------------------------ 蓄水池储水量问题 看图,可以将方块看做砖.题干很简单,问最多能放多少水.例如,图2就是图1可放的最多水(蓝色部分),如果将一块砖看做1的话,图2就是能放10个单位的水.图

楼市、股市后下一届ZF将用什么去做超发货币的蓄水池(

这是天涯论坛上最近的的一个热帖合集,周小川曾直言超发货币需要蓄水池来装,以控制通货膨胀.这个蓄水池楼市做过.股市曾经也充当过,或许现在的地下钱庄也算一部分吧,那下一届政府会如何选择这个蓄水池呢,这或将成为影响中国今后十年乃至更长时间社会经济发展的一个关键问题,花半小时看完本帖, 我想会有所收获. 原作者在连载过程中对原来的跟帖有回应,所以行文有些"个性",原帖较长,转载的时候没办法只能一段一段来帖,放上来,供列为看官一阅.  ==============================

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

随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有shuffle函数,可以对容器内部的数据打乱,保持随机排序. C++: 1 template <class RandomAccessIterator, class URNG> 2 void shuffle (RandomAccessIterator first, RandomAccessIterato

蓄水池水位远程监测短信控制方案

1.蓄水池布局说明野生动物园位于秦岭山下,在山上建有两个蓄水池,为整个园区动物提供生活用水.1 号蓄水池距中心监控室约 600m 左右,2 号蓄水池距中心监控室约 3000 米左右.监控室在山下工作区,安装了水泵和控制器.2.存在的问题 由于早期的设计存在缺陷未考虑水位闭环控制,由工作人员估算时间对蓄水池注水.这种方式要么出现蓄水池水位溢出造成附近村庄发水引起村民不满,要么出现蓄水池被抽干而损坏水泵.3.限制条件1. 山上没有动力电源:2. 时间紧,不能开挖电缆沟布线:3. 实现无人值守,自动控

洗牌算法与蓄水池抽样

今儿看到了,就在此记录一下吧. 洗牌算法 递归做法:先将1~n-1洗牌,然后取随机数k(0<k<n),并交换n与k,代码很简单: 1 int[] shuffle(int[] cards, int n){ 2 if(n == 1){ 3 return cards; 4 } 5 shuffle(cards, n-1); 6 int k = random(1, n-1); 7 swap(card[k], card[n]); 8 return card; 9 } 也可以转成非递归的: 1 void s

【无线液位传输器应用案例】高位蓄水池水位无线遥控抽水泵方案

[无线液位传输器应用案例]高位蓄水池水位无线遥控抽水泵方案 一.方案介绍 本方案采用433MHz自主无线通信方式,没有运行费用,实时通信,并借助公用GSM网络,通过短信实现远程报警. 先将每个蓄水池分为2段,代表2个不同的水位高度,用浮球状态来表示蓄水池当前水位高度.把液位开关信号引入无线水位发射装置,如果水池附近没有动力电源,可以采用达泰一体化太阳能电源供电. 山下泵房控制室无线接收装置收到山上发来的上下水位信号后,通过控制电路输出开泵信号或者停泵信号.同时短信报警器给值班人员手机发送通知短信

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

蓄水池算法要解决的问题就是在不知道流入数据量多少的情况下,依旧可以随机从这些数中选取K个,乍一听好神奇,其实分析一下背后的概率知识,思想还是很简单的,相信看完我的介绍和证明,你也会觉得很简单. 假设要求随机选择K个元素,假设一共流入的元素有n个. 首先数组a[0...k-1]表示最后返回的结果,最开始流入的k个元素依次放入a[0...k-1]中: 那么从第k+1到第n个元素每一次都有可能把数组a中的元素踢走换成自己,假设现在流入了第i个元素,搞个随机数生成器,pos=rand()%i,如果pos