Я просматривал этот пост, и в нем говорится, что deque предоставляет эффективная вставка вверху и внизу. Однако этот пост здесь говорится, что временная сложность двухсторонней очереди, кроме задней, составляет O (n). Я бы подумал, что если двухсторонняя очередь имеет эффективную верхнюю и нижнюю вставку, она будет иметь O (1), в то время как вектор должен иметь O (1) при вставке снизу Только. Я был бы признателен, если бы кто-нибудь мог прояснить это
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
Обзор вектора шаблона класса :
Вектор - это контейнер последовательности, который поддерживает итераторы произвольного доступа. Кроме того, он поддерживает (амортизированные) операции вставки и стирания с постоянным временем в конце; вставка и стирание в середине занимают линейное время. Управление хранилищем осуществляется автоматически, хотя могут быть даны подсказки для повышения эффективности. [...]
C ++ 98, раздел 23.2.1 (Deque класса шаблона)
«Двусторонняя очередь ... поддерживает операции вставки и стирания с постоянным временем в начале или в конце; вставка и стирание в середине занимают линейное время. То есть двухсторонняя очередь особенно оптимизирована для нажатия и выталкивания элементов в начале и в конце. . Как и в случае с векторами, управление хранилищем осуществляется автоматически ».
Так что да: вставка O (1) на обоих концах.
Из стандарта 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.
Акцент мой
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.