水库采样无法理解概率

时间:2015-09-09 01:56:17

标签: arrays algorithm data-structures probability probability-theory

要明确以下问题:

给定一个不确定长度的输入流,如何返回该流的随机成员(每个成员的概率相等),假设您不允许存储超过一定数量的输入,并且您可以只进行一次输入

这个问题的解决方案似乎是水库采样,它在下面说明。 “首先,你想要制作一个包含1,000个元素的库(数组),然后用流中的前1000个元素填充它。这样,如果你有1000个元素,算法就可以了。这是基本情况。

接下来,您要处理第i个元素(从i = 1,001开始),以便在处理该步骤结束时,您的库中的1,000个元素在您目前看到的i个元素中随机采样。你怎么能这样做?从i = 1,001开始。在第1001步之后的概率应该是元素1,001(或任何元素)在1,000个元素的集合中?答案很简单:1,000 / 1,001。“

我无法理解最后一句“答案很简单:1,000 / 1,001”。不应该是在1001个元素的数组中找到1个元素的概率是1/1001而不是1000/1001?样本空间是否等于1001且有利的结果数等于1?

2 个答案:

答案 0 :(得分:1)

有1,001个元素。样本中有1,000个。一个是在样本之外。因此,特定元素是外部元素的概率是1,001中的1,并且它是样本中的千元素之一的概率是1,001中的1,000。

答案 1 :(得分:0)

我发现以下论点更清晰。让S成为第一个1000元素的集合; let e表示流中的最后一个元素(例如第1001个元素)。一组1001个元素中有{1001 choose 1000}=1001个可能的大小-1000个子集,并且您希望它们中的所有元素具有相同的存储在数据结构中的概率(每次新元素到达时都应该保留此不变量)。

包含e的1001个元素的1000个子集的数量是多少?好吧,由于e已修复,我们可以选择1000个元素,我们会选择999个元素,因此有{1000 choose 999} = 1000个这样的子集。

e S的概率应该是:{1000 choose 999} / {1001 choose 1000} = 1000/1001(即包含e的1000个子集的数量除以所有数量{n choose k} size-1000 subsets)。

按{{1}}我表示binomial coefficient