【Ruby】【アルゴリズム】BM法による文字列検索
今週末は目黒でRubyの集まりがあるみたいだ。
でもまだまだ。。この程度じゃだめだ。
BM法による文字列検索 とは
ボイヤー-ムーア文字列検索アルゴリズム(Boyer-Moore String Search Algorithm)は、効率的な文字列検索アルゴリズムの一種[1]。Robert S. Boyer と J Strother Moore が 1977年に開発した[2]。ボイヤー-ムーア法とも呼ばれる。
http://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%A4%E3%83%A4%E3%83%BC-%E3%83%A0%E3%83%BC%E3%82%A2%E6%96%87%E5%AD%97%E5%88%97%E6%A4%9C%E7%B4%A2%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
このアルゴリズムでは検索文字列(パターン)の前処理を行い、検索対象テキストの前処理は行わない。したがって、テキストについて何度も検索を行わない場合に適している
コード
def bm_search(text, pattern) cachTable = Array.new(256, pattern.length) _text = text.split("") _pattern = pattern.split("") _pattern.each_with_index do |ch, idx| #text_index をいくつずらして問題ないか を格納 cachTable[ch.ord] = _pattern.length - idx - 1 end text_index = _pattern.length - 1 while text_index < _text.length pattern_index = _pattern.length - 1 while _text[text_index] == _pattern[pattern_index] return text_index if pattern_index == 0 text_index -= 1 pattern_index -= 1 end enable_step = cachTable[_text[text_index].ord] # text_indexをいくつ右にずらせるか > pattern_indexがいくつ左に進んだか if enable_step > _pattern.length - pattern_index text_index += enable_step else #pattern_indexが左に進んだ数のほうが大きい場合 #text_indexを一つずらす text_index += _pattern.length - pattern_index end end -1 end p bm_search("antennakana", "kana") p bm_search("banana", "nan")
実行結果
7 2