链表随机取节点/蓄水池采样reservoir sampling

蓄水池采样 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轮选择替换概率*正好选择该数字概率

= 1 - \frac{k}{j} \times \frac{1}{k}

= \frac{j - 1}{j}

对于j从k+1~N的相乘,即

= \frac{k}{k + 1} \times \frac{k + 1}{k + 2} \times \frac{k + 2}{k + 3} \times ... \times \frac{N - 1}{N}

= \frac{k}{N} (数学归纳法)

所以前k个被采样概率为\frac{k}{N}

后N-k个

对于第i个,k+1<= i<= N

被保留概率 = \frac{k}{i}(根据策略定义)

之后不会被替换概率,根据上面👆证明了,某个池子里已经存在的数字,第j轮不会被替换概率 = \frac{j - 1}{j}

那么如果第i+1 ~ N轮都不被替换,相乘乘积就是

\frac{i}{i + 1} \times \frac{i + 1}{i + 2} \times ... \times \frac{N - 1}{N} = \frac{i}{N}

k/i 与上面👆的乘积相乘就是 \frac{k}{i} \times \frac{i}{N} = \frac{k}{N}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值