蓄水池算法

問題描述:
從N個樣本中等概率抽取K個樣本,其中N未知。

算法描述:
首先構建一個可容納 kk 個元素的數組,將序列的前 kk個元素放入數組中。然後從第 k+1k+1 個元素開始,以 kn\frac{k}{n}的概率(nn爲當前遍歷的樣本數)來決定該元素是否被替換到數組中。 當遍歷完所有元素之後,數組中剩下的元素即爲所需抽取的樣本。

leetcode 397中的實現如下:

static std::default_random_engine dre(time(0));
static std::uniform_int_distribution<int> uid;
for(int i = 0; i < nums_.size(); i++) {
    if (nums_[i] == target){
        ++cnt;
        std::uniform_int_distribution<int> uid(1, cnt);
        if (uid(dre) == cnt)
            idx = i;
    }   
}
return idx;

這裏可以看作k=1的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章