Wydaje mi się, że lepiej posłużyć się schematem ... bawmy się sztuką ASCII!
Deque to zwykle układ porcji pamięci, ale wszystkie części przedniej i tylnej pamięci są pełne.Jest to konieczne, ponieważ deque jest RandomAccessContainer i dostać O (1) dostęp do dowolnego pojemnika, nie można posiadać numer nieograniczony pojemników, z którego można odczytać rozmiar:
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];
}
operacje te są O (1) z powodu mnożenia/dzielenia!
W moim przykładzie przypuszczam, że porcja w pamięci jest pełna, gdy zawiera 8 elementów. W praktyce nikt nie powiedział, że rozmiar powinien zostać ustalony, tylko że wszystkie wewnętrzne wiadra będą miały ten sam rozmiar.
// Deque
0: ++
1: ++++++++
2: ++++++++
3: ++++++++
4: +++++
teraz powiedzieć, że chcemy wstawić w indeksie 13. To spada gdzieś w wiadrze oznaczonego 2. Istnieje kilka strategii możemy myśleć o:
- przedłużyć wiadro 2 (tylko)
- wprowadzić nową wiadro przed lub po 2 i przetasować tylko kilka elementów
ale te dwie strategie naruszałyby niezmiennego, że wszystkie „wewnętrzny” wiadra mają taką samą num elementy.
Dlatego jesteśmy w lewo z tasowania elementy dookoła, albo w kierunku początku lub końca (którakolwiek jest tańszy), w naszym przypadku:
// Deque
0: +++
1: ++++++++
2: +O++++++
3: ++++++++
4: +++++
Uwaga jak wiadro 0 rosła.
Ten shuffle oznacza, że w najgorszym przypadku przeniesiesz połowę elementów: O (N/2).
deque
ma wstawkę O (1) na początku lub na końcu, ponieważ istnieje tylko kwestia dodania elementu we właściwym miejscu lub (jeśli wiadro jest pełne), tworząc nowe wiadro.
Istnieją inne pojemniki, które mają lepsze zachowanie przy wstawianiu/wymazywaniu w losowych indeksach, na podstawie B+ Trees. W indeksowanym drzewie B + można zamiast "klucza" (lub równolegle) utrzymywać wewnętrznie liczbę elementów przed określoną pozycją. Istnieją różne techniki, aby to zrobić skutecznie. Na koniec otrzymasz pojemnik:
- O (1): puste, wielkość
- O (log N): co, wkładki, wymazać
Można sprawdzić moduł blist
w Python, który implementuje element podobny do listy Pythona wspierany przez taką strukturę.
Najgorszy przypadek będzie O (n/2) – Pubby