临街小站

蓄水池

蓄水池算法

给定一个数据流,数据流的长度出事我们未知,需求时等概率的返回摸个数据流数值。从性能方面分析,我们为了节省空间性能,无需在遍历整个数据流之后保存,再进行随即等概率运算。这介绍一中蓄水池算法思想。

就假设数据流的数值是升序进行,1、2、3、4…..,当我们获取第二个数值时,我们手中有两个数值进行选择,1和2,此时我们选择其中的一个抛手,此时进行的第二个数据,我们以1/2的概率处理。假设2被留下;继续读入数据流,读取到3,此时我们又有了两个数据,这是第三个数据,我们规定只有1/3的概率3才能留下,否则看留下的是前两个数字的胜出者,假设3留下;读入最后一个数据4,依照上面,只有1/4的概率,我们才留下4,否则留下前面3个数据的胜出者。我们计算一下这几个数值保留时的概率:

  • 1:(1/1)*(1/2)*(2/3)*(3/4)=1/4

  • 2:(1/2)*(2/3)*(3/4)=1/4

  • 3:(1/3)*(3/4)=1/4

  • 4: 1/4

发现我们的规定是可以满足需求,等概率返回数值。

上面实际上使用了数学上的一个小技巧,多个分数相乘,前分母与后分子相同直接约掉即可,例如(4/5)*(5/6)=4/6等等,由于当前阶段数值留下的概率是(1/数据流index),而后面每次留下的概率都是(数据流index/数据流index+1)、(数据流index+1/数据流index+2)….所以满足这个思路

clinjie wechat
Think about u every day