java - ArrayList 底层数组成本

标签 java amortized-analysis

我最近正在阅读 Java 的 ArrayList。根据我的理解,当 ArrayList 达到其容量时,它会调用其调整大小方法并创建一个新的底层数组,该数组的大小是原始数组的两倍。由于这种情况,这种方式插入可以被视为 O(n),但平均而言仍然是 O(1)。然而,我对它具体增加到两倍大小背后的原因感到困惑。 将其增加到原来容量的 3 倍会更好吗?

最佳答案

重要的是容量以恒定因子增加。该因子是什么并不重要:1.5 与 3 一样好。摊余成本将为 O(1) - 常数时间。但不同的因素会导致不同的常数。

如果您在计算时考虑到该因子,则摊余时间成本为 O(f/(f-1)),其中 f 是因子。如果加倍的时间成本为 2,则三倍的时间成本为 1.5。

大幅增加容量会减少调整大小操作,但会浪费更多空间。您必须找到一个平衡点:将执行时间减少 25% 值得增加 50% 的存储开销吗?

关于java - ArrayList 底层数组成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896216/

相关文章:

java - 如何使用notifyDataSetChanged和Volley

Java rxtxSerial 64 位与 32 位冲突

algorithm - 修正增量函数的摊余成本

complexity-theory - 需要 O(1) 摊销时间的操作在最坏情况下可以有 O(n^2) 时间吗?

algorithm - 用外行的话来说是摊销的复杂性吗?

java - LinkedList 上的递归合并排序

java - luence中无法删除文档索引

java - 从命令行执行java spring项目

java - 大O : Getting all of the keys in a Java HashMap

algorithm - 使用斐波那契数的大小调整动态数组的大小