サイズの$ m $のランダムなサブセットを効率的に選択する$ n $
-
29-09-2020 - |
質問
$ n $ のリストを持っていて、 $ m $ をランダムに選択したいです。それから効率的に設定します(時間の複雑さに関して)。また、すべての可能なサブセットを同等の確率で選択したいです。明らかな解決策は、から $ n $ から $ m $ 時間を繰り返し、1つが選択されていてすでに選択されているイベントをカウントしていません。これは、 $ m $ のアプローチ $ m> n / 2 $ 代わりに、 $(nm)$ -setを選択してその賛辞を返すことを意味します。
$ m $ の値の場合は、 $ n / 2 $ に近い、私が考えるより良い解決策 $ n $ 要素のそれぞれを考慮し、その要素を選択するか、またはその数の数に応じてピッキングまたは破棄する可能性を更新することを決めます。選択された要素は前に破棄されました。具体的には、アルゴリズムは次のようになります(Python):def randomSubset(n,m):
L = []
for i in range(n):
if uniform(0,1)<m/(n-i): L,m = L+[i],m-1
return L
.
しかし、私は、それぞれのサブセットが等しい確率で選択されていない可能性があります。
私は2つの質問があります。まず、このアルゴリズムはサブセットを等しい確率で選びますか(そうでなければ、そうでなければ、そうでなければ、そうでない証明も好きではない)。第二に、より広く私はこの問題にどんな良い解決策が存在するのか知りたいのですが。 $ m << n $ の場合、最初の方法は2番目の方法よりも優れています(実際には実際の方法で行う場合)。最初。さらに、全体的に異なるアプローチが一般的に最も良いかもしれません。
解決
要素 $ 1 $ がrandom $ m $ に属している可能性SPAN CLASS="math-container"> $ n $ - Element Setは $ m / n $ です。したがって、サブセット内の$ 1 $ を確率 $ m / n $ を含める必要があります。
サブセット内の $ 1 $ を置くと、 $(m-1)$を選択して残ります。 - $(n-1)$ -element set
サブセット内の $ 1 $ を入れなかった場合は、 $ m $ < / span> - $(n-1)$ -element set
これは、 $ m $ を $ m- | $ m- | $ m- | $ m- | $ m- | 。
結果のアルゴリズムは、 reservoir sampling
と幾分似ています。いくつかの類似点を持つ3番目のアプローチは、 $ 1、\ ldots、n $ のランダムな置換を生成し、最初の $ m $ エントリ