亚线性算法-水库抽样(Reservoir Sampling)算法

介绍了一种在数据流中进行均匀随机抽样的算法,该算法能够在仅扫描一次数据的情况下,从N个元素中随机抽取k个元素,确保每个元素被抽中的概率相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个有质量保证的结果。

数据流算法:是指数据源源不断地到来,根据到来的数据返回相应的部分结果。适用于两种情况:第一、数据量非常大仅能扫描一次时,可以把数据看成数据流,把扫描看成数据到来。第二、数据更新非常快,不能把所有数据都保存下来再计算结果,此时可以把数据看成是一个数据流。
 

问题描述:

输入:一组数据,大小未知

输出:这组数据的K个均匀抽取

要求:仅扫描一次

总体要求:从N个元素中随机的抽取k个元素,其中N无法确定,保证每个元素抽到的概率相同

问题可以理解为:蓄水池(水库)的容量为k,对于n(n>k)个元素,如果第i个元素(i从1逐渐递增至n)以k/i的概率决定是否将它放入蓄水池,当i=n时,蓄水池中存放的是n个元素的均匀抽样,每个数字最终被存在数组中的概率相等,为k/n。见下面的证明

解决方案

1、申请一个长度为k的数组A保存抽样。
2、保存首先接收到的k个元素
3、当接收到第i个新元素t时,以k/i的概率随机替换A中的元素(即生成[1,i]间随机数j,若j<=k,则以t替换A[j])

证明:当接收到第i个新元素t时,以k/i的概率保存在水库中,所以在接收第i+1个数时,第i个数还能保存在水库当中的概率是1-1/(i+1),因为在接收到第i+1个数时要以k/(i+1)的概率随机替换,而第i个数被选中的概率是1/k,它们相乘即为1/(i+1)。1/(i+1)为第i个元素被换出水库的概率,所以1-1/(i+1)就是在接收第i+1个元素时第i个元素在数组中的概率。同理,在接收第i+2个元素时,第i个元素让然保留在水库中的概率为1-1/(i+2)。以此类推,当接收第n个元素时,第i个元素保存在水库中的概率为1-1/n。只有这些事件都放生了,最终第i个元素才能保留在水库当中。因此第i个元素最终被保留在水库抽样当中的概率,就是这些事件的概率的乘积,即

                  

 

数学归纳证明方法:

假设:当第n个元素以k/n,前n-1个元素也被选中的概率也为k/n

    1)当n<=k时,出现在A中的每个元素概率都是相同的,都为1 
    2)当n=k+1时,计算前k个元素在A的概率 
    ==a==.前k个元素在A中的元素概率都为1 
    ==b==.由假设得,第k+1个元素被选中的概率为:k/(k+1),A中任意元素被替换的概率为(k/(k+1))*(1/k)=1/(k+1),没被替换(即选中)的概率为1-1/(k+1)=k/(k+1). 
    由a*b=1*k/(k+1)=k/(k+1),前k个元素和k+1元素被选中的概率都为k/k+1。

    3)当n>k+1时,计算前n-1个元素在A的概率 
    ==a==.前n-1个元素在A中被选择的的概率为k/(n-1) 
    ==b==.由假设得,第n个元素被选中的概率为:k/n,A任意元素被替换的概率为(k/n)*(1/k)=1/n,没被替换(即选中)的概率为1-1/n=(n-1/)n。 
    由a*b=(k/(n-1))*((n-1)/n)=k/n,前k个元素和k+1元素被选中的概率都为k/n。

因为假设成立,所以到数据结束时,所有元素的抽到的概率都为k/n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangvalue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值