私はあなたがダイアグラムの方がいいと思っています... ASCIIアートで遊ぼう!
通常、両端キューはメモリチャンクの配列ですが、離れていってもフロントとバックメモリチャンクはいっぱいです。これが必要である両端キューがRandomAccessContainerあり、そして任意の容器にO(1)アクセスを取得するので、あなたのサイズを読み取るから容器の無制限の数を持つことはできません。
bool size() const { return first.size + (buckets.size()- 2) * SIZE + last.size; }
T& operator[](size_t i) {
if (i < first.size) { return first[SIZE - i]; }
size_t const correctedIndex = i - first.size;
return buckets[correctedIndex/SIZE][correctedIndex % SIZE];
}
これらの動作は、O(1あります)乗算/除算のため!
私の例では、メモリチャンクには8つの要素が含まれているといっぱいになっていると仮定します。実際には、誰もサイズが固定されているとは言わず、内側のバケツはすべて同じサイズでなければなりません。
// Deque
0: ++
1: ++++++++
2: ++++++++
3: ++++++++
4: +++++
は、今、私たちが考えることができるいくつかの戦略があります。それは2ラベルされたバケツのどこかに落ち、我々はインデックス13で挿入したいことを言います
は2の前または後に新しいバケットを紹介し、いくつかの要素だけ
をシャッフルしかし、これらの2つの戦略は、すべての「内側」バケットが同じNUMを持っていることを不変に違反します要素のber。そこで我々は、我々の場合には、(どちらが安いです)のいずれか先頭や末尾に向かって、周りの要素をシャッフルして残っている
:バケット0が成長する方法
// Deque
0: +++
1: ++++++++
2: +O++++++
3: ++++++++
4: +++++
は注意してください。
このシャッフルは、最悪の場合、要素の半分(O(N/2))を移動することを意味します。
deque
には、正しい場所に要素を追加するか、(バケットがいっぱいである場合)新しいバケットを作成するだけでO(1)の挿入があります。
B+ Treesに基づいて、ランダムインデックスでの挿入/消去の動作が優れている他のコンテナがあります。インデックス付きのB +ツリーでは、「キー」(または並行して)ではなく、特定の位置より前の要素の数を内部的に維持することができます。これを効率的に行うためのさまざまな技術があります。終わりに、あなたがコンテナを取得する:
を消去あなたにはblist
モジュールを確認することができますPythonは、このような構造に裏打ちされたPythonのリストのような要素を実装しています。
最悪の場合はO(n/2) – Pubby