蓄水池抽樣(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

相關文章
相關標籤/搜索