空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个有质量保证的结果。
数据流算法:是指数据源源不断地到来,根据到来的数据返回相应的部分结果。适用于两种情况:第一、数据量非常大仅能扫描一次时,可以把数据看成数据流,把扫描看成数据到来。第二、数据更新非常快,不能把所有数据都保存下来再计算结果,此时可以把数据看成是一个数据流。
问题描述:
输入:一组数据,大小未知
输出:这组数据的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