すべての実装が提供するわけではありませんが、これらすべての操作をO(1)時間で提供するために、 deque(両端キュー)を実装できます。私はJavaのArrayDequeを使用したことがないので、ランダムアクセスをサポートしていないことについて冗談を言っていると思いましたが、あなたは絶対に正しいです。理由はわかりますが、それは確かに迷惑です...
私にとって、非常に高速な両端キューを実装する理想的な方法は、循環バッファーを使用することです。特に、前面と背面に削除を追加することにのみ関心があるためです。私はJavaで1つをすぐに認識していませんが、オープンソースフレームワークの一部としてObjective-Cで1つ作成しました。コードをそのまま使用することも、独自のコードを実装するためのパターンとして使用することもできます。
これは、コードと関連ドキュメントへのWebSVNポータルです。本物の肉はCHAbstractCircularBufferCollection.mファイルにあります—とメソッドを探してください。カスタム列挙子(Javaでは「イテレータ」)も定義されています。本質的な循環バッファロジックはかなり些細なものであり、次の3つの集中型マクロに取り込まれます。appendObject:
prependObject:
#define
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
メソッドでわかるようobjectAtIndex:
に、両端キューのN番目の要素にアクセスするために行うことはすべてですarray[transformIndex(N)]
。tailIndex
最後に保存された要素の1つ先のスロットを常に指すようにすることに注意してください。したがって、の場合headIndex == tailIndex
、配列はいっぱいになり、サイズが0の場合は空になります。
お役に立てば幸いです。Java以外のコードを投稿してしまったことをお詫びしますが、質問の作者は一般的な回答は受け入れられると言っていました。