2つの操作を効率的にサポートするデータ構造を知っている人はいますか?ランダム要素を選択するためのデータ構造ですか?
- データ構造体に値を挿入します。
- 一様にランダムな確率でデータ構造体からエントリをデキューして返します。
これは、入門確率クラスに常に現れる標準的な「大理石の袋」のようなものです。あなたはバッグに任意の大理石を入れることができ、大理石を効率的に無作為に取り除くことができます。
私が持っている最良の解決策は次のとおりです。要素を格納するために自己平衡二分探索木(AVL、AA、赤/黒など)を使用します。これはO(lg n)の挿入時間を与える。ランダムな要素を削除するには、ランダムなインデックスiを選択し、ツリーからi番目の要素を見つけて削除します。構造を適切に拡張した場合、これはO(lg n)時間で実行することもできます。
このランタイムは間違いありませんが、挿入するにはO(1)、デキュー用にO(lg n)を使用するといいでしょうか?あるいは、で動作するものがありますか? O(1)ハッシュ関数を使って挿入して削除しますか?あるいは、より強い償却された縛り?
誰もがこれを漸近的に速くする方法に関するアイデアはありますか?
ただ好奇心から:このデータ構造に名前が付いているかどうかわかりませんか?これは明らかに 'Bag'や' MultiSet'の一種です。 'RandomBag'、多分?実際、そのようなデータ構造(すなわち、 'pop'が返すランダムな要素を取り除くデータ構造)は*と一般に呼ばれていますか? –
ここではBagとRandomBagの用語を聞いたことがありますが、RandomBagはおそらく適切な用語です。バッグは通常、マルチセットの同義語です。 – templatetypedef