質問

これは私の質問のクロスポストです。ここ math.se

$ 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 $ エントリ

これらのアプローチのすべての下側は、 $ \ theta(n)$ で実行されますが、 $ m \ ll \ sqrt {n} $ 、あなたの最初のアルゴリズムは(予想される)時間 $ \ tilde \ theta(m)$ を実行します。

$ \ theta(n)$ の実行時刻を次のように改善することができます。 $ m $ インデックス subsetを生成します。 -container "> $ i_1、\ ldots、i_m $ 。ここで、 $ i_j \ in \ {1、\ ldots、n-(j-1)\} $ < /スパン>。サブセット内の '$ j $ 'は $ i_j $ '<< SPAN CLASS="math-container"> $ \ {1、\ {1、\ ldots、n} $ はまだ選択されていない数字のうち

アルゴリズムの説明を完了するために、次の問題を解決する必要があります。 $ s \ subseteq \ {1、\ ldots、n} $ $ i $ ' $ \ overline {s} $ $ s $ が、次の種類のクエリに効率的に回答できる構造(セルフバランスバイナリツリーなど)に格納されているとする。="math-container"> $ x $ $ s $ の要素数は $より小さいです。 X $ 。その後、 $ i $ 'th $ \ overline {s} $ の "$ "} $ 検索。

全体として、このアルゴリズムは $ m $ <<で $ \ tilde \ theta(m)$ で実行されます。 / span>、Tildeは $ n $ の因子の対数を隠します。 ( $ m \ ll \ sqrt {n} $ の場合、あなたの最初のアプローチを使用することができます。 $ n $ 。)

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top