deque在顶部插入时是否提供0(1)复杂度?
Does deque provide O(1) complexity when inserting on top
我看了这篇文章,上面说deque在顶部和底部提供了有效的插入。然而,这篇文章指出,deque的时间复杂度是O(n)。我认为,如果一个deque有有效的顶部和底部插入,它将有O(1),而一个向量应该只有O(1)底部插入。如果有人能澄清一下,我将不胜感激
c++ 98,第23.2.1节(模板类deque)
"A deque…支持固定时间的开始或结束插入和擦除操作;中间的插入和擦除需要线性时间。也就是说,deque特别针对在开始和结束时推入和弹出元素进行了优化。与vector一样,存储管理是自动处理的。"
所以是的:0(1)插入在两端
来自c++标准:
23.3.3.4 deque modifiers [deque.modifiers]
[...]
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);
[…]复杂度:复杂度与插入元素的数量加上到队列开始和结束的距离的小者成线性关系。在deque的开头或结尾插入单个元素总是花费常量时间,并导致对t的构造函数进行一次调用。
强调我的
std::deque的cppreference项给出了如下复杂度:
队列上常见操作的复杂度(效率)如下:
- 随机访问-常数O(1)
- 在末尾或开头插入或删除元素-平摊常数O(1)
- 插入或删除元素-线性O(n)
与c++标准草案23.3.3.1
类模板队列概述一致,其中说(强调我的):
deque是一个序列容器,与vector(23.3.6)一样,它支持随机访问迭代器。此外,它支持在开始或结束时进行恒定时间的插入和擦除操作;中间的插入和擦除需要线性时间。也就是说, deque特别针对开头和结尾的推入和弹出元素进行了优化。与vector一样,存储管理是自动处理的。
For std::vector cppreference表示:
对向量进行常见操作的复杂度(效率)如下:
- 随机访问-常数O(1)
- 末端元素的插入或移除-平摊常数O(1)
- 插入或移除元素-与向量O(n)末端的距离呈线性
与标准草案23.3.6.1
章节一致类模板矢量概述:
vector是支持随机访问迭代器的序列容器。此外,它支持(平摊)常数时间的末端插入和擦除操作,中间的插入和擦除操作需要线性时间。存储管理是自动处理的,尽管可以给出提示以提高效率。[…]
相关文章:
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- C++中 std::map 的运行时复杂度是多少?
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 确定 for 循环的不同大 O 复杂度
- 此print_star函数的运行时复杂度是多少?
- 查找数字是否为 2 的幂的时间复杂度
- deque在顶部插入时是否提供0(1)复杂度?