• 検索結果がありません。

アルゴリズム論 (第12回)

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズム論 (第12回)"

Copied!
24
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズム論

(第12回)

佐々木研(情報システム構築学講座)

講師 山田敬三

[email protected]

(2)

文字列照合

(3)

文字列照合問題

入力:テキスト

S

,語

W

処理:

S

中に

W

が出現するか否かを調べる

出力:出現すれば

yes

,そうでなければ

no

出力:出現すれば出現位置,そうでなければ

no

(4)

2.1 文字列の走査

文字列は文字の配列によって表される.

配列の要素は

0

から始まる添え字によって参照される.

例)

S[0] = a, S[2] = g

文字列

S

の文字数を

|S|

と表す.

例)

S = “algorithm”

のとき,

|S| = 9

検索対象となる文字列を,特にテキストという.

a l g o r i t h m S

0 1 2 3 4 5 6 7 8

(5)

文字の照合

文字列照合問題を扱う前に,

テキスト

S

中に文字

x

が出現するか否かを問う問題を扱う.

(6)

例題 2.1

テキスト

S

“algorithm”

で,文字

x

のとき,

S

中で

x

が最初に現れる位置の添字は何か.

答え:

6

a l g o r i t h m S

0 1 2 3 4 5 6 7 8

(7)

例題 2.2

入力として,テキスト

S

と文字

x

が与えられたとき,

S

中で

x

が最初に 現れる位置の添字を求めるアルゴリズムを示せ.ただし,

x

S

中に 現れないときは

|S|

を返すこととする.

(8)

解答

Input:

テキスト

S

,文字

x

Output:

テキスト

S

における文字

x

の最初の出現位置

1. i ← 0

2. while i < |S| do 3. if x = S[i] then

4. i

を出力して終了する

5. else

6. i ← i + 1

7. /* end of while */

8. i

を出力して終了する.

(9)

a l g o r i t h m S

t x

a l g o r i t h m S

t x

1回目

7回目

(10)

2.2 文字列照合問題

入力:テキスト

S

,文字列

W

処理:

S

中に

W

が出現するか否かを調べる

出力:出現すれば

yes

,そうでなければ

no

出力:出現すれば出現位置,そうでなければ

|S|

• S

algorithm

W

go

のとき,

2

を返す.

※ W

を単語

or

語という.

(11)

素朴な文字列照合アルゴリズム

Input:

テキスト

S

,単語

W

Output: S

における

W

の最初の出現位置

1. i ← 0; j ← 0

2. while i + j < |S| do

3. if W[j] = S[i + j] then

4. j ← j + 1

5.

もし

j = |W|

なら

i

を出力して終了する

6. else

7. i ← i + 1

8. j ← 0

9. /* end of while */

10. |S|

を出力して終了する

(12)

a l g o r i t h m S

g W

a l g o r i t h m S

o

g

W o

i = 0, j = 0

i = 2, j = 1

(13)

高速化のアイディア

一度照合した文字は,飛ばして実行する.

すると,うまくいく場合と,いかない場合がある.

(14)

例:うまくいく場合 ( 上 ) いかない場合 ( 下 )

t e s t d t e s t S

t

W e s t

t e s t e s t e d S

e d e d

t

W e s t e d

(15)

2.3 KMP 法

クヌース

-

モリス

-

プラット法

(Knuth-Morris-Pratt algorithm: KMP

)

照合に失敗したときの動作を改良した.

• W

に依存したパタン照合テーブル(後述)を用いる.

(16)

KMP 法

Input:

テキスト

S

,単語

W

Output: W

の出現位置

1. i ← 0; j ← 0

2. while i + j < |S| do

3. if W[j] = S[i + j] then

4. j ← j + 1

5.

もし

j = |W|

なら

i

を出力して終了

6. else

7. i ← i + j – T[j]

8.

もし

j > 0

なら

j ← T[j]

9. /* end of while */

(17)

S

t

W e s t e d t

W e s t e d

(18)

t S

t

W e s t e d t

W e s t e d

(19)

t e S

t

W e s t e d t

W e s t e d

(20)

t e s t e S

t

W e s t e d t

W e s t e d

(21)

パタン照合テーブル

0 1 2 3 4 5

W t e s t e d

T -1 0 0 0 1 2

j – T[j] 1 1 2 3 3 3

(22)

2.4 パタン照合テーブルの構成法

Input:

単語

W

Output:

パタン照合テーブル

T

1. T[0] = -1

2. foreach 1 <= j <= |W| - 1 do 3. k ← j – 1

4. while W[0 .. k – 1] != W[j – k .. j - 1] and k > 0 do

5. k ← k – 1

6. /* end of while */

7. T[j] ← k

8. /* end of foreach */

(23)

t

W e s t e d

j = 5

t e s t e s t e

t e s s t e

t e t e

k = 4

k = 3

k = 2

(24)

評価

パタン照合テーブルの作成には,

𝑂𝑂(|𝑊𝑊|

3

)

かかる.

改良により

𝑂𝑂(|𝑊𝑊|)

で作成可能であることが知られている.

参照

関連したドキュメント

[r]

乗次 章子 非常勤講師 社会学部 春学期 English Communication A11 乗次 章子 非常勤講師 社会学部 春学期 English Communication A23 乗次 章子

第7回 第8回 第9回 第10回

2020年度 2019年度 2018年度 2017年度 2016年度 回数 0回 11回 12回 12回

エドワーズ コナー 英語常勤講師(I.E.F.L.) 工学部 秋学期 英語コミュニケーションIB19 エドワーズ コナー

講師 (一般)ダイバーシティ研究所 代表理事/復 興庁復興推進参与

9月30日 (水) 構造(船殻)設計 ・講師:小沼 守 ・講師:中尾 強志 ・講師:佐々木 吉通(NK) ・講師:宇宿 行史(NK)