1.23k likes | 1.36k Views
BM 法による文字列検索. 力任せ法での検索. テキスト. パターン. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. パターンを一つずらす. 力任せ法での検索. ポインタを後ろに戻す. パターンを一つずらす. 力任せ法での検索. 力任せ法での検索. パターンを 一気に 3 つ ずらしてもよいのでは?. KMP 法の考え方. ここから再び比較をはじめればよい!. KMP 法の実用性. 一気にスキップできる場合 パターンの一部と同じ部分文字列がテキスト上に出現した場合
E N D
力任せ法での検索 テキスト パターン
力任せ法での検索 パターンを一つずらす
力任せ法での検索 ポインタを後ろに戻す パターンを一つずらす
力任せ法での検索 パターンを一気に3つ ずらしてもよいのでは?
KMP法の考え方 ここから再び比較をはじめればよい!
KMP法の実用性 • 一気にスキップできる場合 • パターンの一部と同じ部分文字列がテキスト上に出現した場合 • 実際のテキスト検索の場面ではまれ… • 確率的には、パターン中に一文字も現れない文字が出現する可能性が高い • KMP法では、一文字しかずらせない… • このようなときに一気にずらすべき!
BM法の考え方 • パターンに出現しない文字を一気にスキップ! ⇒ テキストに現れる文字によって、ずらす量を 決める! • KMP法で一文字しかずらせないのは、先頭からチェックしているから ⇒ パターンの末尾からチェックすることで、比較 回数を削減!
BM法のずらし表 • パターンに出現しない文字については、 「パターンの長さ」だけ一気にずらす • パターンに出現する文字については、 「一番右に出現する文字に合わせて」ずらす
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ?
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? 次はここから再開! テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを5つ(=パターン長)右にずらす! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを5つ(=パターン長)右にずらす! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを4つ右にずらせばよい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを4つ右にずらせばよい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 これがずらし表の値 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを3つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを3つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを2つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここからで大丈夫? next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 ここでマッチする可能性がある! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから再開! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタは1つだけ右にずらす! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = 1 next[‘u’] = ? それ以外= 5 テキスト:
BM法のずらし表 • パターン「kyoku」に対するずらし表 値が上書きされるため、パターンの最右に合わせてずらすことが可能! next[‘k’] = 1 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = 1 next[‘u’] = ? それ以外= 5 テキスト: