一定時間(O(1))で追加とランダム削除を可能にするRandomQueueを書く必要があります。
私の最初の考えは、ある種の配列(ArrayListを選択しました)でそれをバックアップすることでした。配列はインデックスを介して常にアクセスできるためです。
しかし、ドキュメントを見ると、ArrayListsの追加はAmortized Constant Timeと見なされていることに気付きました。これは、追加には基になる配列(O(n))の再割り当てが必要になる可能性があるためです。
Amortized Constant TimeとConstant Timeは事実上同じですか、または追加ごとに完全な再割り当てを必要としない構造を調べる必要がありますか?
配列ベースの構造は別として(私が知っている限り、常に一定の時間での償却が追加されます)、要件を満たすものは考えられないため、これを求めています:
- ツリーベースのものはすべて、せいぜいO(log n)アクセスを持ちます。
- リンクされたリストには、潜在的にO(1)が追加される可能性があります(テールへの参照が保持される場合)が、ランダムな削除はせいぜいO(n)でなければなりません。
完全な質問は次のとおりです。私がいくつかの重要な詳細にlazした場合に備えて:
RandomQueueを設計および実装します。これはQueueインターフェースの実装であり、remove()操作は、現在キューにあるすべての要素の中からランダムに均一に選択された要素を削除します。(RandomQueueは、要素を追加したり、ランダムな要素に到達してやみくもに削除できるバッグと考えてください。)RandomQueueのadd(x)およびremove()操作は、操作ごとに一定の時間で実行する必要があります。
1/a
O(n)操作の可能性があります)が、一定の要因での成長は、a > 1
追加で償却されたO(1)です:(1/a)^n
Oの可能性があります(n)操作。ただし、その確率は大の場合ゼロに近づくn
。