蓄水池抽样算法 (Reservoir Sampling Algorithm) 蓄水池抽样算法简介 蓄水池抽样算法是随机算法的一种,用来从N个样本中随机选择K个样本,其中N非常大(以至于N个样本不能同时放入内存)或者N是一个未知数。其时间复杂度为O(N),包含下列步骤 (假设有一维数组 S, 长度未知,需要从中随机选择 k 个元素, 数组下标从 1...
直白翻译过来就是,我们的蓄水池抽样算法(Reservoir sampling)是随机抽样算法的一种,即我们要从一组长度为n的数据中抽样出k个样本出来。但是呢,它的不同之处在于,它抽样的数据是一组未知长度的数据流(莫疑惑,在数据流完之前,你是不知道这个长度n的具体数值的),而且这个数据流只流通一次,无法再返回去抽样。也就是...
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...
Reservoir Sampling,水塘抽样算法是随机算法的一种,通常用于选取简单随机样本。 Reservoir Sampling 的用途 对于一个固定样本,样本总数为n,要在其中随机抽取k个样本,我们可以通过在[0,n)中进行随机取数,以保证选取样本的随机性。但是,当n变成一个极大的不固定的数,大到无法将n个样本全部载入到内存中,那么上述通过[...
解法:采用水塘抽样算法(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 Algorithm)的精妙之处在于,对于未知长度 的数组,其每个数被选中的概率都为 。设 为未知长度数组的数据索引(从0开始),则: 若 :这些数据直接被存入结果数组 ,遍历结束时仍留在结果数组 的概率为: 若 :这些数据被存入数组的概率为 ...
水塘抽样算法(Reservoir Sampling) 简介: 水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到内存的情况。 问题: 以谷歌为例,有一道关于水塘抽样的例题 我有一个长度为N的链表,N的值非常大,我不清楚N的确切值.我怎样能...
水塘抽样算法 Reservoir Sampling 水塘抽样是一系列的随机算法,其目的在于从包含 n 个项目的集合 S 中选取 k 个样本,其中 n 为一很大或未知的数量,尤其适用于不能把所有 n 个项目都存放到主内存的情况。 未知元素个数或个数很大,当遇到第 i 个元素时,应该有 1/i 的概率选择该元素,1 - 1/i 的概率保持...
蓄水池抽样(Reservoir sampling) 题目要求 从个元素中随机抽取个元素,但的个数无法事先确定。 在实际应用中,往往会遇到很大数据流的情况。因此,我们无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得到的元素是随机的算法。
这个概念即蓄水池抽样(Reservoir Sampling)。 有了这个概念,我们便有了这样一个解决方案:定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推,可用伪代码描述如下: i = 0...