1 / 123

BM 法による文字列検索

BM 法による文字列検索. 力任せ法での検索. テキスト. パターン. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. 力任せ法での検索. パターンを一つずらす. 力任せ法での検索. ポインタを後ろに戻す. パターンを一つずらす. 力任せ法での検索. 力任せ法での検索. パターンを 一気に 3 つ ずらしてもよいのでは?. KMP 法の考え方. ここから再び比較をはじめればよい!. KMP 法の実用性. 一気にスキップできる場合 パターンの一部と同じ部分文字列がテキスト上に出現した場合

chi
Download Presentation

BM 法による文字列検索

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. BM法による文字列検索

  2. 力任せ法での検索 テキスト パターン

  3. 力任せ法での検索

  4. 力任せ法での検索

  5. 力任せ法での検索

  6. 力任せ法での検索

  7. 力任せ法での検索 パターンを一つずらす

  8. 力任せ法での検索 ポインタを後ろに戻す パターンを一つずらす

  9. 力任せ法での検索

  10. 力任せ法での検索 パターンを一気に3つ ずらしてもよいのでは?

  11. KMP法の考え方 ここから再び比較をはじめればよい!

  12. KMP法の実用性 • 一気にスキップできる場合 • パターンの一部と同じ部分文字列がテキスト上に出現した場合 • 実際のテキスト検索の場面ではまれ… • 確率的には、パターン中に一文字も現れない文字が出現する可能性が高い • KMP法では、一文字しかずらせない… • このようなときに一気にずらすべき!

  13. BM法の考え方 • パターンに出現しない文字を一気にスキップ! ⇒ テキストに現れる文字によって、ずらす量を    決める! • KMP法で一文字しかずらせないのは、先頭からチェックしているから ⇒ パターンの末尾からチェックすることで、比較 回数を削減!

  14. BM法のずらし表 • パターンに出現しない文字については、 「パターンの長さ」だけ一気にずらす • パターンに出現する文字については、 「一番右に出現する文字に合わせて」ずらす

  15. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ?

  16. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:

  17. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:

  18. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:

  19. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? 次はここから再開! テキスト:

  20. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを5つ(=パターン長)右にずらす! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= ? テキスト:

  21. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを5つ(=パターン長)右にずらす! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  22. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  23. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  24. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  25. BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  26. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを4つ右にずらせばよい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  27. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを4つ右にずらせばよい! next[‘k’] = ? next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  28. BM法のずらし表 • パターン「kyoku」に対するずらし表 これがずらし表の値 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  29. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  30. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  31. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  32. BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  33. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを3つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  34. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを3つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = ? next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  35. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  36. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  37. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  38. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  39. BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから開始したい! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  40. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタを2つ右にずらせばよい! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = ? next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  41. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  42. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  43. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここで不一致 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  44. BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここからで大丈夫? next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  45. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  46. BM法のずらし表 • パターン「kyoku」に対するずらし表 ここでマッチする可能性がある! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  47. BM法のずらし表 • パターン「kyoku」に対するずらし表 次はここから再開! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  48. BM法のずらし表 • パターン「kyoku」に対するずらし表 テキストポインタは1つだけ右にずらす! next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = ? next[‘u’] = ? それ以外= 5 テキスト:

  49. BM法のずらし表 • パターン「kyoku」に対するずらし表 next[‘k’] = 4 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = 1 next[‘u’] = ? それ以外= 5 テキスト:

  50. BM法のずらし表 • パターン「kyoku」に対するずらし表 値が上書きされるため、パターンの最右に合わせてずらすことが可能! next[‘k’] = 1 next[‘y’] = 3 next[‘o’] = 2 next[‘k’] = 1 next[‘u’] = ? それ以外= 5 テキスト:

More Related