与えられたS個の要素のセットからk<=Sとなるk個の要素を選択するリザーバーサンプリングアルゴリズムを理解したいと思います。
ウィキで与えられたアルゴリズムでは:
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つの要素だけをランダムに選択したい場合は、このアルゴリズムでどのように行いますか... ?