スライド タイトルなし

データ構造とアルゴリズム
第14回
文字列の照合
1
本日の内容



文字列の照合(p.161)
演習
アンケート
2
C言語の文字列

文字列とは



文字型の配列
ナル文字(NULL文字)で終端
文字列 hello はプログラム中では以下のように表
現されている

char str[6] = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’ };
h
e
l
l
o
\0

char str[6] = “hello”; ← このようにも書ける

5文字格納するのに、配列の要素は6個必要なことに注意
ナル文字
3
文字列の照合(検索)


文字列中の一部分を部分文字列と呼ぶ
特定のパターンをもった部分文字列がどこに
あるかを調べる
テキスト:babcabaabaacaabaa
パターン:abaa
4
文字列照合の例

n文字のテキスト(src[0]~src[n-1])から、m文
字のパターン(pat[0]~pat[m-1])が最初に現れ
る位置を検索
src
h
y
p
pat
c
h
o \0
o
c
h
o
n
d
r
i
a \0
5
力まかせ法


src の0文字目~m-1文字目が、patと一致するか調べる
src
h y p o c h o n d r
pat
c h o \0
a \0
src の1文字目~m文字目が、patと一致するか調べる
src
pat

i
h y p o c h o n d r
i
a \0
c h o \0
すべて一致するまで pat を1ずらしながら調べていく
src
pat
h y p o c h o n d r
i
a \0
c h o \0
6
力まかせ法の計算量

テキスト長 n、パターン長 m


計算量 O(mn)
実際には、パターン先頭の数文字で一致判定でき
る(mはほぼ定数cとみなせる)ので
O(cn) = O(n)
7
BM(Boyer-Moore)法


パターンを、右端の文字から照合していく
パターンをずらせる量をあらかじめ計算しておき、可能な限りず
らすことにより高速化 ⇒ 2つの方法で表をあらかじめ作成


テキストに現れるすべての文字について、それらがパターン中のどこに
現れるかを示した表(表d)
パターン中のそれぞれの位置について、そこで不一致が発生した場合に
パターンをどれだけずらせるかを計算した表(表e)
8
BM法の文字照合

パターンpの右はしの文字から、文字列と一致するか調べる

p[j] に対して j = m-1, m-2 の順に比較 (mはpの文字数)
i
t
e
p
k o g e h o g e
j (= 7)
t
i
g e
p
k o g e h o g e
j (= 6)
9
BM法のストラテジ1

あらかじめ、すべての文字について、パターン中のどこに現れ
るかの表 d を作成しておく (教科書 6.22式)

同じ文字が複数個ある場合には、もっとも右側の位置
文字がパターン中に存在しない場合には -1

パターンが kogehoge の場合

p
a
b
c
k o g e h o g e
d
e
-1 -1 -1 -1 7
f
g
h
i
-1
6
4 -1
j
k
0
・
o
・
5
10
BM法のストラテジ1

照合文字に応じて、max{1, j-d(t[i])} だけスキップ

d(‘a’) = -1 (パターンに’a’は含まれない)
s = max{1, 5 – (-1)} = 6
t
a g e
p
k o g e h o g e
j (= 5)
t
a g e
p
k o g e h o g e
11
BM法のストラテジ2


e( j ) = min{ s | p[l] = p[l – s], l = m–1, m–2,..., max{ j+1, s },
さらに j – s ≧ 0 の場合は p[j] ≠ p[j – s] }
となる表を作成しておく (教科書 6.23式)
e(j)とは、後方から照合していって、この位置で不一致が起きた
場合、これだけずらさないと一致しない!という値
j
0 1 2 3 4 5 6 7
p
k o g e h o g e
e(j)
8 8 8 8 4 8 8 1
12
BM法のストラテジ2(例1)
確認済み
ここで不一致!
? g e
k o g e h o g e
j (= 5)
k o g e h o g e
j
0 1 2 3 4 5 6 7
p
k o g e h o g e
e(j)
8 8 8 8 4 8 8 1
13
BM法のストラテジ2
(例2)
確認済み
ここで不一致!
? o g e
k o g e h o g e
j (= 4)
k o g e h o g e
j
0 1 2 3 4 5 6 7
p
k o g e h o g e
e(j)
8 8 8 8 4 8 8 1
14
いくつかのパターンに対する e(j) の例
j
0 1 2 3 4 5 6 7
j
a b c d e a b c
a b a a
e(j)
5 5 5 5 5 8 8 1
e(j)
j
0 1 2 3 4 5 6 7
j
8 8 8 8 3 8 8 1
3 3 1 2
0 1 2 3 4 5 6 7
a a a a a a a a
a b c d e c d e
e(j)
0 1 2 3
e(j)
1 2 3 4 5 6 7 8
15
Boyer-Moore法


パターンの右端から照合
不一致がおきたときに、2つの表からパターンをずらす
量を決定




(まとめ)
s = max{ j –d(t[i]), e(j)}
d(t[i]) は、不一致を起こしたsrc文字の種類によって決まる値
e(j) は、不一致を起こしたパターン中の位置によって決まる値
Boyer-Moore法の計算量


最悪ケース O(n)
平均ケース O(n/m)
16
期末試験について







日時:7/25(水) 10時30分~12時
場所:特別講義室Ⅱ
教科書,配布資料等の持ち込み不可
学生証を必ず提示すること
机上に置けるものは,鉛筆またはシャープペン,消
しゴム,定規,学生証のみ
座席は当日指定する
不正行為には厳正に対処する
17
成績評価について



全講義回数の2/3回(9回)以上の出席を満たさない
場合は単位を取得できない(履修規定)
レポートおよび期末試験を総合評価(比率 3:7)
レポートと試験の合計得点を100点満点に換算

優:80点以上

良:70点以上~80点未満

可:60点以上~70点未満
18