蓄水池抽样
2013-07-03 10:08
225 查看
/**
* 蓄水池抽样。
* n个元素,随机选择k个,要求每个元素被选中的概率相等。n未知。
* 结论是每个元素被选中的概率都是k/n。数学归纳法证明如下:
* 选开始的k个元素进池,
* 令i=k+1,利用交换法,第k+1个元素进池的概率为 k/(k+1),原来池中的任意一个元素出池的概率为1/(k+1),留在池中的概率为k/k+1
* 结论当i成立。
* 当i成立,证明i+1也成立。
* 同理,第i+1个元素进池的概率为 k/i+1,前i个元素中的任意一个进池的概率为k/i,出池的概率为1/i+1,留在池中的概率为
* k/i * (1-1/i+1) = k/i * i/i+1 = k/i+1
*
* 结论成立。
* 表面上,每个元素进池概率在递减,但是存在出池概率,即当进入一个新元素时,对于该元素,发生一次独立事件,留在池中概率为k/i+1,
* 而对于它前面一个元素,发生两次独立事件,
* 第一次该元素被选入池中,概率为k/i,第二次该元素没有被选中交换出池,概率为i/i+1, 故留在池中概率为也为k/i+1。
*
* 实践意义,对于输入流,依次处理读入每个元素,对每个元素都采取k/i概率进池,即可保证最终的n个元素,每个元素进池概率相等。
*
*
*/
* 蓄水池抽样。
* n个元素,随机选择k个,要求每个元素被选中的概率相等。n未知。
* 结论是每个元素被选中的概率都是k/n。数学归纳法证明如下:
* 选开始的k个元素进池,
* 令i=k+1,利用交换法,第k+1个元素进池的概率为 k/(k+1),原来池中的任意一个元素出池的概率为1/(k+1),留在池中的概率为k/k+1
* 结论当i成立。
* 当i成立,证明i+1也成立。
* 同理,第i+1个元素进池的概率为 k/i+1,前i个元素中的任意一个进池的概率为k/i,出池的概率为1/i+1,留在池中的概率为
* k/i * (1-1/i+1) = k/i * i/i+1 = k/i+1
*
* 结论成立。
* 表面上,每个元素进池概率在递减,但是存在出池概率,即当进入一个新元素时,对于该元素,发生一次独立事件,留在池中概率为k/i+1,
* 而对于它前面一个元素,发生两次独立事件,
* 第一次该元素被选入池中,概率为k/i,第二次该元素没有被选中交换出池,概率为i/i+1, 故留在池中概率为也为k/i+1。
*
* 实践意义,对于输入流,依次处理读入每个元素,对每个元素都采取k/i概率进池,即可保证最终的n个元素,每个元素进池概率相等。
*
*
*/
public void sampling(int[] a, int n, int k){ for (int i=k+1; i<=n; i++){ int m = random(1, i); if(m <= k){ Tools.swap(a, m, i); } } }
相关文章推荐
- Reservoir Sampling 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题
- python实现蓄水池抽样问题
- Reservoir Sampling 蓄水池抽样
- leetcode--蓄水池抽样
- Leetcode Linked List Random Node C++(蓄水池抽样算法)
- 蓄水池抽样
- 数据工程师必知算法:蓄水池抽样
- 蓄水池抽样算法
- Reservoir Sampling - 蓄水池抽样
- 有关蓄水池抽样(Reservoir Sampling)和自己的一些思考
- 蓄水池抽样
- 概率事件 rand5 产生 rand3 以及在未知n大小情况以1/n的概率取数 蓄水池抽样
- Reservoir Sampling - 蓄水池抽样
- 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)
- 蓄水池抽样算法 & 随机洗牌算法
- 蓄水池抽样算法 (Reservoir Sampling Algorithm)
- 蓄水池抽样
- 谷歌面试题:从无穷尽的流中随机的选取1000个关键字(蓄水池抽样)
- 蓄水池抽样及实现
- Sampling 蓄水池抽样算法