蓄水池抽样问题描述的是,在一个无穷尽的样本中,要求随即抽取一些样本,这些样本被抽取到的概率必须保持一致。
一个蓄水池就可以理解为无穷大的样本空间。
解决方案就是蓄水库抽样(reservoid sampling)。主要思想就是保持一个集合,作为蓄水池,依次遍历所有数据的时候以一定概率替换这个蓄水池中的数字。
其伪代码如下:
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
解释一下:程序的开始就是把前k个元素都放到数组中,然后对之后的第i个元素,以k/i的概率替换掉这个水库中的某一个元素。