0 likes | 14 Views
Brute-force string matching algorithm involves creating substrings of the text and comparing them with the pattern string sequentially until a full match is found. If a mismatch occurs, the algorithm resets and moves to the next element in the array for comparison. This method outlines the step-by-step process and the number of comparisons required for matching patterns in text strings.
E N D
文字列の照合 文字列の照合
力任せの探索法とは 力任せの探索法とは ① ① 力任せの探索 力任せの探索 ❶ ❶ テキスト文字列の中に テキスト文字列の中に ❷ ❷ パターン文字列と同じ長さの部分文字列をつくり、 パターン文字列と同じ長さの部分文字列をつくり、 ❸ ❸ パターン文字列の対応する文字と順次比較し、 パターン文字列の対応する文字と順次比較し、 ❹ ❹ 全文字が一致すれば探索成功である。 全文字が一致すれば探索成功である。 ❺ ❺ 比較途中で不一致になると、 比較途中で不一致になると、 配列の次の要素に移動して、 配列の次の要素に移動して、 ❻ ❻ 新しい部分文字列を作りパターン文字列と比較する。 新しい部分文字列を作りパターン文字列と比較する。 ② ② テキスト文字列のすべての要素と比較して テキスト文字列のすべての要素と比較して 不一致ならば探索不成功となる。 不一致ならば探索不成功となる。
最初の比較 最初の比較 Lを先頭に部分文字列をつくる テキスト文字列 L D L E A S U B 対応する要素を比較し不一致に なればリセットする L E A パターン文字列
2回目の比較 2回目の比較 Dを先頭に部分文字列をつくる テキスト文字列 L D L E A S U B 対応する要素を比較し不一致に なればリセットする L E A パターン文字列
3回目の比較 3回目の比較( (探索成功 探索成功) ) Lを先頭に部分文字列をつくる テキスト文字列 L D L E A S U B 対応する要素を比較し最後まで 一致すれば探索成功 L E A パターン文字列
力任せの探索法の手順 力任せの探索法の手順 ① ① ポインタの初期化 ポインタの初期化 ❶ ❶ 一つのポインタiをテキスト文字列 一つのポインタiをテキスト文字列( (長さn ❷ ❷ 一つのポインタjをパターン文字列上に置く。 一つのポインタjをパターン文字列上に置く。 ❸ ❸ iおよびjを1で初期化する。 iおよびjを1で初期化する。 長さn) )上に、 上に、 ② ② テキスト文字列上に部分文字列を作成 テキスト文字列上に部分文字列を作成 ❶ ❶ テキスト上にポインタiを先頭に テキスト上にポインタiを先頭に ❷ ❷ 長さm(m<n)の部分文字列を作成する。 長さm(m<n)の部分文字列を作成する。 ❸ ❸ 部分文字列の要素の添字をi+j-1で表す。 部分文字列の要素の添字をi+j-1で表す。
③ ③ 添字jを操作して文字列を比較する。 添字jを操作して文字列を比較する。 ❶ ❶ テキスト上の部分文字列と テキスト上の部分文字列と パターン文字列の対応する要素を比較する。 パターン文字列の対応する要素を比較する。 ❷ ❷ 対応する要素の内容が一致するとき、 対応する要素の内容が一致するとき、 jのインクリメントを行う。 jのインクリメントを行う。 ❸ ❸ パターンの長さに等しい一致が生じると パターンの長さに等しい一致が生じると 照合が得られる。 照合が得られる。 ❹ ❹ 対応する要素の内容が 対応する要素の内容が 比較途中で不一致になると④に移る。 比較途中で不一致になると④に移る。
④ ④ 比較途中で不一致になるか 比較途中で不一致になるか または照合が得られた場合、 または照合が得られた場合、 ❶ ❶ パターンの添字jをリセットし、 パターンの添字jをリセットし、 ❷ ❷ テキスト文字列上のポインタiを テキスト文字列上のポインタiを インクリメントする。 インクリメントする。 ❸ ❸ ②に戻る。 ②に戻る。 ⑤ ⑤ iがテキスト上のn-m+1の要素を超えると iがテキスト上のn-m+1の要素を超えると 文字列の探索を終了する。 文字列の探索を終了する。
力任せの探索法の比較回数 力任せの探索法の比較回数 ① ① テキスト長N、パターン長Mとすると、 テキスト長N、パターン長Mとすると、 最悪の比較回数は、次の式で求まる。 最悪の比較回数は、次の式で求まる。 最悪の比較回数= 最悪の比較回数=( (N-M+1 N-M+1) )× ×M M ② ② テキスト長Nの値が、パターン長Mの値に比べて、 テキスト長Nの値が、パターン長Mの値に比べて、 大きい場合はNMとなる。 大きい場合はNMとなる。
ボイヤ・ムーアの文字列探索法 ボイヤ・ムーアの文字列探索法 ① ① ボイヤ・ムーア ボイヤ・ムーア ❶ ❶ パターンをテキストと照合させる時に パターンをテキストと照合させる時に 右から左へポインタを動かす走査を取り入れる 右から左へポインタを動かす走査を取り入れる ❷ ❷ かなり速い文字列探索法を開発することができる。 かなり速い文字列探索法を開発することができる。 ② ② パターンだけでなく不一致を生じた パターンだけでなく不一致を生じた テキスト文字も考慮してスキップの文字数を決定する。 テキスト文字も考慮してスキップの文字数を決定する。 ③ ③ スキップの文字数は、 スキップの文字数は、 テキストの各要素T テキストの各要素T( (i i) )に対して、 移動距離として、配列d 移動距離として、配列d( (T T( (i i)) ))に設定する。 に対して、 に設定する。
ボイヤ・ムーアの比較回数 ボイヤ・ムーアの比較回数 ① ① ボイヤ・ムーアの文字列探索における ボイヤ・ムーアの文字列探索における 文字の比較回数の上限はM+Nに比例する。 文字の比較回数の上限はM+Nに比例する。 ② ② テキスト文字列の文字の種類が テキスト文字列の文字の種類が パターンの長さに比べて十分多ければ、 パターンの長さに比べて十分多ければ、 比較回数はN/M回である。 比較回数はN/M回である。 ③ ③ 平均的な比較回数はN/Mとなる。 平均的な比較回数はN/Mとなる。
④ ④ パターンの中に現れる文字は、 パターンの中に現れる文字は、 アルファベットの一部にすぎないことが多い。 アルファベットの一部にすぎないことが多い。 ⑤ ⑤ このような場合、比較が行われるごとに このような場合、比較が行われるごとに M文字スキップされるようになる。 M文字スキップされるようになる。 ⑥ ⑥ このアルゴリズムは最悪の場合は線形となる。 このアルゴリズムは最悪の場合は線形となる。
移動距離の計算要領 移動距離の計算要領 ① ① 部分文字列の後方から 部分文字列の後方から テキストとパターンを比較する場合、 テキストとパターンを比較する場合、 ❶ ❶ テキストの最初の比較文字が テキストの最初の比較文字が パターンの比較の最後にある場合、 パターンの比較の最後にある場合、 ❷ ❷ パターンの中に存在しない場合、 パターンの中に存在しない場合、 ❸ ❸ パターン長mだけ、 パターン長mだけ、 部分文字列の先頭位置を移動させる。 部分文字列の先頭位置を移動させる。
② ② テキストの最初の比較文字が テキストの最初の比較文字が パターンの中にある場合、 パターンの中にある場合、 ❶ ❶ 二つの文字の移動距離を求め、 二つの文字の移動距離を求め、 ❷ ❷ 移動距離分だけ 移動距離分だけ 部分文字列の先頭位置を移動する。 部分文字列の先頭位置を移動する。 ③ ③ テキストの最初の比較文字が テキストの最初の比較文字が パターンの中に複数個ある場合、 パターンの中に複数個ある場合、 ❶ ❶ 最後尾の文字までの移動距離を使用する。 最後尾の文字までの移動距離を使用する。
移動距離計算例1 移動距離計算例1 ① ① 移動距離計算例1の図 移動距離計算例1の図 最初の比較文字 テキスト文字列 L D L E A S U B テキストの部分文字列の最初の比較文 字Lとパターンの中のLの距離2だけ 部分文字列の先頭を移動する L E A パターン文字列
② ② 移動距離計算例1の説明 移動距離計算例1の説明 ❶ ❶ テキストの部分文字列LDLと テキストの部分文字列LDLと パターン文字列LEAを後方から比較する。 パターン文字列LEAを後方から比較する。 ❷ ❷ 最初の比較文字Lは、 最初の比較文字Lは、 パターンの先頭のLと一致する。 パターンの先頭のLと一致する。 ❸ ❸ 計算要領の②に相当する。 計算要領の②に相当する。 ❹ ❹ パターン文字列の移動距離は2となる。 パターン文字列の移動距離は2となる。 ❺ ❺ 次の部分文字列はLEAとなる。一致する。 次の部分文字列はLEAとなる。一致する。
移動距離計算例2 移動距離計算例2 ① ① 移動距離計算例2の図 移動距離計算例2の図 最初の比較文字 テキスト文字列 L D L E A S U B テキストの部分文字列の後方からパ ターンの対応する要素を比較しすべ てが一致すれば探索成功 L E A パターン文字列
② ② 移動距離計算例2の説明 移動距離計算例2の説明 ❶ ❶ 次のテキストの部分文字列はEASである。 次のテキストの部分文字列はEASである。 ❷ ❷ テキストの最初の比較文字はSとなる。 テキストの最初の比較文字はSとなる。 ❸ ❸ Sはパターンの中に存在しないため、 Sはパターンの中に存在しないため、 ❹ ❹ 部分文字列の先頭位置は3要素分移動し、 部分文字列の先頭位置は3要素分移動し、 ❺ ❺ テキスト文字列の範囲外となる。 テキスト文字列の範囲外となる。 ❻ ❻ この場合の移動距離は3となる。 この場合の移動距離は3となる。
文字列探索の要領 文字列探索の要領 ① ① テキスト文字列の テキスト文字列の 最初の比較文字は先頭からM番目とする。 最初の比較文字は先頭からM番目とする。 ② ② パターン文字列の最初の比較文字は パターン文字列の最初の比較文字は 最後のM番目の文字からはじめる。 最後のM番目の文字からはじめる。 ③ ③ テキストの部分文字列の要素と テキストの部分文字列の要素と パターン文字列の要素とが一致する間、 パターン文字列の要素とが一致する間、 iおよびjのディクリメントを行い比較対象を変える。 iおよびjのディクリメントを行い比較対象を変える。
④ ④ T T( (i i)≠ )≠P P( (j j) )となると、 となると、 照合を中断して、照合ループから脱出する。 照合を中断して、照合ループから脱出する。 ⑤ ⑤ 照合ループを脱出後、 照合ループを脱出後、 テキストの文字列の位置を テキストの文字列の位置を 最初のMの位置に戻す。 最初のMの位置に戻す。 ⑥ ⑥ 照合開始時のテキストの 照合開始時のテキストの 文字列の要素T 文字列の要素T( (i i) )に対する移動距離を求める。 に対する移動距離を求める。 ⑦ ⑦ 次の照合の開始点をi+d 次の照合の開始点をi+d( (T T( (i i)) ))を求める。 を求める。
⑧ ⑧ 照合を繰り返し、j 照合を繰り返し、j≦ ≦0となると、 0となると、 ❶ ❶ 照合ループから脱出し、1 照合ループから脱出し、1→ ❷ ❷ 更にi+1 更にi+1→ →iを求めて、 iを求めて、 ❸ ❸ パターン文字列と一致する パターン文字列と一致する →found foundとして、 として、 テキスト上の位置を決め、 テキスト上の位置を決め、 ❹ ❹ 処理を終了する 処理を終了する ⑨ ⑨ ⑦で新しく求めた開始点を起点として、 ⑦で新しく求めた開始点を起点として、 ③~⑧の操作を繰り返す。 ③~⑧の操作を繰り返す。 ⑩ ⑩ ③~⑨の操作を繰り返して、 ③~⑨の操作を繰り返して、 i>Nとなると、照合不成立で処理を終了する。 i>Nとなると、照合不成立で処理を終了する。
パターン長5 パターン長5( (STING STING) )の場合の具体例 の場合の具体例
パターンSTINGの操作要領 パターンSTINGの操作要領 ① ① まず、最初に まず、最初に テキストの左端の5文字と テキストの左端の5文字と パターンの5文字を比較する。 パターンの5文字を比較する。 A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン
② ② パターンの右端の文字と パターンの右端の文字と それに対応するテキスト上の文字を比較し、 それに対応するテキスト上の文字を比較し、 一致すると、⑪の操作に移る。 一致すると、⑪の操作に移る。 A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン
③ ③ 一致しなければ、 一致しなければ、 テキストとパターンの比較は テキストとパターンの比較は パターンの右端の文字Gに対応する パターンの右端の文字Gに対応する テキスト上の文字Rと テキスト上の文字Rと パターンの各文字を比較する。 パターンの各文字を比較する。 ④ ④ テキスト上の文字Rが テキスト上の文字Rが パターンの中に現れない文字であることがわかると、 パターンの中に現れない文字であることがわかると、 パターン全体を5文字右に移動する。 パターン全体を5文字右に移動する。 A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン
⑤ ⑤ 次に、テキストの10番目の文字Sと 次に、テキストの10番目の文字Sと パターンの文字を比較する。 パターンの文字を比較する。 文字Sとパターンの右端の文字が不一致で 文字Sとパターンの右端の文字が不一致で パターンの先頭の文字Sが一致する。 パターンの先頭の文字Sが一致する。 A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン 4文字右に移動する前 4文字右に移動する前
⑥ ⑥ そこで、テキストの文字SとパターンのSが一致するまで そこで、テキストの文字SとパターンのSが一致するまで パターンの文字列全体を パターンの文字列全体を 右に4文字移動させる。 右に4文字移動させる。 A STRING SEARCHING EXAMPLE CONSISTING STING テキスト パターン 4文字右に移動させた結果 4文字右に移動させた結果
⑦ ⑦ 次に、テキスト上文字Cと 次に、テキスト上文字Cと パターン文字列を比較する。 パターン文字列を比較する。 ❶ ❶ テキスト上文字Cがパターンの中に テキスト上文字Cがパターンの中に 存在しないことが分かる。 存在しないことが分かる。 ❷ ❷ そこで、パターン文字列を右に5文字分移動させる。 そこで、パターン文字列を右に5文字分移動させる。 ❸ ❸ 以下、同じことを繰り返す。 以下、同じことを繰り返す。 A STRING SEARCHING EXAMPLE CONSISTING STING
⑧ ⑧ 同様の移動を3回行うと、 同様の移動を3回行うと、 CONSISTINGのTに到着する。 CONSISTINGのTに到着する。 A STRING SEARCHING EXAMPLE CONSISTING STING A STRING SEARCHING EXAMPLE CONSISTING STING A STRING SEARCHING EXAMPLE CONSISTING STING
⑨ ⑨ このテキスト上の文字Tが このテキスト上の文字Tが ❶ ❶ パターンの右端の文字と不一致であるが、 パターンの右端の文字と不一致であるが、 パターンの中に存在するため、 パターンの中に存在するため、 ❷ ❷ パターン文字列のTが パターン文字列のTが テキスト上の文字Tと一致するまで テキスト上の文字Tと一致するまで パターンを右に移動させる。 パターンを右に移動させる。 A STRING SEARCHING EXAMPLE CONSISTING STING
⑩ ⑩ テキスト上の文字Gが テキスト上の文字Gが パターンの右端の文字Gと一致する。 パターンの右端の文字Gと一致する。 ⑪ ⑪ テキスト上の文字と テキスト上の文字と パターン上の右端の文字が一致すると、 パターン上の右端の文字が一致すると、 ❶ ❶ それぞれの文字列の比較対象文字を それぞれの文字列の比較対象文字を ❷ ❷ 一つ前の文字に移動し、 一つ前の文字に移動し、 ❸ ❸ 二つの文字の比較を繰り返す。 二つの文字の比較を繰り返す。 ⑫ ⑫ テキストの文字列とパターンの文字列が テキストの文字列とパターンの文字列が 完全に一致すると、探索成功になる。 完全に一致すると、探索成功になる。
⑬ ⑬ テキスト文字列と テキスト文字列と パターン文字列の不一致が途中で発生すると、 パターン文字列の不一致が途中で発生すると、 ❶ ❶ パターン文字列の右端の文字に対応する パターン文字列の右端の文字に対応する テキスト上の文字と同じ文字が テキスト上の文字と同じ文字が パターン上にあれば、 パターン上にあれば、 ❷の処理を行う。 パターン上になければ、 パターン上になければ、 ❸の処理を行う。 ❷ ❷ 二つの文字が一致するまで、 二つの文字が一致するまで、 パターン文字列を右に移動させる。 パターン文字列を右に移動させる。 ❸ ❸ パターン文字列の長さ分だけ パターン文字列の長さ分だけ パターン文字列を右に移動させる。 パターン文字列を右に移動させる。 ❷の処理を行う。 ❸の処理を行う。
特殊なパターン文字列の照合1 特殊なパターン文字列の照合1 テキスト文字列 テキスト文字列 AABAAABAAAAB AABAAABAAAAB パターン文字列 パターン文字列 AAAA AAAA テキスト文字列がAABAAABAAAAB、パターン文字列が4 テキスト文字列がAABAAABAAAAB、パターン文字列が4 文字AAAAでできている場合の処理手順について考える。 文字AAAAでできている場合の処理手順について考える。
① ① テキスト文字列の テキスト文字列の 最初の4文字とパターン文字列を比較する。 最初の4文字とパターン文字列を比較する。 テキスト文字列 テキスト文字列 AABAAABAAAAB AABAAABAAAAB パターン文字列 パターン文字列 AAAA AAAA ② ② テキスト文字列の3文字目で不一致になり、 テキスト文字列の3文字目で不一致になり、 この間の比較は無意味である。 この間の比較は無意味である。 ③ ③ パターン文字列の先頭を パターン文字列の先頭を テキストの文字列の4番目まで移動できる。 テキストの文字列の4番目まで移動できる。 テキスト文字列 テキスト文字列 AABAAABAAAAB AABAAABAAAAB パターン文字列 パターン文字列 AAAA AAAA
④ ④ テキスト文字列の テキスト文字列の 7番目で不一致になり、 7番目で不一致になり、 それまでの比較は無意味となる。 それまでの比較は無意味となる。 テキスト文字列 テキスト文字列 AABAAABAAAAB AABAAABAAAAB パターン文字列 パターン文字列 AAAA AAAA ⑤ ⑤ パターン文字列が同じ文字列の場合、 パターン文字列が同じ文字列の場合、 途中で不一致になると、 途中で不一致になると、 テキスト文字列の不一致になった テキスト文字列の不一致になった 次の文字までパターン文字列の先頭を 次の文字までパターン文字列の先頭を 移動させることができる。 移動させることができる。
特殊なパターン文字列の照合2 特殊なパターン文字列の照合2 テキスト文字列 テキスト文字列 AABAAABAAAAB AABAAABAAAAB パターン文字列 パターン文字列 AABB AABB パターン文字列がAABBの場合について考える。 パターン文字列がAABBの場合について考える。
① ① パターン文字列の移動は次のようになる。 パターン文字列の移動は次のようになる。 テキスト文字列 テキスト文字列 AABAAABAABB AABAAABAABB パターン文字列 パターン文字列 AABB AABB AABB AABB AABB AABB AABB AABB ② ② 不一致になったパターンの文字が、 不一致になったパターンの文字が、 パターン文字列の先頭文字と異なる場合、 パターン文字列の先頭文字と異なる場合、 テキスト文字列の不一致になった位置まで、 テキスト文字列の不一致になった位置まで、 パターン文字列の先頭を移動させることができる。 パターン文字列の先頭を移動させることができる。