栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

水塘抽样算法(Spark RangePartitioner的抽样算法)

水塘抽样算法(Spark RangePartitioner的抽样算法)

1、水塘抽样解决的问题

        对一个数量未知的样本,希望只经过一次遍历就完成随机抽样,即时间复杂度O(n)。因为样本数量未知,因此就不能通过random函数直接随机抽样。

2、水塘抽样的逻辑

        希望在n个样本中随机抽取k个数据。即每个数据被抽取的概率为k/n。

        首先我们创建一个k个成员的数组out,用来存放预期抽出的样本。

        (1)当k>=n时,每一个样本被抽取的概率都为100%。因此都可以直接放入数组out。

        (2)当k

        (3)当k

        上一轮抽中的概率 * (不发生抽样的概率 + 发生抽样的概率 * 不被抽走的概率)

        k/(n-1) * ((n-k)/n + k/n * (k-1)/k) = k/n

        概率也为k/n

3、代码实现
public class PoolSimple {
    public static void main(String[] args) {
        int[] data = new int[]{1, 3, 4, 5, 2, 12, 53, 54, 2, 4, 325, 46, 7, 2, 2, 423, 563, 23, 24, 6, 1};
        int[] result = new Simple(5).run(data);
        for (int item : result) {
            System.out.println(item);
        }
    }
}

class Simple {

    private final int[] out;
    private final int num;
    private final Random random;

    public Simple(int num) {
        this.num = num;
        this.out = new int[num];
        this.random = new Random();
    }

    
    public int[] run(int[] in) {
        for (int i = 0; i < in.length; i++) {
            if (i < num) {
                out[i] = in[i];
            } else {
                int t1 = random.nextInt(i + 1);
                if (t1 >= num) {
                    int t2 = random.nextInt(num);
                    out[t2] = in[i];
                }
            }
        }
        return out;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/706352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号