ArrayList
javaの配列またはリストですか? get 操作の時間計算量はどれくらいですO(n)
かO(1)
?
6 に答える
ArrayList
Javaのは、List
によってサポートされるarray
です。
メソッドはget(index)
一定時間、O(1)
、操作です。
の Java ライブラリから直接取り出したコードArrayList.get(index)
:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
基本的に、バッキング配列から直接値を返すだけです。( RangeCheck(index)
)も一定時間)
その実装は配列で行われ、取得操作は 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 の実装に比べて低くなります。
実際には、バッキング配列は容量が使い果たされるたびに 2 倍になるため、数回追加するとすべてが O(1) になります。したがって、配列が 16 で始まり、いっぱいになると、32、次に 64、128 などに再割り当てされるため、問題なくスケーリングされますが、大きな再割り当て中に GC がヒットする可能性があります。
分かりやすく言うと、これList
は配列に裏打ちされたものです。はい、時間計算量get()
は O(1) です。
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.