蓄水池抽样算法形式一
视频链接
使用场景
给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据
伪代码
保证了每个字符串的取值概率都是等概率的;
public String core(String[] lines) {int i = 0;String res = null;for(String line : lines) {i++;r = random.nextDouble();if(r < 1/((double)i)) {res = line;}}return res;}
形式二
题目链接
实现代码
class Solution {int[] nums;Random random;public Solution(int[] nums) {this.nums = nums;random = new Random();}public int pick(int target) {int ans = 0;for (int i = 0, cnt = 0; i < nums.length; ++i) {if (nums[i] == target) {++cnt; // 第 cnt 次遇到 targetif (random.nextInt(cnt) == 0) {ans = i;}}}return ans;}}
