okinawa

IT勉強メモ

Javaのコレクション一覧と計算量

各コレクションの特徴

・参考
コレクションクラスの比較 - Javaちょこっとリファレンス

xxxxxxxxxxx ArrayList LinkedList HashMap LinkedHashMap TreeMap HashSet TreeSet
インタフェース List List Map Map Map Set Set
重複 × × × × ×
null可否 × ×
自動ソート × × × × ×
備考 格納した順番が保持される

List

List構造は要素を順番付けして管理するデータ構造。

要素が番号順に並んでいるので、要素番号を指定して取得する。O(1)
list.get(1);

要素番号がわからない時は要素の値で検索。O(n)
list.indexOf("ねこ"));

Map

Map構造はキーと値をセットにした要素を持つデータ構造。

キーの重複は不可。
キーを指定して要素を取得する。O(1)
map.getKey("a");

HashMapは検索時のアドレス特定方法が面白い↓
HashMapについてのメモ - okinawa

Set

Set構造は要素を順番付けせずに管理するデータ構造。

キーや要素番号がない。
そのため要素を1個指定して取得することができない。
要素取得にはIteratorや拡張for文を使う。

コレクションの計算量

クラス 追加 検索 挿入/削除 ランダムアクセス メモリ使用量
ArrayList O(n) O(n) O(n) O(1) 少ない
LinkedList O(1) O(n) O(1) O(n)
HashSet O(1) O(1) O(1) 不可能 多い
TreeSet O(log n) O(log n) O(log n) 不可能 不明

↑色々みたけど微妙に書いてることが違って正解がわからず。この表は当てになりません。
後で修正したい。

※ランダムアクセスの補足

  • ランダムアクセス:アクセスする場所を特定して、そこに一発でアクセスするやり方
  • シーケンシャルアクセス:端から順番に見ていきながらアクセスする場所を探すやり方

・参考
JavaでよくつかうCollection実装クラスの仕組みと特性 - Qiita
Collectionインターフェイスの計算量 - 数学/競プロメモ

計算量の目安

計算量の例 意味
O(1) データ数によらず一定時間で処理が完了する
O(log N) データ数の対数に比例して処理時間が増える
O(N) データ数に比例して処理時間が増える
O(N2) データ数の2乗に比例して処理時間が増える
計算量の例 意味
O(1) ハッシュテーブルのアクセス(衝突なし)
O(log N) 二分探索
O(N) ループ、線形探索
O(N log N) 標準APIが提供するソートアルゴリズム
O(N2) 二重ループ

・参考
計算量に注目してプログラムを高速化する - Qiita