web-dev-qa-db-ja.com

Java ArrayListの時間の複雑さ

ArrayListはJavaの配列またはリストですか? get操作の時間の複雑さは何ですか、それはO(n)またはO(1)ですか?

60
Hidayat

JavaのArrayListは、Listによって裏付けられたarrayです。

get(index)メソッドは、一定時間のO(1)操作です。

Java ArrayList.get(index)のライブラリから直接出るコード:

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

基本的に、バッキング配列から直接値を返します。 (RangeCheck(index))も一定時間です)

109
jjnguy

実装は配列を使用して行われ、get操作はO(1)です。

javadocより:

Size、isEmpty、get、set、iterator、およびlistIterator操作は一定の時間で実行されます。追加操作が実行される 償却された一定時間つまり、n個の要素を追加するには、O(n) time。が必要です。他のすべての操作は線形時間で実行されます(大まかに言って)。

20
tangens

誰もがすでに指摘したように、読み取り操作は一定時間です-O(1)しかし、書き込み操作は、バッキング配列のスペース、再割り当て、およびコピーを使い果たす可能性があります-ドキュメントが言うように、O(n)時間で実行されます:

Size、isEmpty、get、set、iterator、およびlistIterator操作は一定の時間で実行されます。 追加操作は償却された一定時間で実行されます。つまり、n個の要素を追加するにはO(n)時間が必要です。他のすべての操作は線形時間で実行されます)。定数係数は、LinkedList実装の定数係数と比較して低くなっています。

実際には、バッキング配列は容量が使い果たされるたびに2倍になるため、数回の追加の後、すべてがO(1)です。 、64、128などのようにスケーリングできますが、大きな再割り当て中にGCがヒットする可能性があります。

12
Kristopher Ives

教訓的であるために、それは配列によって支えられたListです。はい、get()の時間の複雑さはO(1)です。

4
Carl Smotricz

ただのメモ。

get(index)メソッドは一定時間です、O(1)

しかし、インデックスがわかっている場合はそうです。 indexOf(something)を使用してインデックスを取得しようとすると、O(n)がかかります

0
prime