Data structures 为什么动态数组总是以2的倍数加倍?

Data structures 为什么动态数组总是以2的倍数加倍?,data-structures,Data Structures,我想知道动态数组的大小调整是如何决定的? 在维基百科和其他我经常看到元素数量增加了2倍的地方?为什么是2?为什么不是3?如何决定这个因素?如果它依赖于语言,我想知道Java的这一点。实际上,在Java的ArrayList中,调整大小后计算新容量的公式是: newCapacity = (oldCapacity * 3)/2 + 1; 这大致意味着1.5倍 关于这个数字的原因我不知道,但我希望有人做过统计分析,发现这是空间和计算开销之间的一个很好的折衷。引用: 当插入n个元素时,容量形成几何级数。

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

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

newCapacity = (oldCapacity * 3)/2 + 1;
这大致意味着1.5倍

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

引用:

当插入n个元素时,容量形成几何级数。按任意固定比例扩展数组可确保插入n个元素总共需要O(n)个时间,这意味着每次插入都需要摊销的固定时间。该比例a的值导致了时空权衡:每次插入操作的平均时间约为a/(a)−1) ,而浪费的单元数的上限为(a−1) n。a的选择取决于库或应用程序:通常使用a=3/2和a=2[需要引用]


显然,它似乎是CPU时间和内存浪费之间的一个很好的折衷方案。我想“最佳”值取决于应用程序的功能。

您会浪费比实际使用更多的空间吗?
如果不是,则系数应小于或等于2。

如果您希望它是一个整数,因此使用起来很简单,那么只有一个选择

@Andrea:即使是这样,也有一些很好的图表,所以摊销时间是关键。谷歌“摊销分析”并找到类似的东西,因为根据定义,翻倍总是2的一个因素。如果你想增加3倍,你就要增加三倍。