HashMapとは?
2017/2/24 勉強会
トラッシュブリーフィング合同会社
K.T
1
1 Mapとは<イントロダクション>
2 配列・リストを使うと…?
3 HashMapとは?
4 HashMapの仕組み(ハッシュテーブル)
5 HashMapの特徴
6 まとめ
2
目次
・Map = KeyとValueを紐づけてデータを格納するデータ構造のこと
- Keyの重複は許されない。(同じキーをput/格納すると、値は上書きされる)
- キーから値を参照するデータ構造を持ったデータの利用に役立つ(電話帳・辞書 etc)
3
1. Mapとは(イントロダクション)
配列やArrayListでは、インデックス(数値)で要素を特定す
るが、HashMap(Map)ではオブジェクト(キー)を使って
要素を特定する。
【問題:要素が5つ(2,3,6,9,15)格納されている配列から、要素が9の数字を見つける】
int[ ] data={2,3,6,9,15}; //先頭から順に調べるアルゴリズム(線形探索)を組んだ場合
// 格納されている要素を先頭から順に調べる
for(int i=0; i < data.length; i++) {
if(data[i] == 9) {
System.out.println(“要素の” + i +”番目が9です”);
}
}
・配列やリストの場合、要素を特定する際に【1つづつ全要素探索する(線形探索)】のアルゴ
リズムを使う場合が多いと思います。1個ずつ調べるとなると、実行に時間がかかる…
→ もっと高速に!要素を特定する為の手段として「HashMap」という実装手段がある!
4
2. 配列・リストを使うと…?
【実行結果】
2 3 6 9
1
5
5
【補足】プログラムと「計算量」
【実行結果】
「計算量」<O記法(オーダー記法)>とは
「入力サイズの増加に対して、実行時間がど
れくらいの割合で増加するかを表す指標」
O(1) :各要素へのアクセス
int[ ] data={2,3,6,9,15}; → data[2] // 3
O(n) :要素を先頭から順に調べる
データが増えれば増えるほど計算量が増える
・Map(2つの情報をキー<Key>と値<Value>のペアとして格納するデータ構造)の
実装クラスの中でもよく使われるJavaクラス。
- Javaでは、java.util.Mapインターフェイス及び、java.util.HashMapクラスに代表する各
種実装クラスを用いることで、手軽にMapを活用できる。【スッキリわかるJava入門実践編 第2版】
6
3. HashMapとは?
【実行結果】
put(K key, V value):追加 / get(Object key):値の取得 /remove:削除
「ハッシュ関数」を使って、[Key]と[Value]をペアで格納する。
7
1
4. HashMapの仕組み(ハッシュテーブル)
① 引数を1つ与えると、数値の戻り値を1つ返す。/ ②同じ引数を与えた場合は必ず同じ値を返す。
③ 別の引数を与えた場合は、なるべく違う値を返す。(ハッシュ関数の特性)
ハッシュテーブルでは、ハッシュ関数で得られたハッシュ値を元に、「どこにデータを格納するか」
「どこからデータを見つけるか」を決めている。
8
4. HashMapの仕組み(ハッシュテーブル)
【Key:”ネコ”を探索する】
①キー"ネコ"からハッシュ値:2
を取得
②ハッシュ値:2とbin配列(
0~5)の要素数で剰余を取る
→ 2/6 = 0…2
※ bin配列の3つ目の連結リストの
中に[キー:”ネコ"]の値がある
ので、その値を取得する。
(キー:"ネコ" 、値:”CAT")
ハッシュテーブルでは、ハッシュ関数で得られたハッシュ値を元に、「どこにデータ
を格納するか」「どこからデータを見つけるか」を決めている。
ハッシュテーブルでは多くの場合、要素数がbin配列の数を大きく上回り始め
ると、"rehash"と呼ばれる操作を行う。
9
2
4. HashMapの仕組み(ハッシュテーブル)
256 256 256 256
それぞれの連結リストに要素が256個ずつ入っていると
したら
そこで"rehash"
1)新しくより多くの数のbinを用意
2)古いbinに入っている要素それぞれに
対して、新しいbinのどれに入るかを
計算し直す
3)各要素を新しいbinに入れ直す
4)全ての要素が新しいbinに入ったら
古いbinを捨てる
rehashをすることで、1つのbinに大量の要素が入っ
ていて大きな連結リストを辿るといった状況回避
10
5. HashMap(ハッシュテーブル)の特徴
【特徴その①】各要素へのアクセスがO(1)とみなせる。
・ハッシュテーブルでは、ハッシュ値から「どのbinに値が格納されているか」を
計算で一発で出すことができるので、各要素のアクセスはO(1)
0
1
2
3
{"key":value} / {"key1":value} /
{"key2":value} / {"key3":value}
{"key":value} / {"key1":value} /
{"key2":value} / {"key3":value}
{"key":value} / {"key1":value} /
{"key2":value} / {"key3":value}
{"key":value} / {"key1":value} /
{"key2":value} / {"key3":value}
Bucket(バケット)
Binはすぐ求められるけど、その後の連結リストを探し
に行くと…O(n)になるんじゃないの?
ここで役に立つ"rehash"
このハッシュテーブルでは、要素数がbinの4倍の数を
上回ったらrehashする
→ どんなに多くても全要素数がbinの4倍。期待値とし
て連結リストのサイズは4までに収まる
→ 計算量が一定、であると言える。[常に定数4で計算
する] ハッシュテーブルにおける各要素へのアクセスが
O(1)とみなす事が出来る。
11
5. HashMap(ハッシュテーブル)の特徴
【特徴その②】各要素への追加がO(1)のコストで出来るといえる。
・ハッシュ値から値が格納されているbinまではO(1)でアクセスできる。かつ、連
結リストの先頭に値を追加するときはO(1)なので、ハッシュテーブルへの挿入は
O(1)ですることが出来る。
12
6. まとめ
1
2
3
HashMap = ハッシュ法(アルゴリズム)に基づいて実装されている。
※アルゴリズムにおける「ハッシュ探索」という考え方を元にしている。
ハッシュ法に基づく実装で、高速なデータアクセスを実現。
(説明不足な部分もあるので、各自調べてみてください。)
【所感】勉強不足。これまで、ただ何となく、動けばいいやのコーディン
グ
終わり
13

HashMapとは?