随机抽样问题
随机抽样问题,要求从N个元素中随机的抽取k个元素,其中N无法确定。
《计算机程序设计与艺术》中的题目,以下是分析求解以及证明的详细过程。
分析:
N个元素中随机抽取k个元素,即使每个元素被抽到的概率都是k/N,所涉及的算法最后也应该保证这个性质。
算法设计:
Reservoir Sampling (蓄水池抽样):
1. Init: a reservoir with the size: k
2. for i=k+1 to N,
3. M=random(1, i);
4. if( M <= k)
5. SWAP the Mth value and ith value
6. end for
证明:
1)初始状态,池中元素为k,每个元素被抽中的概率均为1,算法成立。
2)当i=k+1时,第i个元素被抽中的概率(即M<=k的概率)为k/i;前k个元素不被替换仍在池中的概率为(1-1/i)=k/i;故所有元素被抽中放入池中的概率均为k/i,算法成立。
3)假设i=j时算法成立,即所有元素被抽中放入池中的概率均为k/j;当i=j+1时,要证明所有的元素被抽中放入池中的概率均为k/(j+1);
首先,根据第j+1个元素被抽中的概率为k/(j+1),而前j个元素被抽中的概率包括两部分:①在i=j时被抽中(概率为k/j);②在i=j+1时不被替换(概率为1-1/(j+1)=j/(j+1))。根据乘法原则,前j个元素被抽中的概率为①②部分的乘积,即k/j*j/(j+1)=k/(j+1);
由此可得,当i=j+1时,每个元素被抽中的概率均为k/(j+1),算法成立。
浙公网安备 33010602011771号