(二)Boyer Moore字串查詢演算法

2021-07-29 14:14:55 字數 1083 閱讀 2892

這是一種類似於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教授發明了這種...