算法的证明:(数学归纳法,已知集合S大小为n): 当n <= k时,遇到第i个元素,概率百分之百。 当n > k时,遇到第i个元素的选择概率为k/i,第i + 1个元素不被替换的概率是1 - (k / (i + 1)) * (1 / k), 所以可得第k个元素到结束后被选择的概率为 3. 算法的计算机工程实现(这里只做一般形式的,...
public static void main(String[] args) { ReservoirSampling test = new ReservoirSampling(1000); int[] sampling = test.sampling(5); for (int i : sampling) { System.out.print(i + " "); } } // 输出 205 907 986 696 443,每次运行结果不同 题目 LeetCode 382. 链表随机节点 LeetCode 38...
1.geekforgeeks, reservoir sampling 2.leetcode, 链表随机节点 3.wiki, reservoir sampling
解法:采用水塘抽样算法(Reservoir Sampling) 代码非常简单,如下 代码语言:javascript 代码运行次数:0 运行 AI代码解释 /*** * * @param input 模拟的原始数组 * @param k 采样的的个数 * @return 返回采样的数据 */ public static int[] sample(int []input,int k){ Random random=new Random(); int ...
水塘抽样算法 Reservoir Sampling 水塘抽样是一系列的随机算法,其目的在于从包含 n 个项目的集合 S 中选取 k 个样本,其中 n 为一很大或未知的数量,尤其适用于不能把所有 n 个项目都存放到主内存的情况。 未知元素个数或个数很大,当遇到第 i 个元素时,应该有 1/i 的概率选择该元素,1 - 1/i 的概率保持...
水塘抽样(Reservoir Sampling)问题 水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况。 在高德纳的计算机程序设计艺术中,有如下问题:可否在一未知大小的集合中,随机取出一元素?。或者是Google面试题: I have ...
Reservoir Sampling 首先我们再重新描述一下问题:假设有一组数据流元素有 N 个(事先不知道 N 具体值),我们希望选择 n 个样本(N >= n),使用怎样的策略进行抽样可以使得数据流中每个元素被选择的概率恰为 n / N? Insight 由于事先不知道元素个数,所以必须要逐元素处理,对于第 i 个要处理的元素(i > n),...
在刷Leetcode的过程种,遇到过不少类似的问题:给出一个链表,如何从中随机获取一个节点? 直观的解法是把链表转换为List,或者获取其长度,再用Random解决。那么假如不能使用额外空间以及不允许事先获取其长度呢?一边扫描一边随机采样,这就是Reservoir Sampling能做到的。
在一个给定长度的数组中随机等概率抽取一个数据很容易,但如果面对的是长度未知的海量数据流呢?蓄水池采样(Reservoir Sampling)算法就是来解决这个问题的, 它在分析一些大数据集的时候非常有用。 1. 算法描述 先选取数据流中的前k个元素,保存在集合A中; ...
Solution solution = new Solution(head); // getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning. solution.getRandom(); classSolution {public:/** @param head The linked list's head. ...