为什么std :: deque子阵列大小已修复?

时间:2017-11-21 23:37:46

标签: c++ algorithm c++11 time-complexity deque

背景

std::deque使用子数组来存储其元素。它有一个额外的簿记数据结构,以跟踪其子阵列。这样,与std::vector相比,std::deque可以从后面增长得更快(O(1)与摊销的O(1)相比),前面的速度要快得多(O(1)与O相比(N))。这是因为std::deque只能在两端添加一个子数组,只需要修改其簿记数据结构。

问题

我不明白为什么子阵列的大小按照here所解释的那样固定:

  

典型的实现使用一系列单独分配的固定大小的数组

没有固定大小的子阵列有很多优点。例如,由于子阵列的大小是固定的,因此中间的任何插入都必须是O(n)复杂度,其中n是最近端的元素数。但是,如果子阵列可以自由增长,则中间的插入将是O(k),其中k是子阵列中元素的数量,这要快得多,特别是如果std::deque有很多子阵列。从中间删除也是一样的。

是因为std::deque想要保持其子阵列平衡吗?如果子阵列太大/太小,则可以通过启用子阵列进行拆分或合并来轻松减轻这种情况。复杂性将只是O(k),其中k是最大子阵列的大小。 (或者最小子阵列与它的较小邻居的组合大小)

是否因为固定大小的子阵列使得随机迭代更快?例如,如果你想要第n个元素,你必须通过簿记数据结构并添加所有先前子阵列的大小,使得复杂度为O(k),其中k是簿记的大小 数据结构。但这不是一个大问题,因为std::deque被宣传为双向链表,无论如何都有更好的缓存。

编辑: std::deque只是链接列表实现和数组实现之间的中间人。我想我的问题已经失去了它的原始含义,并且只是建议它应该更像链接列表而不是矢量

1 个答案:

答案 0 :(得分:5)

  

我不明白为什么子阵列的大小已经固定

因为这允许标准所要求的恒定复杂性随机访问,如评论中所指出的那样。

  

但这不是一个大问题

我不同意,大概是标准委员会也是如此。

  

因为std::deque被宣传为双重链接列表...

它没有被广告宣传。