蓄水池抽样(Reservoir sampling)

##题目要求算法

从个元素中随机抽取个元素,但的个数没法事先肯定。 在实际应用中,每每会遇到很大数据流的状况。所以,咱们没法先保存整个数据流而后再从中选取,而是指望有一种将数据流遍历一遍就获得所选取的元素,而且保证获得的元素是随机的算法。dom

##蓄水池抽样算法大数据

先选取个元素中的前个元素,保存在集合中; 从第个元素开始,每次先以几率选择是否让第个元素留下。若第个元素存活,则从中随机选择一个元素并用该元素替换它;不然直接淘汰该元素; 重复1和2,直到结束。最后集合中剩下的就是保证随机抽取的个元素。code

##Java实现blog

public static BitSet randomBitSet(int size, int cardinality, Random rnd) {
        BitSet result = new BitSet(size);
        int[] chosen = new int[cardinality];
        int i;
        for (i = 0; i < cardinality; ++i) {
            chosen[i] = i;
            result.set(i);
        }
        for (; i < size; ++i) {
            int j = rnd.nextInt(i + 1);
            if (j < cardinality) {
                result.clear(chosen[j]);
                result.set(i);
                chosen[j] = i;
            }
        }
        return result;
    }

调用实例ip

boolean result = randomBitSet(100, outOf100, new Random()).get(i);

##docsget

相关文章
相关标签/搜索