java ArrayList的时间复杂度
ArrayList
是一个数组或java中的列表? 获取操作的时间复杂度是O(n)
还是O(1)
?
Java中的ArrayList
是一个由array
支持的List
。
get(index)
方法是一个常量, O(1)
操作。
直接从ArrayList.get(index)
的Java库中获取代码:
public E get(int index) { RangeCheck(index); return (E) elementData[index]; }
基本上,它只是返回一个值直接从支持数组。 ( RangeCheck(index)
)也是恒定的时间)
它的实现是通过一个数组完成的,get操作是O(1)。
javadoc说:
大小,isEmpty,get,set,iterator和listIterator操作在一定的时间内运行。 add操作以分摊的恒定时间运行,即添加n个元素需要O(n)个时间。 所有其他的操作都在线性时间内运行(粗略地说)。 与LinkedList实现相比,常数因子较低。
正如大家已经指出的那样,读操作是恒定的 – O(1),但是写操作有可能会耗尽后备arrays中的空间,重新分配和拷贝 – 这样在O(n)时间,正如文件所说:
大小,isEmpty,get,set,iterator和listIterator操作在一定的时间内运行。 add操作以分摊的恒定时间运行,即添加n个元素需要O(n)个时间。 所有其他的操作都在线性时间内运行(粗略地说)。 与LinkedList实现相比,常数因子较低。
在实践中一切都是O(1)几个加法之后,因为每次容量耗尽时,支持数组都会加倍。 所以如果数组从16开始,就会变满,重新分配到32,然后是64,128等,所以它可以扩展,但是GC可以在一个大的重新分配期间重新启动。
为了迂回,它是一个由数组支持的List
。 是的, get()
的时间复杂度是O(1)。