アルゴリズムとデータ構造第4週 文字列照合(KMP法、BM法)
2013年10月17日
金岡 晃
授業計画
1
第1週
(9/26)
データ構造とアルゴリズムの基礎
第2週
(10/3)
アルゴリズムの効率、線形構造
第3週
(10/10)
スタックと待ち行列
第4週
(10/17)
文字列照合(KMP法、BM法)
第5週
(10/24)
木構造、木の走査
第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 期末試験
2013/10/17 アルゴリズムとデータ構造
【復習】第3週スタックと待ち行列
アルゴリズムとデータ構造
2 2013/10/17 アルゴリズムとデータ構造
スタック
2013/10/17 アルゴリズムとデータ構造3
スタック(Stack)
レコードの追加・削除ともに線形リストの先頭においてのみ行われる
追加をプッシュ(push)、削除をポップ(pop)と呼ぶ
LIFO(Last-In First-Out)とも呼ばれる
例
• 机の上に積んだ本• スーパーやコンビニエンスストアの籠
レコードの追加は線型リストの末尾のみ、削除は先頭においてのみ行われる
キュー(待ち行列)
2013/10/17 アルゴリズムとデータ構造4
キュー(Queue)
追加をEnqueue、削除をDequeueと呼ぶ
FIFO(First-In First-Out)とも呼ばれる
例
• 有名店の行列• コンビニエンスストアの飲料売り場
順配置表現
2013/10/17 アルゴリズムとデータ構造5
a[1]
a[n]
先頭の位置 t
a[1]
a[n]
末尾の位置 r
先頭の位置の1つ前 f
スタック(Stack) キュー(Queue)
再帰的手続きの例:ハノイの塔
2013/10/17 アルゴリズムとデータ構造6
ハノイの塔
19世紀にEdouard Lucasにより発明されたゲーム。・3本のピンがある・穴の開いた大きさの異なる円盤が複数枚ある・最初は左端のピンに小さいものが上になるように積み重ねられている・すべての円盤を他のピンに移す・ただし、1度の1枚の円盤しか動かせない・小さな円盤の上に大きな円盤を載せることはできない
例
円盤が3枚のときの初期状態
ハノイの塔:枚数𝑛枚のとき
2013/10/17 アルゴリズムとデータ構造7
操作に名称を付ける
𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 : 𝑛枚の円盤をピン𝑖からピン𝑗に移す𝑖, 𝑗 = 1,2,3𝑖 ≠ 𝑗
1枚の時 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗)
2枚の時
𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒(𝑘, 𝑗)
𝑘 = 6 − 𝑖 − 𝑗
𝑛枚の時
𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 𝑛 − 1, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(𝑛 − 1, 𝑘, 𝑗)
𝑘 = 6 − 𝑖 − 𝑗
再帰的手続き
ハノイの塔:𝑛 = 3のときの操作分解
2013/10/17 アルゴリズムとデータ構造8
𝑘 = 6 − 𝑖 − 𝑗
𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(2, 𝑘, 𝑗)
𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘
𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗
𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘 ∶ 𝑚𝑜𝑣𝑒 𝑗, 𝑘
𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗), 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒(𝑗, 𝑘)
𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 , 𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗
𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 ∶ 𝑚𝑜𝑣𝑒 𝑘, 𝑖
𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗
𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 ,𝑚𝑜𝑣𝑒(𝑖, 𝑗)
𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑗, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 ,
𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝑚𝑜𝑣𝑒(𝑖, 𝑗)
再帰的手続きの例:フィボナッチ数列
2013/10/17 アルゴリズムとデータ構造9
フィボナッチ数列
Leonard Fibonacciにちなんで名づけられた数列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
・次の数は、最後の数とその前の数を足した数になる
𝑓 0 = 1, 𝑓 1 = 1
𝑓 𝑖 = 𝑓 𝑖 − 1 + 𝑓(𝑖 − 2) 再帰的手続き
フィボナッチ数列:𝑖 = 4のとき
2013/10/17 アルゴリズムとデータ構造10
𝑓 4 = 𝑓 3 + 𝑓(2)
= 𝑓 2 + 𝑓(1) + 𝑓(2)
= 𝑓(1 + 𝑓 0 ) + 𝑓(1) + 𝑓 1 + 𝑓 0
= 1 + 1 + 1 + 1 + 1
= 2 + 1 + 1 + 1
= 3 + 2
= 5
第4週文字列照合(KMP法)
アルゴリズムとデータ構造
11 2013/10/17 アルゴリズムとデータ構造
本日の到達目標と概要
• 到達目標
– 文字列照合の代表的なアルゴリズムを理解する
• 概要
– 単純照合法
– KMP法
12 2013/10/17 アルゴリズムとデータ構造
文字列照合問題
2013/10/17 アルゴリズムとデータ構造13
…… …… ……
1 s ns+m-1
文字列 text
パターン pat ……
入力済みの文章(文字列、テキスト)から、変更したい単語(パターン)を探し出す処理
文字列照合(文字列パターンマッチング)
文字列中の各文字を text[1], text[2],…,text[n]パターン中の各文字をpat[1], pat[2],…,pat[m]と表す
1 m
単純照合法
2013/10/17 アルゴリズムとデータ構造14
text
pat
1.テキストの先頭にパターンの先頭を合わせる
2.パターンの先頭から文字を比較していく
4.パターンの先頭から文字を比較していく
3.異なる文字が現れた場合、パターンを1文字文後ろへシフトする
計算の効率 𝑂(𝑚𝑛)
効率化に向けて:照合回数を減らす
2013/10/17 アルゴリズムとデータ構造15
A B B C ×text
pat A B B C B 1回目の照合はここで照合失敗
A B B C B
単純照合法での2回目の照合はここで照合失敗
これまでに照合した内容などを踏まえて、効率的にシフトできないか?
A B B C B 本質的にはここから次の照合が始まったほうが良い
KMP法
2013/10/17 アルゴリズムとデータ構造16
Knuth-Morris-Pratt法(KMP法)
先頭から照合をしていく場合、照合失敗後のシフト量と照合開始位置をあらかじめパターンから計算をしておき、照合を行っていく
アルゴリズムの流れ
パターンpat[1..n]よりシフト量と照合開始位置を決める量であるfail[1..n]を計算
failの計算
単純照合法と同様にパターンの先頭から照合していくが、シフト量と照合開始位置はfail[1..n]に従う
照合
注意
教科書P.83 のfail[i]の定義式は見ないこと。記載に矛盾があり混乱を招く。
パターンの先頭 i 文字を見てここが照合失敗した場合に何文字シフトするべきかを数える
KMP法:failの導出と利用
2013/10/17 アルゴリズムとデータ構造17
failの導出(図解)
パターンを用いて、パターン同士の照合を行い、シフト量を求める
pat A B B C B
fail[1] A 1文字
iからシフト量を引いた数がfail[i]
fail[1]=1-1=0
fail[2] 1文字 fail[2]=2-1=1A B
fail[3] 2文字 fail[3]=3-2=1A B B
fail[4] 3文字 fail[4]=4-3=1A B B C
fail[5] 4文字 fail[5]=5-4=1A B B C B
• i番目で照合が失敗した場合、i-fail[i]だけ右にシフト• 照合はpat[fail[i]]から開始する
KMP法:failの導出と利用
2013/10/17 アルゴリズムとデータ構造18
failの導出(アルゴリズム)
failの利用
Fail導出例
2013/10/17 アルゴリズムとデータ構造19
パターン “ABCABB”の場合
図解Ver. アルゴリズムVer.
𝑂(𝑚)
KMP法の計算量
2013/10/17 アルゴリズムとデータ構造20
failの導出
𝑂(𝑛)failを利用した
照合
𝑂(𝑚 + 𝑛)KMP法
演習1:KMP法におけるfail導出
2013/10/17 アルゴリズムとデータ構造21
パターン “ACAABACABC”の場合のfailの導出を、図解とアルゴリズムを用いて示せ
本日の到達目標と概要
• 到達目標
– 文字列照合の代表的なアルゴリズムを理解する
• 概要
– 単純照合法
– KMP法
– BM法
22 2013/10/17 アルゴリズムとデータ構造