データ構造とアルゴリズム
住友 孝郎
はじめに
データ構造
集合(セット)
リスト
連想配列(マップ)
計算量について
目次
データ構造
実装例
考察
1.データ構造
集合(セット)
リスト
連想配列(マップ)
1-1.集合(セット)
ITATI
CAT
RACCOON
特徴
・順序を持たないデータの集まり
・同一のデータは1つしか含まない
用途
・特定のデータが含まれるかを判断する
FOX
CAT
CATは含まれていますか?
はい、含まれています
1-2.リスト
特徴
・順序を持つデータの集まり
・同一のデータを複数含められる
用途
・複数のデータを順番に格納する
・特定の番号のデータを取り出す
FOXCATRACCOON
ITATICATFOX
0 1 2 3 4 5
3番目のものを下さい
はい、これです
RACCOON
1-3.連想配列(マップ)
特徴
・添え字に数値以外のデータ型(文字列型等)が使用できる配列
用途
・ある値をキーに紐付くデータを取り出す
RACCOON
ITATI
CATFOX
キツネ ネコ イタチ アライグマ
ネコを下さい
はい、これです
CAT
2.実装例
前提知識
ハッシュ値
データ構造
集合(セット)
リスト
連想配列(マップ)
2-1.ハッシュ値
ハッシュ値とは
あるデータが与えられた場合に算出される、
そのデータを代表する数値
以下の条件を満たせば計算方法は自由
条件
同じデータのハッシュ値は常に同じであること
衝突は発生しても構わない
(ハッシュ値が同じでも異なるデータの場合がある)
2-1-1.ハッシュ値の例
文字数をハッシュ値として扱う場合
文字列 ハッシュ値
キツネ 3
ネコ 2
イタチ 3
アライグマ 5
キツネとイタチが衝突している
2-1-2.ハッシュ値の例
文字に割り当てる数値
文字 数値 文字 数値 文字 数値 文字 数値
ア 1 ナ 21 ル 41 ド 61
イ 2 ニ 22 レ 42 バ 62
ウ 3 ヌ 23 ロ 43 ビ 63
エ 4 ネ 24 ワ 44 ブ 64
オ 5 ノ 25 ヲ 45 ベ 65
カ 6 ハ 26 ン 46 ボ 66
キ 7 ヒ 27 ガ 47 パ 67
ク 8 フ 28 ギ 48 ピ 68
ケ 9 ヘ 29 グ 49 プ 69
コ 10 ホ 30 ゲ 50 ペ 70
サ 11 マ 31 ゴ 51 ポ 71
シ 12 ミ 32 ザ 52 ァ 72
ス 13 ム 33 ジ 53 ィ 73
セ 14 メ 34 ズ 54 ゥ 74
ソ 15 ノ 35 ゼ 55 ェ 75
タ 16 ヤ 36 ゾ 56 ォ 76
チ 17 ユ 37 ダ 57 ャ 77
ツ 18 ヨ 38 ヂ 58 ュ 78
テ 19 ラ 39 ヅ 59 ョ 79
ト 20 リ 40 デ 60
文字列 計算 ハッシュ値
キツネ 7+18+24 49
ネコ 24+10 34
イタチ 2+16+17 35
アライグマ 1+39+2+49+31 94
文字ごとに数値を割り当て、
その総和をハッシュ値として扱う例
2-1-3.ハッシュ値の例
Javaの実装
文字列をsとし、文字数をnとするとき、
 ハッシュ値 = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
=∑
i =0
n−1
s[i ]×31
n−i −1
2-2-1.リスト
配列を用いた実装
FOX ITATICAT RACCOON FOXCAT
連続したメモリの領域
メリット
・アクセスが高速
デメリット
・データの追加と削除のオーバーヘッドが大きい
・連続したメモリの領域を必要とする
2-2-2.リスト
連結リストを用いた実装
FOX ITATI CAT RACCOON FOXCAT
メリット:
・データの追加と削除が容易
・メモリの領域が連続している必要がない
デメリット
・アクセスが低速
↑先頭
2-3-1.集合(セット)
二分探索木を用いた実装
CAT
FOX
ITATI
RABBIT
小さい
大きい
メリット
・データ構造内に順序性が保持されている
デメリット
・データの追加と削除のオーバーヘッドが大きい
RACCOON
ITATI
CAT
FOX
RABBIT
RACCOON
2-3-2.集合(セット)
ハッシュ値を用いた実装
メリット
・マップが十分に大きい場合、計算時間がO(1)である
デメリット
・ハッシュ関数の実装が必須
・マップがある程度大きくなくてはならずメモリを食う
FOX
ITATICATRACCOONRABBIT
0 1 2 3 4 5
配列
ハッシュ関数を、[文字数%6]とした例
2-4-1.連想配列(マップ)
アライグマ
イタチ
キツネ
ネコ
ネコ
イタチ
キツネ
アライグマ
小さい
大きい
二分探索木を用いた実装
FOXITATI CATRACCOON
2-4-2.連想配列(マップ)
ハッシュ値を用いた実装
イタチ
アライグマキツネ
0 1 2 3 4 5
ハッシュ関数を、[文字数%6]とした例
ネコ
FOXITATICAT RACCOON
3.計算量
配列の探索
ハッシュマップの探索
2分探索木の探索
3-1.配列の探索
配列の探索の例(線形探索)
配列から特定の要素を探する場合、先頭から順番に見ていくので
平均すると     回の比較が行われる。
個数
2
FOX ITATICAT RACCOON FOXCAT
3-2.ハッシュマップの探索
ハッシュマップの例
イタチ
アライグマキツネ
0 1 2 3 4 5
ネコという名前から、CATの実体を取得したい場合
ネコ
FOXITATICAT RACCOON
ネコ 2
ハッシュ値を算出
ハッシュ値が衝突しない限りは常に一定時間で目的の要素を見つける
ことができる
3-3-1.二分探索木
完全二分木
要素数:15
最大4回の比較
完全二分木
要素数:7
最大3回の比較完全二分木
要素数:3
最大2回の比較
完全二分探索木の例
15
10 18
21
1 25 39
38
55
64
6
4 8 23
14
34
38
63
57 69 75
72
84
93
51
要素数がn個の最大計算量 = log2n(切り上げ)
3-3-2.二分探索木
二分木
要素数:5
最大4回の比較
63
75
72
51
14
完全二分木で無い場合は大きくなる
完全でない二分探索木の例
3-4-1.計算量のグラフ
配列の探索(線形探索)
y =n
Θ n
完全二分探索木
y =log 2 n
Θ log 2 n
ハッシュマップ
y =1
Θ 1
計算量のグラフ
3-4-2.計算量のグラフ
配列の探索(線形探索)
y =n
2
Θ n
2

完全二分探索木
y =n× log 2 n
Θ nlog 2 n
ハッシュマップ
y =n
Θ n
n×nのデータを紐づける場合の計算量
4.まとめ
データ構造の選択によっては計算量を抑えることができる
状況に応じて適切なデータ構造を選択すること
計算量が跳ね上がるものは一定量を超すと
突然動かなくなるので極力避けること
計算量が大きい場合は必ず設計時に見積もりを取り、
運用上の注意に挙げること
データ構造とアルゴリズム
ご静聴ありがとうございました
企画・製作
住友

勉強会資料 データ構造とアルゴリズム