蓄水池抽样算法 Leetcode 382
2016-08-20 00:00
267 查看
摘要: 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行?
解决方案:定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推。
这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。
回顾这个问题,我们可以对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?
类比下即可得到答案,即先把前k个数放入蓄水池,对第k+1,我们以k/(k+1)概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。
解决方案:定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推。
这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。
回顾这个问题,我们可以对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?
类比下即可得到答案,即先把前k个数放入蓄水池,对第k+1,我们以k/(k+1)概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。
相关文章推荐
- LeetCode:382 Linked List Random Node蓄水池抽样算法
- LeetCode 382 Linked List Random Node (蓄水池算法 推荐)
- LeetCode:382. Linked List Random Node(蓄水池抽样算法C++)
- Leetcode Linked List Random Node C++(蓄水池抽样算法)
- 数据工程师必知算法:蓄水池抽样
- 随机抽样——蓄水池抽样算法(Reservoir Sampling)
- Reservoir Sampling - Sampling from a stream of elements(蓄水池算法,从流数据中抽样)
- 数据工程师必知算法:蓄水池抽样
- 数据工程师必知算法:蓄水池抽样
- [编程题] LeetCode上的Reservoir Sampling(蓄水池算法)类型的题目
- 数据工程师必知算法:蓄水池抽样
- Reservior Sampling (蓄水池抽样算法)
- Reservoir Sampling 蓄水池抽样算法,经典抽样
- MySTL:蓄水池抽样算法
- 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)
- 大数据工程师必备之蓄水池抽样算法
- leetcode--蓄水池抽样
- 算法学习之---蓄水池抽样问题
- 蓄水池抽样算法证明
- 蓄水池抽样算法