ArrayList
是java中的数组还是列表? get操作的时间复杂度是O(n)
还是O(1)
?
答案 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.