両端キュー(両端キューが)が、O(1)時間内にすべてのこれらの操作を提供するために実装することができる。いくつかの良い提案をして、ここでの実装へのリンクがありましたすべての実装ではありません。私はJavaのArrayDequeを使用したことがないので、あなたはランダムアクセスをサポートしていないと冗談を言っていると思っていましたが、あなたは本当に正しいです - "純粋な"両端キューとして、理由は分かりますが、確かに迷惑です...
非常に高速な両端キューを実装する理想的な方法は、特に前面と背面での取り外しの追加にのみ関心があるため、circular bufferを使用することです。私はJavaですぐに認識していませんが、私はObjective-Cでオープンソースフレームワークの一部として書いています。コードをそのまま、または独自のコードを実装するためのパターンとして使用できます。
ここには、WebSVN portal to the codeとrelated documentationがあります。実際の肉はCHAbstractCircularBufferCollection.mファイルにあります - appendObject:
とprependObject:
メソッドを探します。カスタム列挙子(Javaの "iterator")も定義されています。基本的な循環バッファ・ロジックはかなり簡単です、そしてこれらの3つの集中#define
マクロで捕獲された:あなたはobjectAtIndex:
方法で見ることができるように
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
は、あなたが両端キュー内のN番目の要素にアクセスするために行うすべてがarray[transformIndex(N)]
です。私はサイズが役立ちます0
希望の場合は、配列がいっぱい、または空であるheadIndex == tailIndex
ので、もしtailIndex
は常に、最後に保存された要素を超えて一つのスロットを指して作ることに注意してください。 Java以外のコードを投稿することについて申し訳ありませんが、質問者はと答えました。
として
AbstractList<A>
から他のメソッドを追加することができます! – Hexagon明確にするために、キュー内の値またはキーまたはその位置を取得しますか? – Schwern
@Hexagon:償却、はい。 – ephemient