六月份在京东面试的时候碰到了这个问题,今天突然想起来做一个记录。
问题描述
我们现在有一个数据流,每次一个地读到内存中。我们预先并不知道一共会有多少个元素,但是知道内存中最多容纳 k k k 个元素。也就是说, k k k 个元素后,每次读到新的元素时,我们只能选择替换一个内存中已有的元素或者永久地丢弃新读到的这个元素。我们希望等概率地对这个序列中的每个元素进行采样。
思路分析
当我们读到第 k + n k+n k+n个元素时,我们假设以概率 p p p将其留下,为了满足等概率采样, p p p应该取 k k + n \frac k {k+n} k+nk。之后,内存中的每个元素应该是等概率被替换的。如此递推即可