次のプロパティを持つデータ構造が必要になることがよくあります。
- O(n) の n 個のオブジェクトの配列で初期化できます。
- O(1)でランダムな要素を取得できます。この操作の後、選択された要素は構造から削除されます。(交換なし)
- O(p) で p 個の「置換なしの選択」操作を元に戻すことができます
- O(log(n)) の構造から特定のオブジェクトを (たとえば id で) 削除できます。
- 現在構造体にあるオブジェクトの配列を O(n) で取得できます。
他のアクション (挿入など) の複雑さ (または可能性) は問題ではありません。複雑さに加えて、n の数が少ない場合にも効率的である必要があります。
そのような構造を実装するためのガイドラインを誰か教えてもらえますか? 私は現在、上記のすべてのプロパティを持つ構造を実装していますが、要素の選択は過去の選択回数 d で O(d) を取ります (「まだ選択されていない」かどうかを明示的にチェックするため)。O(1) でのピッキングを可能にする構造を理解することはできますが、これらは他の操作の少なくとも 1 つでより複雑です。
ところで: 上記の O(1) は、複雑さが以前に選択された要素とは無関係であり、合計の要素とは無関係であることを意味することに注意してください。
*モンテカルロ アルゴリズム (n 個の要素の「セット」から p 個のランダムな要素を繰り返し選択する)。