Я просматривал этот пост, и в нем говорится, что deque предоставляет эффективная вставка вверху и внизу. Однако этот пост здесь говорится, что временная сложность двухсторонней очереди, кроме задней, составляет O (n). Я бы подумал, что если двухсторонняя очередь имеет эффективную верхнюю и нижнюю вставку, она будет иметь O (1), в то время как вектор должен иметь O (1) при вставке снизу Только. Я был бы признателен, если бы кто-нибудь мог прояснить это

3
Rajeshwar 10 Мар 2014 в 21:21
Это ошибка в сообщении блога, даже вопрос SO, на который он ссылается; понимает это правильно.
 – 
jfs
10 Мар 2014 в 21:26

3 ответа

Лучший ответ

Запись cppreference для std :: deque дает следующую сложность:

Сложность (эффективность) типовых операций над деками следующая:

  • Произвольный доступ - константа O (1)
  • Вставка или удаление элементов в конце или начале - амортизируемая константа O (1)
  • Вставка или удаление элементов - линейный O (n)

Что соответствует проекту стандарта C ++ раздел 23.3.3.1 Обзор deque шаблона класса , в котором говорится ( выделено мной ):

Двусторонняя очередь - это контейнер последовательности, который, как вектор (23.3.6), поддерживает итераторы с произвольным доступом. Кроме того, он поддерживает операции вставки и стирания с постоянным временем в начале или в конце; вставка и стирание в середине занимают линейное время. То есть двухсторонняя очередь особенно оптимизирована для нажатия и выталкивания элементов в начале и в конце . Как и в случае с векторами, управление хранилищем осуществляется автоматически.

Для std :: vector cppreference говорит:

Сложность (эффективность) обычных операций над векторами следующая:

  • Произвольный доступ - константа O (1)
  • Вставка или удаление элементов в конце - амортизированная постоянная O (1)
  • Вставка или удаление элементов - линейно по расстоянию до конца вектора O (n)

Что согласуется с черновиком стандартного раздела 23.3.6.1 Обзор вектора шаблона класса :

Вектор - это контейнер последовательности, который поддерживает итераторы произвольного доступа. Кроме того, он поддерживает (амортизированные) операции вставки и стирания с постоянным временем в конце; вставка и стирание в середине занимают линейное время. Управление хранилищем осуществляется автоматически, хотя могут быть даны подсказки для повышения эффективности. [...]

2
Shafik Yaghmour 10 Мар 2014 в 22:19
Имеет ли вектор вставку 0 (1) на обоих концах или только в конце?
 – 
Rajeshwar
10 Мар 2014 в 22:17
2
Либо они изменили формулировку в cppreference, либо вы неверно процитировали, но сложность вставки / удаления на концах для deque указана как константа O (1) не амортизированная константа O (1). Это, очевидно, важно, но в качестве примечания, хоть убей, я не могу понять, насколько вообще возможен постоянный O (1).
 – 
dcmm88
17 Ноя 2016 в 07:02

C ++ 98, раздел 23.2.1 (Deque класса шаблона)

«Двусторонняя очередь ... поддерживает операции вставки и стирания с постоянным временем в начале или в конце; вставка и стирание в середине занимают линейное время. То есть двухсторонняя очередь особенно оптимизирована для нажатия и выталкивания элементов в начале и в конце. . Как и в случае с векторами, управление хранилищем осуществляется автоматически ».

Так что да: вставка O (1) на обоих концах.

4
user3392484 10 Мар 2014 в 21:24

Из стандарта C ++:

23.3.3.4 модификаторы deque [модификаторы deque]

[...]
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);

[...]

3 Сложность: сложность линейна в зависимости от количества вставленных элементов плюс меньшее из расстояний до начала и конца двухсторонней очереди. Вставка одного элемента в начало или конец двухсторонней очереди всегда занимает постоянное время и вызывает единственный вызов конструктора T.

Акцент мой

4
Cornstalks 10 Мар 2014 в 21:24