我无法理解水库采样中涉及的概率。以下是我见过的示例代码,几乎无处不在:
1/*
2 S has items to sample, R will contain the result, K number of items to select
3*/
4ReservoirSample(S[1..n], R[1..k])
5 // fill the reservoir array
6 for i = 1 to k
7 R[i] := S[i]
8
9 // replace elements with gradually decreasing probability
10 for i = k+1 to n
11 j := random(1, i) // important: inclusive range
12 if j <= k
13 R[j] := S[i]
我的理解是否正确(?): 假设我们有k = 3并且输入= [100,200,300,400,500]并且我目前处于500指数。在储层中替换300的概率(其大小为3)=在储层中选择300的概率*选择500的概率,这仅在随机函数返回的指数小于或等于3的情况下才有可能5种选择= 1/3 * 3/5 = 1/5
答案 0 :(得分:0)
您的理解似乎不正确。选择500的概率与300的选择无关。
你应该查看gfg link for the same.“这是如何工作的?”部分,其中说明了以下内容:
情况1:对于最后的n-k个流项,即对于流[i],其中k <= i <1。 ñ 对于每个这样的流项目流[i],我们选择从0到i的随机索引,如果拾取的索引是前k个索引之一,我们用stream [i]
替换拾取索引处的元素为了简化证明,我们首先考虑最后一项。最后一个项目在最终库中的概率=为最后一个项目挑选前k个索引之一的概率= k / n(从大小为n的列表中挑选k个项目之一的概率)
现在让我们考虑倒数第二项。第二个最后项目在最终库中的概率[] = [在流[n-2]的迭代中选择前k个索引之一的概率] X [索引在流[n-1]的迭代中选择的概率]与为流[n-2]]选择的索引不同= [k /(n-1)] * [(n-1)/ n] = k / n。
同样,我们可以考虑从流[n-1]到stream [k]的所有流项目的其他项目并概括证明。
情况2:对于前k个流项,即对于stream [i],其中0 <= i <1。 ķ 最初的k个项目最初被复制到reserv [],并且可以在稍后的流[k]到stream [n]的迭代中被移除。 流[0..k-1]中的项目在最终数组中的概率=当项目流[k],流[k + 1],...时未选择项目的概率。 stream [n-1]被认为= [k /(k + 1)] x [(k + 1)/(k + 2)] x [(k + 2)/(k + 3)] x ... x [ (n-1)/ n] = k / n