为什么矢量阵列翻倍?(Why is vector array doubled?)

2019-07-18 01:13发布

为什么(用于Java的ArrayList人),即经典的实现载体的每个扩展,而不是三倍或四倍它一倍的内部数组的大小?

Answer 1:

当计算的平均时间插入到一个载体,你需要允许非生长刀片和不断增长的刀片。

调用操作的总数插入项目 ,平均 。

如果插入项,并且您所要求的的生长因子,然后有的操作。 在最坏的情况下,使用分配的存储空间的

直观地说意味着在最坏的情况你有所以是O(1),以及最坏的情况下使用该分配的存储的50%。

对于较大的你有一个下部 ,但更浪费的存储。

对于较小的较大,但你就不会浪费那么多的存储。 只要几何级数增长,它仍然是O(1)摊销插入时间,但常会得到更高。

生长因子1.25(红色),1.5(青色),2(黑),3(蓝色)和4(绿色),这些图显示点和平均尺寸效率(大小/分配空间比;更多的是更好)对左和时间效率(插入/操作的比率;越多越好)在右侧用于插入400000项。 达到用于所有生长因子之前,为了调整大小100%的空间效率; 为的情况下示出了25%和50%,和空间效率约50%,这是良好的大多数情况下之间的时间效率:

用于运行时 - 诸如Java,阵列被零填充,所以操作分配的数量是正比于数组的大小。 考虑到这给降低了时间效率估计值之间的区别:



Answer 2:

指数地加倍阵列(或字符串)的尺寸为所述阵列中具有足够的细胞和浪费太多存储器之间的良好折衷。

假设我们开始了与10个元素:

1 - 10
2 - 20
3 - 40
4 - 80
5 - 160

当我们的三倍大小,我们增长太快

1 - 10
2 - 30
3 - 90
4 - 270
5 - 810

在实践中,你将增长也许10或12倍。 如果你的三倍,也许会做7或8倍 - 运行时命中的再分配是这几次是足够小的担心,但你更可能完全过头所需要的尺寸。



Answer 3:

如果你分配的内存不寻常大小的块,那么当该块被释放(或者因为你调整它或它得到GC'd)会有在内存中一个不寻常的大小的洞,可能导致的头痛内存管理器。 因此它通常优选两种权力分配内存。 在某些情况下,潜在的内存管理器只会给你一定大小的块,如果你要求一个奇怪的大小将四舍五入到下一个较大的尺寸。 因此,而不是要求470台,又回到512,无论如何,然后再调整,一旦你使用的所有470,你已经问,还不如干脆索要512开始。



Answer 4:

任何多是一种妥协。 让它太大,你浪费了太多的内存。 让它太小了,你浪费的重新分配和复制大量的时间。 我想这是增加一倍,因为有它的工作原理,是很容易实现的。 我也看到,采用1.5为乘数为同一个专有的STL样库 - 我猜它的开发视为加倍浪费太多的内存。



Answer 5:

如果你问一下具体的Java实现的载体和ArrayList的 ,那么它不一定一倍每个扩展。

从Javadoc文档向量:

每个向量试图通过保持以优化存储管理capacitycapacityIncrement 。 容量总是至少为向量大小一样大; 它通常是因为随着组分加入到所述载体时,以块的向量的存储的尺寸增大capacityIncrement 。 应用程序可以增加一个向量的容量插入大量的部件之前; 这降低了增量再分配的数量。

其中一个构造函数向量允许你指定的初始大小和容量增量为载体。 Vector类还提供ensureCapacity(int minCapacity)setSize(int newSize) ,向量的最小尺寸的手动调整,并调整矢量你自己。

ArrayList类非常相似:

每个ArrayList实例都有一个容量。 容量是用于存储在列表中的元件的阵列的大小。 它总是至少和列表的尺寸一样大。 作为元素被添加到一个ArrayList,其容量自动增长。 增长政策的细节无法超越的事实,添加元素具有恒定的摊余成本的时间规定。

一个应用程序可以增加的容量ArrayList加入大量使用的ensureCapacity操作元件的前实例。 这可以减少增量再分配的数量。

如果你问的是一般的实施载体,比大小变大的选择范围,通过多少是一个权衡。 通常,载体是通过阵列的支持。 阵列的大小是固定的。 要调整途径,因为它的全部手段,你有一个数组的所有元素复制到一个新的,更大的阵列。 如果你把你的新阵列过大,那么你已经分配的内存,你将永远不会使用。 如果它太小,则可能需要很长时间才能从旧数组中的元素复制到新的,更大的阵列 - 你不想经常进行的操作。



Answer 6:

就个人而言,我认为它的arbitriary选择。 我们可以使用以e为底的,而不是基体2(而不是由(1 + E)只是多个大小加倍。)

如果你将要加入大量的变量矢量然后如果你仅需要被储存数将是有利的基数较高(以减少复制你会做的amnt。)在另一面上平均的成员,则低碱将被罚款和降低开销的量,因此,加速的事情了。

基地2是一种妥协。



Answer 7:

没有性能上的原因VS翻倍三倍四倍或作为都具有相同大O性能曲线。 但是在绝对数量增加一倍将倾向于更多的空间在正常情况下有效。



文章来源: Why is vector array doubled?