java中是ArrayList
数组还是列表?get 操作的时间复杂度是多少O(n)
?O(1)
6 回答
ArrayList
Java 中的anList
是由array
.
该get(index)
方法是一个恒定的时间, O(1)
, 操作。
直接来自 Java 库的代码ArrayList.get(index)
:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
基本上,它只是直接从后备数组中返回一个值。( RangeCheck(index)
) 也是常数时间)
它的实现是用一个数组完成的,get 操作是 O(1)。
javadoc 说:
size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作以摊销常数时间运行,即添加 n 个元素需要 O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。
正如每个人已经指出的那样,读取操作是恒定时间 - O(1) 但写入操作有可能耗尽后备数组中的空间、重新分配和复制 - 因此在 O(n) 时间内运行,正如文档所说:
size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作在摊销常数时间内运行,即添加 n 个元素需要 O(n) 时间。 所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。
在实践中,经过几次添加后,一切都是 O(1),因为每次容量耗尽时,后备数组都会加倍。因此,如果数组从 16 开始,满了,它会重新分配到 32,然后是 64、128 等等,所以它可以扩展,但是 GC 可能会在大重新分配期间命中。
为了迂腐,它是List
由数组支持的。是的,时间复杂度get()
是 O(1)。
只是一个注释。
该get(index)
方法是一个恒定的时间,O(1)
但如果我们知道索引,情况就是这样。如果我们尝试使用 获取索引indexOf(something)
,那将花费O(n)
arraylist 基本上是数组的一个实现。因此对其进行 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.