here Я прочитал от принятого ответа, что станд :: Deque имеет следующие характеристикиКак Deque имеют амортизируются постоянное время Сложность
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)
Мой вопрос о пункте 2. Как может Deque иметь амортизируется постоянная вставка в конце или в начале?
Я понимаю, что a std::vector
имеет амортизированную постоянную временную сложность для вставок в конце. Это связано с тем, что вектор является условным и представляет собой динамический массив. Поэтому, когда в конце памяти заканчивается push_back
, он выделяет целый новый блок памяти, копирует существующие элементы из старого местоположения в новое место и затем удаляет элементы из старого местоположения. Эта операция, которую я понимаю, амортизируется постоянной. Как это относится к deque? Как вставки в верхней и нижней части дека амортизируются постоянными. У меня создалось впечатление, что он должен быть постоянным O (1). Я знаю, что дека состоит из кусков памяти.
применяется тот же принцип, что и 'std :: vector'. Операция - «O (1)», в случаях, когда требуются новые выделения, когда ранее выделенные слоты заполнены. – njzk2
@ njzk2 Вам не нужно ** копировать старые значения. Вы просто выделяете новый * фиксированный размер * кусок и связываете его в начале/конце.Это O (1); не амортизируется O (1) [при условии, что выделение * фиксированного * объема памяти равно O (1)]. Возможно, он использует амортизацию, чтобы позволить реализациям использовать один большой блок смежной памяти, однако это было бы не очень полезно на практике, за исключением случаев, когда 'deque' не сильно меняется, и вам действительно нужна непрерывная память для выполнения определенных очень эффективно. – Bakuriu
@Bakuriu: ok. Тогда только новые распределения. Спасибо за разъяснение. – njzk2