如果流数据规模超出处理能力的限制,我们需要对数据进行采样,只对数据的部分做处理。这时候我们需要保证:从流中抽取的样本子集,对它进行查询能够在统计性上代表整个流。只有这样采样才有意义,代表整体流的分布。
首先讲蓄水池采样。在未知大小的数据流中,我们如何从中选择k个元素,而且保证随机性(每个元素被选到的概率相等)。该算法保存一个大小为k的数组(或者理解成一个窗口、集合都行)来存放选中的元素。对于第i个元素的处理如下:如果i<=k,则直接将该元素放入到数组中。如果i>k,则k/i的概率将该元素替换集合中的某一个元素。如果确定数组中到底哪个元素被替换,可以使用产生一个[ 1 , k ]的随机数m,替换第m个元素。该方法合理性可以通过数学归纳法进行证明。
之后