【问题标题】:What is the time complexity of the ArrayList.add method? [duplicate]ArrayList.add 方法的时间复杂度是多少? [复制]
【发布时间】:2020-07-17 23:13:34
【问题描述】:

class ArrayList<E>java documentation 指定:

sizeisEmptygetsetiteratorlistIterator 操作在恒定时间内运行。 add 操作运行在摊销常数时间,即添加n 个元素需要O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList 实现相比,常数因子较低。

每个ArrayList 实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到ArrayList,其容量会自动增长。除了添加元素具有恒定的摊销时间成本这一事实之外,没有指定增长策略的细节。

这怎么可能?

void add​(int index, E element) 方法在此列表中的指定位置插入指定元素,将所有后续元素向右移动。虽然通过使用几何增长重新分配后备数组,似乎可以实现 amortized constant timeArrayList 的末尾插入 n 个元素,但这不会允许 在数组中间插入元素时的摊销常数时间。

文档是否仅提及add(element E) 方法,或者是否有一个巧妙的技巧可以在所有情况下实现摊销常数时间

【问题讨论】:

    标签: java performance arraylist


    【解决方案1】:

    正如this answer 中所解释的,Oracle 使用了一个令人困惑的约定:当他们提到add 方法时,他们通常指的是add(E element) 方法,而void add​(int index, E element) 被称为插入 方法...方法名确实很混乱,类名也是如此。

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      相关资源
      最近更新 更多