2011-12-25 5 views
12

私はこの問題を解決するために(CLRS、第3版、運動11.2から6)をしようとしている:チェーンされたハッシュテーブルからランダムな要素を効率的に選んでいますか?ただ、練習(とない宿題など)のための

我々はのハッシュテーブルにn個のキーを格納していると仮定サイズm、 の連鎖は連鎖によって解決され、最長連鎖の長さLを含む各 連鎖の長さを知ることができる。ハッシュテーブル内の キーの中からランダムに一様にキーを選択し、期待時間O(L *(1 + m/n))に戻す手順を説明する を記述します。

私がこれまで考えていたことは、各キーが返される確率が1/nだということでした。私たちが1からnまでのランダムな値xを得ようとすると、バケツでソートされた順番にx番目のキーを見つけようとすると、バケツのチェーンに沿ってソートされ、次にO(m) 1つずつバケツを通し、O(L)時間をかけてチェーン内の正しいキーを取得します。要素が返されるまで

+1

どこがあなたの質問ですか? – outis

+0

最悪の場合O(mn)は関連する項目を見つけるが、期待される時間は質問ごとにO(1 + m/n)でO(L *(m/n + 1))それらのすべて。 –

+0

長さ情報はどのように保存されていますか? 1つのバケットにすべての要素があり、残りがゼロの場合、O(n)時間よりも速くバケットを見つけることもできないと考えています。要素がどこにあるかについて利用できる他の情報はありますか? – templatetypedef

答えて

23

は、次の手順を繰り返します。

  • をランダムにバケットを選択します。バケット内の要素の数をkとします。
  • pをランダムに一様に選択します。1 ... Lです。 p <= kの場合は、p番目の要素をバケットに返します。

このプロシージャは、要素をランダムに一様に戻します。我々は、2D配列に配置された要素に拒否サンプリングを適用するようなものです。

バケットあたりの予想される要素数はn/mです。サンプリングが成功する確率は(n/m)/Lです。したがって、バケットを見つけるのに必要な試行回数はL * m/nです。バケットから要素を取得するためのO(L)コストとともに、期待される実行時間はO(L * (1 + m/n))です。

+1

+1 1からLまでの範囲でのサンプリングに関する優れた洞察矩形を完成させてダーツを投げる幾何学的な直感は、説明を少しはっきりさせるのに役立つかもしれません。 – templatetypedef

関連する問題