java ArrayList的时间复杂度

时间:2010-02-02 08:08:04

标签: java arraylist time-complexity

ArrayList是java中的数组还是列表? get操作的时间复杂度是O(n)还是O(1)

6 个答案:

答案 0 :(得分:107)

Java中的ArrayList是由List支持的array

get(index)方法是一个常数时间O(1),操作。

代码直接来自ArrayList.get(index)的Java库:

public E get(int index) {
    RangeCheck(index);
    return (E) elementData[index];
}

基本上,它只是从支持数组中直接返回一个值。 (RangeCheck(index))也是常数时间)

答案 1 :(得分:20)

它的实现是通过数组完成的,get操作是O(1)。

javadoc说:

  

大小,isEmpty,get,set,    iterator和listIterator操作以常量运行    时间。添加操作以摊销的常量时间运行,    也就是说,添加n个元素需要O(n)时间。所有其他操作    以线性时间运行(粗略地说)。恒定因子比较低    对于LinkedList实现的那个。

答案 2 :(得分:12)

正如大家已经指出的那样,读操作是恒定时间--O(1)但是写操作有可能在后备阵列中耗尽空间,重新分配和复制 - 因此在O中运行( n)时间,正如文件所说:

  

size,isEmpty,get,set,iterator,   和listIterator操作运行   恒定时间。 添加操作运行   在摊销的常数时间,即,   添加n个元素需要O(n)时间。   所有其他操作都在运行   线性时间(粗略地说)。该   恒定因子相比较低   对于LinkedList   实施

实际上,在几次添加之后,所有内容都是O(1),因为每次容量耗尽时,后备阵列都会加倍。因此,如果数组从16开始,变满,它将被重新分配到32,然后是64,128等,所以它可以正常扩展,但GC可以在重新分配期间启动。

答案 3 :(得分:4)

要迂腐,这是一个由数组支持的List。是的,get()的时间复杂度为O(1)。

答案 4 :(得分:0)

只是一个注意事项。

get(index)方法是一个固定时间O(1)

但如果我们知道索引就是这种情况。如果我们尝试使用indexOf(something)获取索引,那么费用为O(n)

答案 5 :(得分:0)

arraylist基本上是array的实现。因此,CRUD操作的时间复杂度为:

get/read :  O(1) since you can seek the address directly from base

remove/delete : O(n) why ? Because once we delete the element at index, then we need to move the after values one by one to the left. 

add : O(1) becuase you always add the end of the array - next free address available.

update : O(1) since you are just changing the value but nothing value moving....across the array.