這是一種類似於kmp但是更高效一點、也更簡單一些的字串查詢演算法,大體的思路是從右往左掃瞄,例如在txt = abcbcdcde中查詢模式串pat = bcd,
abcbcdcde
bcd
從右往左,第乙個比較的字元是 c 和 d ,不匹配,c 在 bcd 裡出現的所有位置中最靠右是 1,那麼 bcd 右移 1 位,比較 b 和 d ,
abcbcdcde
bcd
不匹配,b 在 bcd裡出現的所有位置中最靠右是 0,那麼bcd右移 2 位,
abcbcdcde
bcd
匹配成功,當然例子有些簡單,看完以下的具體規則後,就會消除你所有的顧慮 = =!
具體的規則如下:( i 是 txt 中的游標,j 是 pat 中的游標)
1. 如果失配字元不在 pat 中,那麼 pat 右移 j+1 個位置,也就是 i += j+1 繼續比較。這條應該是淺顯易懂,不懂得在紙上畫一下就知道了。
2. 如果失配字元在 pat 中,那麼 pat 右移,使得適配字元與 pat 中該字元出現的所有位置中最右的那個對齊,即右移 j - x 即 i += j - x ,x 即是最右位置。
3. 如果以上兩條不能使 i 增大,i += 1。
以上第 2 條的 x 可以通過預處理來提前計算好,計算的**如下:
int right[256];
memset(right, -1, sizeof(int) * 256);// 初始化為-1
for (int k = 0; k < strlen(pat); ++k)
查詢**如下:
int skip = 0;
for (int i = 0; i < strlen(txt) - strlen(pat); i += skip)
break;}}
if (skip == 0)
}
ps:可以根據kmp的思路,優化一下,即已經匹配過的,是不是有相同的串。
參考:《演算法》第四版
字串匹配的Boyer Moore演算法
參考鏈結 但是,它並不是效率最高的演算法,實際採用並不多。各種文字編輯器的 查詢 功能 ctrl f 大多採用boyer moore演算法。boyer moore演算法不僅效率高,而且構思巧妙,容易理解。1977年,德克薩斯大學的robert s.boyer教授和j strother moore教授...
字串匹配的Boyer Moore演算法
各種文字編輯器的 查詢 功能 ctrl f 大多採用 boyer moore 演算法。boyer moore 演算法不僅效率高,而且構思巧妙,容易理解。1977 年,德克薩斯大學的 robert s.boyer 教授和 j strother moore 教授發明了這種演算法。下面,我根據 moore...
字串匹配的Boyer Moore演算法
但是,它並不是效率最高的演算法,實際採用並不多。各種文字編輯器的 查詢 功能 ctrl f 大多採用boyer moore演算法。boyer moore演算法不僅效率高,而且構思巧妙,容易理解。1977年,德克薩斯大學的robert s.boyer教授和j strother moore教授發明了這種...