我想了解水库采样算法,我们从给定的 S 元素集合中选择 k 个元素,使得 k <= S。
在 wiki 上给出的算法中:
array R[k]; // result
integer i, j;
// fill the reservoir array
for each i in 1 to k do
R[i] := S[i]
done;
// replace elements with gradually decreasing probability
for each i in k+1 to length(S) do
j := random(1, i); // important: inclusive range
if j <= k then
R[j] := S[i]
fi
done
如果我理解正确的话,我们首先从集合中选择 k 个元素,然后不断解析 S 的 i 个元素,生成 1 到 i 范围内的随机 no j 并将元素 j 替换为 S[i]。
如果要采样的集合 K 非常大,它看起来很好,但是如果我想从无限大小(至少未知大小)的链表中随机选择 1 个元素,我将如何使用这个算法来做...... ?