其他分享
首页 > 其他分享> > c – 删除向量和双端队列中项目的时间复杂度

c – 删除向量和双端队列中项目的时间复杂度

作者:互联网

我已经读过,在std :: vector的末尾添加项目的时间复杂度是分摊常量,并且在std :: deque的顶部和底部插入项目是常量.因为这两个容器都有一个随机访问迭代器,因此访问元素任何指数都是不变的.如果我有任何这些事实错误,请告诉我.我的问题是,如果访问std :: vector或std :: deque中的元素是常量,那么为什么通过擦除O(n)删除元素的时间复杂度.这里的答案之一here表明通过擦除去除元素是O(n).我知道擦除会删除起始迭代器和结束迭代器之间的元素,所以答案基本上意味着它的O(n)取决于两个迭代器之间的元素的数量,并且从任何向量/双端队列中删除单个元素指数会为零?

解决方法:

对于std :: vector和std :: deque,情况有点不同,以及它们对于C 98和C 11是不同的.

的std ::矢量

std :: vector :: erase()的复杂性与擦除范围的长度以及范围的结尾和容器的末尾之间的元素数量是线性的(因此从末尾擦除元素需要不变时间).

C 2003 [lib.vector.modifiers]读取:

iterator erase(iterator position);
iterator erase(iterator first, iterator last);`

Complexity: The destructor of T is called the number of times equal to the number of the elements erased,
but the assignment operator of T is called the number of times equal to the number of elements in the vector after the erased elements.

C 14草案N4140 [vector.modifiers]读取:

Complexity: The destructor of T is called the number of times equal to the number of the elements
erased, but the move assignment operator of T is called the number of times equal to the number of
elements in the vector after the erased elements.

因此,您可以看到C 11/14实现通常更有效,因为它执行移动分配而不是复制分配,但复杂性保持不变.

的std ::双端队列

std :: deque :: erase()的复杂性与擦除范围的长度和两个数字的最小值呈线性关系:范围开始前剩余元素的数量,以及结束后剩余元素的数量范围.因此,从开头或结束擦除元素需要恒定的时间.

C 2003 [lib.deque.modifiers]:

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

Complexity: The number of calls to the destructor is the same as the number of elements erased, but the
number of the calls to the assignment operator is at most equal to the minimum of the number of elements
before the erased elements and the number of elements after the erased elements.

C 14草案N4140 [deque.modifiers] / 5:

Complexity: The number of calls to the destructor is the same as the number of elements erased, but the number of calls to the assignment operator is no more than the lesser of the number of elements before the erased elements and the number of elements after the erased elements.

因此,在C 98和C 11/14中也是如此,除了C 11可以在移动赋值和复制赋值之间进行选择(这里我看到标准中的一些不一致,因为措辞没有提到像std :: ::向量 – 可能是另一个问题的原因).

还要注意措辞中的“最多”和“不再”.这允许实现比线性更有效,但在实践中它们是线性的(DEMO).

标签:deque,c98,c,vector
来源: https://codeday.me/bug/20190930/1837007.html