HashMapとは?
2017/2/24 勉強会
トラッシュブリーフィング合同会社
⿊岩 卓誠
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 = ハッシュ法(アルゴリズム)に基づいて実装されている。
※アルゴリズムにおける「ハッシュ探索」という考え⽅を元にしている。
ハッシュ法に基づく実装で、⾼速なデータアクセスを実現。
(説明不⾜な部分もあるので、各⾃調べてみてください。)
【所感】勉強不⾜。これまで、ただ何となく、動けばいいやのコーディング
→ トラッシュに⼊社してもう8ヶ⽉。もっと勉強、OUTPUTも⼼がけたい。
終わり
13

Hash mapとは