ho letto here dalla risposta accettata che una std :: deque ha la seguente caratteristicaCome fa deque hanno un ammortamento costante complessità temporale
1- Random access - constant O(1)
2- Insertion or removal of elements at the end or beginning - amortized constant O(1)
3- Insertion or removal of elements - linear O(n)
La mia domanda riguarda il punto 2. Come può un deque avere un ammortizzato inserimento costante alla fine o all'inizio?
Capisco che uno std::vector
ha una complessità a tempo costante ammortizzato per gli inserimenti alla fine. Questo perché un vettore è continguente ed è un array dinamico. Quindi, quando esaurisce la memoria per uno push_back
alla fine, allocherà un intero nuovo blocco di memoria, copierà gli elementi esistenti dalla vecchia posizione alla nuova posizione e quindi eliminerà gli elementi dalla vecchia posizione. Questa operazione capisco è ammortizzata costante. Come si applica a un deque? Come possono essere ammortizzate le inserzioni nella parte superiore e inferiore di una deque. Avevo l'impressione che doveva essere costante O (1). So che una deque è composta da blocchi di memoria.
si applica lo stesso principio di 'std :: vector'. L'operazione è 'O (1)', con casi che richiedono una nuova allocazione quando gli slot allocati in precedenza sono pieni. – njzk2
@ njzk2 ** Non è necessario copiare i vecchi valori. Basta allocare un nuovo blocco * di dimensioni fisse * e collegarlo all'inizio/alla fine.Quello è O (1); non ammortizzato O (1) [supponendo che l'assegnazione della quantità * fissa * di memoria sia O (1)]. Forse usa ammortizzato per consentire implementazioni usando un unico grande blocco di memoria contigua, tuttavia non sarebbe molto utile in pratica, tranne se il 'deque' non cambia molto e hai davvero bisogno di memoria contigua per eseguire alcuni particolari operazione molto efficiente. – Bakuriu
@Bakuriu: ok. Solo nuove allocazioni, quindi. Grazie per il chiarimento. – njzk2