蓄水池算法

问题描述:
从N个样本中等概率抽取K个样本,其中N未知。

算法描述:
首先构建一个可容纳 k k 个元素的数组,将序列的前 k k 个元素放入数组中。然后从第 k + 1 k+1 个元素开始,以 k n \frac{k}{n} 的概率( n n 为当前遍历的样本数)来决定该元素是否被替换到数组中。 当遍历完所有元素之后,数组中剩下的元素即为所需抽取的样本。

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的情况。

发布了57 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_38258767/article/details/103715916