アルゴリズムとデータ構造
第13週 データ探索:ハッシュ法
2014年1月9日 金岡 晃
授業計画
1
第1週 (9/26)
データ構造とアルゴリズムの基 礎
第2週 (10/3)
アルゴリズムの効率、線形構造 第3週
(10/10)
スタックと待ち行列 第4週
(10/17)
文字列照合(KMP法、BM法)
第5週 (10/24)
木構造、木の走査
→文字列照合(BM法)、木構 造
第6週 (10/31)
木の走査、二分木、決定木 第7週
(11/14)
中間試験
第8週 (11/21)
休講 第9週
(11/28)
グラフ構造と最短路問題 第10週
(12/5)
解の探索:Aアルゴリズム 第11週
(12/12)
データ整列:ヒープソート 法
第12週 (12/19)
データ整列:クイックソー ト法
第13週 (1/9)
データ探索:ハッシュ法 第14週
(1/16)
データ探索:木構造探索法 1/22-2/8 期末試験
2014/1/9 アルゴリズムとデータ構造
【復習】第 12 週
データ整列:クイックソート法
アルゴリズムとデータ構造
2 2014/1/9 アルゴリズムとデータ構造
整列法の分類(1)
2014/1/9 アルゴリズムとデータ構造
3
選択による方法
単純選択法、ヒープ整列法 選択:複数のデータの中から最大あるいは 最小のものを選ぶ動作
挿入による方法
単純挿入法(シャトル整列 法)、シェル法
挿入:すでに整列している複数のデータの 並びの適切な位置に、あらたな1枚を追加 挿入する操作
交換による方法
単純交換法(バブルソート 法)、クイックソート法
交換:注目した2枚の順番が逆になってい たら入れ替える動作
クイックソート
2014/1/9 アルゴリズムとデータ構造
4
基準値となるキーを選択し、基準値より小さい数のデータ集合と基準値より 大きい数のデータ集合に分ける。
それぞれの集合についても、同じく基準値となるキーを選択し、2つのデー タ集合に分ける。
要素が1つ以下の集合となった場合、その集合は確定となる。
クイックソート法(Quick Sort)
クイックソートのアルゴリズム
2014/1/9 アルゴリズムとデータ構造
5
straight-sort(x, y)は
単純な方法を使うことを 意味している
演習
2014/1/9 アルゴリズムとデータ構造
6
下記の1次元配列データをクイックソート法(前スライドのアルゴリズムを利 用)で処理したときの、処理の過程を記述せよ。このとき、 select(k)を、どう いう基準で選択したかを明確に記載すること。
ただし、過程の記述は各配列がどう変化していったかのみ記載すれば良いもの とする。また、ここではstraight-sort()を利用する閾値は10ではなく3とする。
a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]
30 40 80 35 60 70 55 10 20 50
第 14 週
データ探索:ハッシュ法
アルゴリズムとデータ構造
7 2014/1/9 アルゴリズムとデータ構造
本日の到達目標と概要
• 到達目標
– データ探索と、その実現方法としてのハッシュ法の理解
• 概要
– データ探索
– 単純な手法:線型探索、二分探索 – ハッシュ法概要
– ハッシュ関数
– 開番地法と連鎖法
8 2014/1/9 アルゴリズムとデータ構造
データ探索
2014/1/9 アルゴリズムとデータ構造
9
辞書を引く 運賃を調べる 名前を思い出す
いずれも データの探索
ファイル構造に基づく探索 構造探索 コンピュータによる探索
ファイル構造に基づかない探索 内容探索、連想探索
探索におけるレコードの指定
2014/1/9 アルゴリズムとデータ構造
10
指定の仕方
一致型、最近接型、区間型
複数条件指定
「家賃が7万円以下で、駅から10分以内の物件」
今日の講義では
• 探索に用いられるフィールドが1つ
• 一致型の探索
• レコードを「キー」と呼ぶ
単純な探索方法:線型探索と二分探索
2014/1/9 アルゴリズムとデータ構造
11
線型探索
• 目的のキーを求めて表の先頭番地から順に調べていくもっとも単純な方法
• 逐次検索ともいわれる。
• 追加は効率的に行える(データの最後に追加する)が、探索と削除に時間がかかる 追加:𝑂(1)
探索と削除:それぞれ𝑂(𝑛)
二分探索
• キーの値が昇順に並んでいるときに適用可能な手法
• 中央のキー(データが𝑛個ある場合は 𝑛 + 1 /2(の四捨五入か切り上げか切り捨 て)番目のキー)との大小関係を調べる
• 一致なら探索終了
• 探索キーが大なら、後半の中での中央のキーを選択し、調べる
• 探索キーが小なら、前半の中での中央のキーを選択し、調べる
• 追加は効率的ではないが探索が効率的
追加:𝑂(𝑛)
探索:それぞれ𝑂(log 𝑛)
ハッシュ法
2014/1/9 アルゴリズムとデータ構造
12
キーの値から探索・格納・削除の番地を決定する手法。
キーの値を順番に置くのではなくハッシュする(ばらまく)
ハッシュ(Hash):意味:
寄せ集め、ごたまぜ
ハッシュ関数
2014/1/9 アルゴリズムとデータ構造
13
ハッシュを行う関数
仮定:キーが小文字アルファベット8文字まで キーのパターン数は 278 − 1
表のサイズを𝑁とすると、なるべく衝突を さけるためにパターンを上手にばらつかせ なければならないが、 𝑁がパターン数より 小さい場合は衝突を避けられない
なるべく衝突が 起こらないように ハッシュ関数を設計する 利用される手法
• 除算法(Division):キーのビット列を2進数と見なして表サイズの剰余を用いる
• 乱数法(平方採中法(mid-square)とも):
• 乱数生成の種(Seed)としてキーを用いて、乱数を出力する
• 折り返し法(Folding)
• キーのビット列を適当に分断してそれらの和を計算する
ハッシュ関数は暗号でも重要な意味を持つ
用語:同族
2014/1/9 アルゴリズムとデータ構造
14
同族(Synonym、同義語)
• ハッシュ関数の出力が一緒になる入力値
ハッシュ法
2014/1/9 アルゴリズムとデータ構造
15
ハッシュ関数を用意し、キーを入力にしてハッシュ関数により得られた結果を番 地として使う
衝突が起きた場合には対応が必要
• 空いている番地を探す:開番地法(開アドレス法)
• 衝突が起こったときに代わりの番地へのポインタを入れるように する:連鎖法
開番地法の具体例:線型走査法(Linear Search)
• 得られた結果に一定の間隔𝑑を足し、空いているか確認し、空いていればそ の番地を使う
• 空いていない場合、間隔𝑑をさらに足すことを繰り返す
• この手法での一定の間隔をハッシュ増分(Hash Increment)と呼ぶ
ハッシュ法:具体例
2014/1/9 アルゴリズムとデータ構造
16
iwahashi enomoto ooba
kazama kurosawa
tada yamagata 元データ
サイズ𝑁 = 11の 表に入れる
0 1 2 3 4 5 6 7 8 9 10
ハッシュ関数
ℎ
0𝐾 = #𝐶1 𝑚𝑜𝑑 𝑁
データの1文字目 アルファベットの順番(1~26)
衝突が起きた場合はハッシュ増分2の線型走査法を使う
ℎ
𝑖𝐾 = ℎ
0𝐾 + 2𝑖 𝑚𝑜𝑑 𝑁
ハッシュ法:具体例
2014/1/9 アルゴリズムとデータ構造
17
探索効率
2014/1/9 アルゴリズムとデータ構造
18
• ハッシュ法のキーの探索は、番地を求めることと同じ
• 探索の効率は衝突の回数に依存する クラスタ(Cluster)
• ひとたび互いに𝑑番地離れたキー同士が塊を形成し始めると加速度的に成長し て探索効率を急激に低下させてしまう
• この塊をクラスタと呼ぶ
第1種クラスタ(Primary Cluster) :同族でないキー同士の塊部分 第2種クラスタ:同族同士の部分(Secondary Cluster)
前スライドの例での平均探索回数:1+1+1+2+3+2+6/7=2.29
開番地法
2014/1/9 アルゴリズムとデータ構造
19
線型走査法(Linear Search)
• 得られた結果に一定の間隔𝑑を足し、空いているか確認し、空いていればその 番地を使う
• 空いていない場合、間隔𝑑をさらに足すことを繰り返す
• この手法での一定の間隔をハッシュ増分(Hash Increment)と呼ぶ
• クラスタが発生する
ℎ
𝑖𝐾 = ℎ
0𝐾 + 𝑑𝑖 𝑚𝑜𝑑 𝑁
2次走査(Quadratic Search)法
• クラスタの発生を抑える
ℎ
𝑖𝐾 = ℎ
0𝐾 + 𝑎𝑖 + 𝑏𝑖
2𝑚𝑜𝑑 𝑁
連鎖法
2014/1/9 アルゴリズムとデータ構造
20
• キーKの番地を調べるときにh0(K)にすでにほかのキーが入っている場合、同 じ値を持つキーが次にどこに入っているかの番地(ポインタ)を持つ
連鎖リスト
連合連鎖(Coalesced Chaining)法:
• 連鎖リストをたどって最後の要素を見つける
• 空き番地を見つけ、そこに格納
• 最後の要素のポインタ部に格納した番地を入れる
分離連鎖(Separate Chaining)法:
• 先に入っている同族でないキーを追い出してキーKを格納
• 同族が連鎖するようにする
• 追い出されたキーを空き番地に格納
演習
2014/1/9 アルゴリズムとデータ構造
21
スライド「ハッシュ法:具体例」と同じデータを、同じく𝑁 = 11の表にハッ シュ法を用いて格納するとする。この場合、以下の問に答えよ。
1)ハッシュ関数を以下とした場合の、ハッシュ表への格納状態(表)と、平 均探索回数を求めよ
2)ハッシュ関数を以下とした場合の、ハッシュ表への格納状態(表)と、平 均探索回数を求めよ
ℎ0 𝐾 = #𝐶1 × 26 + #𝐶2 𝑚𝑜𝑑 𝑁 ℎ𝑖 𝐾 = ℎ0 𝐾 + 3𝑖 𝑚𝑜𝑑 𝑁
ℎ0 𝐾 = #𝐶1 × 26 + #𝐶2 𝑚𝑜𝑑 𝑁 ℎ𝑖 𝐾 = ℎ0 𝐾 + 𝑖 + 𝑖2 𝑚𝑜𝑑 𝑁
本日の到達目標と概要
• 到達目標
– データ探索と、その実現方法としてのハッシュ法の理解
• 概要
– データ探索
– 単純な手法:線型探索、二分探索 – ハッシュ法概要
– ハッシュ関数
– 開番地法と連鎖法
22 2014/1/9 アルゴリズムとデータ構造