蓄水池采样 k/N
问题
N个样本中采样k个,每个样本被采的概率一样。常见面试场景:很长的不知道长度的链表随机选取k个节点。
策略
前k个(这里index以1为底,即:1~k),一定(概率为1)保留
后N-k个,对于第j个(index:k+1 <= j <= N),以k/j为概率保留,并替换掉原来k个中的任意一个。
证明
最终采样的概率 = 被保留概率*之后不会被替换概率
对于前k个(1~k)
被保留概率 = 1
之后不会被替换的概率 = 每一轮不会被替换概率相乘 (条件概率)
第j轮不会被替换概率=1 - 第j轮被替换概率
= 1 - 第j轮选择替换概率*正好选择该数字概率
对于j从k+1~N的相乘,即
(数学归纳法)
所以前k个被采样概率为
后N-k个
对于第i个,k+1<= i<= N
被保留概率 = (根据策略定义)
之后不会被替换概率,根据上面👆证明了,某个池子里已经存在的数字,第j轮不会被替换概率 =
那么如果第i+1 ~ N轮都不被替换,相乘乘积就是
k/i 与上面👆的乘积相乘就是