蓄水池算法

问题描述:
从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的情况。

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