ArrayList
はJavaの配列またはリストですか? get操作の時間の複雑さは何ですか、それはO(n)
またはO(1)
ですか?
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)
)も一定時間です)
実装は配列を使用して行われ、get操作はO(1)です。
javadocより:
Size、isEmpty、get、set、iterator、およびlistIterator操作は一定の時間で実行されます。追加操作が実行される 償却された一定時間つまり、n個の要素を追加するには、O(n) time。が必要です。他のすべての操作は線形時間で実行されます(大まかに言って)。
誰もがすでに指摘したように、読み取り操作は一定時間です-O(1)しかし、書き込み操作は、バッキング配列のスペース、再割り当て、およびコピーを使い果たす可能性があります-ドキュメントが言うように、O(n)時間で実行されます:
Size、isEmpty、get、set、iterator、およびlistIterator操作は一定の時間で実行されます。 追加操作は償却された一定時間で実行されます。つまり、n個の要素を追加するにはO(n)時間が必要です。他のすべての操作は線形時間で実行されます)。定数係数は、LinkedList実装の定数係数と比較して低くなっています。
実際には、バッキング配列は容量が使い果たされるたびに2倍になるため、数回の追加の後、すべてがO(1)です。 、64、128などのようにスケーリングできますが、大きな再割り当て中にGCがヒットする可能性があります。
教訓的であるために、それは配列によって支えられたList
です。はい、get()
の時間の複雑さはO(1)です。
ただのメモ。
get(index)
メソッドは一定時間です、O(1)
しかし、インデックスがわかっている場合はそうです。 indexOf(something)
を使用してインデックスを取得しようとすると、O(n)
がかかります