为什么动态数组总是加倍2倍?

时间:2010-03-30 13:56:12

标签: data-structures

我想知道如何决定动态数组调整大小的调整大小因素? 在维基百科和其他地方我总是看到元素的数量增加了2倍?为什么2?为什么不3?一个人如何决定这个因素?如果它依赖于语言,我想知道Java。

3 个答案:

答案 0 :(得分:2)

引自Wikipedia

  

当插入n个元素时,容量形成几何级数。以任何恒定比例扩展数组可确保插入n个元素总体上花费O(n)时间,这意味着每个插入都需要按时间分摊。该比例a的值导致时空权衡:每次插入操作的平均时间约为a /(a-1),而浪费的细胞数量高于(a-1)n。 a的选择取决于库或应用:a = 3/2 1和a = 2 [需要引用]是常用的。

显然,它似乎是CPU时间和内存浪费之间的良好折衷。我想“最佳”值取决于您的应用程序的作用。

答案 1 :(得分:0)

实际上在Java的ArrayList中,调整大小后计算新容量的公式是:

newCapacity = (oldCapacity * 3)/2 + 1;

这意味着1.5因素。

关于这个号码的原因我不知道,但我希望有人做过统计分析,发现这是空间和计算开销之间的良好折衷。

答案 2 :(得分:0)

您是否会浪费比实际使用更多的空间?
如果不是,该因子应小于或等于2.
如果您希望它是一个整数,那么它很容易使用,只有一个选择。