有一个无限的整数数据流,如何从中随机地抽取k个整数出来?
这是一个经典的数据流采样问题,我们一步一步来分析。
当k=1时
我们先考虑最简单的情况,k=1,即只需要随机抽取一个样本出来。抽样方法如下:
- 当第一个整数到达时,保存该整数
- 当第2个整数到达时,以1/2的概率使用该整数替换第1个整数,以1/2的概率丢弃改整数
- 当第i个整数到达时,以的概率使用第i个整数替换被选中的整数,以的概率丢弃第i个整数
假设数据流目前已经流出共n个整数,这个方法能保证每个元素被选中的概率是吗?用数学归纳法,证明如下:
- 当n=1时,由于是第1个数,被选中的概率是100%,命题成立
- 假设当n=m(m>=1)时,命题成立,即前m个数,每一个被选中的概率是
- 当n=m+1时,第m+1个数被选中的概率是 , 前m个数被选中的概率是,命题依然成立
由1,2,3知n>=1时命题成立,证毕。
当k>1时
当 k > 1,需要随机采样多个样本时,方法跟上面很类似,
- 前k个整数到达时,全部保留,即被选中的概率是 100%,
- 第i个整数到达时,以的概率替换k个数中的某一个,以的概率丢弃,保留k个数不变
假设数据流目前已经流出共N个整数,这个方法能保证每个元素被选中的概率是吗?用数学归纳法,证明如下:
- 当n=m(m<=k)时,被选中的概率是100%,命题成立
- 假设当n=m(m>k)时,命题成立,即前m个数,每一个被选中的概率是
- 当n=m+1时,第m+1个数被选中的概率是 , 前m个数被选中的概率是,命题依然成立
由1,2,3知n>=1时命题成立,证毕。