Der Standard sagt:
Eine Deque ist ein Sequenzcontainer, der Iteratoren mit wahlfreiem Zugriff unterstützt (27.2.7). Darüber hinaus werden Einfüge- und Löschvorgänge mit konstanter Zeit am Anfang oder am Ende unterstützt. Einfügen und Löschen in der Mitte dauert linear.
In derselben Klausel heißt es jedoch auch:
Alle Komplexitätsanforderungen in dieser Klausel werden ausschließlich in Bezug auf die Anzahl der Operationen an den enthaltenen Objekten angegeben. [Beispiel: Der Kopierkonstruktor vom Typ
vector<vector<int>>
hat eine lineare Komplexität, obwohl die Komplexität des Kopierens jedes enthaltenenvector<int>
selbst linear ist. - Beispiel beenden]
Bedeutet dies nicht, dass das Einfügen zu Beginn beispielsweise deque<int>
eine lineare Zeit in Anspruch nehmen darf, solange nicht mehr als eine konstante Anzahl von Operationen an den int
s ausgeführt wird, die sich bereits in der Deque befinden, und an dem das neue int
Objekt eingefügt wird ?
Angenommen, wir implementieren eine Deque unter Verwendung eines "Vektors der Größe-K-Vektoren". Es scheint, dass einmal alle K-mal, die wir am Anfang einfügen, am Anfang ein neuer Vektor der Größe K hinzugefügt werden muss, sodass alle anderen Vektoren der Größe K verschoben werden müssen. Dies würde bedeuten, dass die zeitliche Komplexität des Einfügens zu Beginn O (N / K) amortisiert wird, wobei N die Gesamtzahl der Elemente ist, K jedoch konstant ist, so dass dies nur O (N) ist. Es scheint jedoch, dass der Standard dies zulässt, da durch das Verschieben eines Vektors der Größe K keines seiner Elemente verschoben wird und die "Komplexitätsanforderungen" "nur in Bezug auf die Anzahl der Operationen" für die enthaltenen int
Objekte angegeben werden.
Erlaubt der Standard dies wirklich? Oder sollten wir es als eine strengere Anforderung interpretieren, dh eine konstante Anzahl von Operationen an den enthaltenen Objekten plus eine konstante zusätzliche Zeit?
vector<vector<int>>
aber dann linear in Bezug auf die Elemente des Inneren verwendet vector<int>
. Wenn Sie nur die Anzahl der Elemente des äußeren Vektors berücksichtigen, würde ich das Kopieren des inneren Vektors als konstant betrachten, obwohl ich mich möglicherweise irre, ist es hier schon spät