由于几天前的这个问题,关于
先前的问题表明,这些操作需要具有
问题在于实现并不严格符合这些要求。
在
在最坏情况下,
显然,这仍然是摊销的
此外,我不明白如何设计一个数据结构,它严格满足
std::deque::push_back/push_front
的复杂度要求和实际的std::deque
实现一直困扰着我。先前的问题表明,这些操作需要具有
O(1)
的最坏情况复杂度。 我验证了这在中确实是这样的:
这与通过来自23.3.3.4 deque modifiers,参考insert、push/emplace front/back
复杂性:复杂性与插入的元素数量成线性关系,加上到deque开头和结尾的距离中较小的一个。 在deque的开头或结尾插入单个元素始终需要恒定的时间,并导致对T的构造函数的单个调用。
operator[]
等的索引的O(1)
复杂度要求相结合。问题在于实现并不严格符合这些要求。
在
msvc
和gcc
方面,std::deque
实现是一个阻塞数据结构,由指向(固定大小)块的动态数组的指针组成,其中每个块存储一定数量的数据元素。在最坏情况下,
push_back/front
等操作可能需要分配额外的块(这是可以接受的-固定大小分配是O(1)
),但也可能需要调整块指针的动态数组大小-这是不好的,因为这是O(m)
,其中m
是块数,最终是O(n)
。显然,这仍然是摊销的
O(1)
复杂度,并且由于通常m << n
,因此在实践中速度会非常快。 但似乎符合性存在问题?此外,我不明白如何设计一个数据结构,它严格满足
push_back/front
等和operator[]
的O(1)
复杂度要求。 您可以有一个块指针的链表,但这不能给您所需的operator[]
行为。 它是否可以实现?