アルゴリズムとデータ構造 · 2013. 11. 6. · kmp法 16 2013/10/17...

23
アルゴリズムとデータ構造 4文字列照合(KMP法、BM法) 2013年10月17日 金岡 晃

Upload: others

Post on 18-Nov-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

アルゴリズムとデータ構造第4週 文字列照合(KMP法、BM法)

2013年10月17日

金岡 晃

Page 2: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

授業計画

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 アルゴリズムとデータ構造

Page 3: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

【復習】第3週スタックと待ち行列

アルゴリズムとデータ構造

2 2013/10/17 アルゴリズムとデータ構造

Page 4: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

スタック

2013/10/17 アルゴリズムとデータ構造3

スタック(Stack)

レコードの追加・削除ともに線形リストの先頭においてのみ行われる

追加をプッシュ(push)、削除をポップ(pop)と呼ぶ

LIFO(Last-In First-Out)とも呼ばれる

• 机の上に積んだ本• スーパーやコンビニエンスストアの籠

Page 5: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

レコードの追加は線型リストの末尾のみ、削除は先頭においてのみ行われる

キュー(待ち行列)

2013/10/17 アルゴリズムとデータ構造4

キュー(Queue)

追加をEnqueue、削除をDequeueと呼ぶ

FIFO(First-In First-Out)とも呼ばれる

• 有名店の行列• コンビニエンスストアの飲料売り場

Page 6: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

順配置表現

2013/10/17 アルゴリズムとデータ構造5

a[1]

a[n]

先頭の位置 t

a[1]

a[n]

末尾の位置 r

先頭の位置の1つ前 f

スタック(Stack) キュー(Queue)

Page 7: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

再帰的手続きの例:ハノイの塔

2013/10/17 アルゴリズムとデータ構造6

ハノイの塔

19世紀にEdouard Lucasにより発明されたゲーム。・3本のピンがある・穴の開いた大きさの異なる円盤が複数枚ある・最初は左端のピンに小さいものが上になるように積み重ねられている・すべての円盤を他のピンに移す・ただし、1度の1枚の円盤しか動かせない・小さな円盤の上に大きな円盤を載せることはできない

円盤が3枚のときの初期状態

Page 8: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

ハノイの塔:枚数𝑛枚のとき

2013/10/17 アルゴリズムとデータ構造7

操作に名称を付ける

𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 : 𝑛枚の円盤をピン𝑖からピン𝑗に移す𝑖, 𝑗 = 1,2,3𝑖 ≠ 𝑗

1枚の時 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗)

2枚の時

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒(𝑘, 𝑗)

𝑘 = 6 − 𝑖 − 𝑗

𝑛枚の時

𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 𝑛 − 1, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(𝑛 − 1, 𝑘, 𝑗)

𝑘 = 6 − 𝑖 − 𝑗

再帰的手続き

Page 9: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

ハノイの塔:𝑛 = 3のときの操作分解

2013/10/17 アルゴリズムとデータ構造8

𝑘 = 6 − 𝑖 − 𝑗

𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(2, 𝑘, 𝑗)

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘

𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘 ∶ 𝑚𝑜𝑣𝑒 𝑗, 𝑘

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗), 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒(𝑗, 𝑘)

𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 , 𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 ∶ 𝑚𝑜𝑣𝑒 𝑘, 𝑖

𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 ,𝑚𝑜𝑣𝑒(𝑖, 𝑗)

𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑗, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 ,

𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝑚𝑜𝑣𝑒(𝑖, 𝑗)

Page 10: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

再帰的手続きの例:フィボナッチ数列

2013/10/17 アルゴリズムとデータ構造9

フィボナッチ数列

Leonard Fibonacciにちなんで名づけられた数列

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …

・次の数は、最後の数とその前の数を足した数になる

𝑓 0 = 1, 𝑓 1 = 1

𝑓 𝑖 = 𝑓 𝑖 − 1 + 𝑓(𝑖 − 2) 再帰的手続き

Page 11: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

フィボナッチ数列:𝑖 = 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

Page 12: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

第4週文字列照合(KMP法)

アルゴリズムとデータ構造

11 2013/10/17 アルゴリズムとデータ構造

Page 13: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

本日の到達目標と概要

• 到達目標

– 文字列照合の代表的なアルゴリズムを理解する

• 概要

– 単純照合法

– KMP法

12 2013/10/17 アルゴリズムとデータ構造

Page 14: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

文字列照合問題

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

Page 15: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

単純照合法

2013/10/17 アルゴリズムとデータ構造14

text

pat

1.テキストの先頭にパターンの先頭を合わせる

2.パターンの先頭から文字を比較していく

4.パターンの先頭から文字を比較していく

3.異なる文字が現れた場合、パターンを1文字文後ろへシフトする

計算の効率 𝑂(𝑚𝑛)

Page 16: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

効率化に向けて:照合回数を減らす

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 本質的にはここから次の照合が始まったほうが良い

Page 17: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

KMP法

2013/10/17 アルゴリズムとデータ構造16

Knuth-Morris-Pratt法(KMP法)

先頭から照合をしていく場合、照合失敗後のシフト量と照合開始位置をあらかじめパターンから計算をしておき、照合を行っていく

アルゴリズムの流れ

パターンpat[1..n]よりシフト量と照合開始位置を決める量であるfail[1..n]を計算

failの計算

単純照合法と同様にパターンの先頭から照合していくが、シフト量と照合開始位置はfail[1..n]に従う

照合

注意

教科書P.83 のfail[i]の定義式は見ないこと。記載に矛盾があり混乱を招く。

Page 18: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

パターンの先頭 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

Page 19: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

• i番目で照合が失敗した場合、i-fail[i]だけ右にシフト• 照合はpat[fail[i]]から開始する

KMP法:failの導出と利用

2013/10/17 アルゴリズムとデータ構造18

failの導出(アルゴリズム)

failの利用

Page 20: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

Fail導出例

2013/10/17 アルゴリズムとデータ構造19

パターン “ABCABB”の場合

図解Ver. アルゴリズムVer.

Page 21: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

𝑂(𝑚)

KMP法の計算量

2013/10/17 アルゴリズムとデータ構造20

failの導出

𝑂(𝑛)failを利用した

照合

𝑂(𝑚 + 𝑛)KMP法

Page 22: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

演習1:KMP法におけるfail導出

2013/10/17 アルゴリズムとデータ構造21

パターン “ACAABACABC”の場合のfailの導出を、図解とアルゴリズムを用いて示せ

Page 23: アルゴリズムとデータ構造 · 2013. 11. 6. · KMP法 16 2013/10/17 アルゴリズムとデータ構造 Knuth-Morris-Pratt法(KMP法) 先頭から照合をしていく場合、照合失敗後のシフト量と

本日の到達目標と概要

• 到達目標

– 文字列照合の代表的なアルゴリズムを理解する

• 概要

– 単純照合法

– KMP法

– BM法

22 2013/10/17 アルゴリズムとデータ構造