模式匹配之Boyer Moore演算法

2021-05-23 17:14:56 字數 2196 閱讀 6769

bm 演算法是乙個較優的模式匹配演算法。一般,如果不考慮模式串的長度,乙個具有時間複雜度o(n)的演算法應該是最優的了,但是事實不是如此。bm演算法可以實現更高效率的模式匹配。分析和實驗說明,bm匹配演算法對於那些字符集比較大,而模式串中出現的字元比較少的時候,工作效率最快。而且,考慮kmp匹配方式的優化,可以結合kmp匹配和bm匹配,進一步提高效率。

演算法的關鍵和 kmp 類似,也是構造乙個輔助陣列,不過,不同於kmp演算法的是,bm演算法的輔助陣列大小只和匹配串的字符集大小相關(一般情況下也就是ascii字符集,256個字元),其內容和模式串相關,輔助陣列的內容即是模式串的索引:position[patten[i]]=i;  也是相當簡單的輔助陣列構造。

例如:

文字串:my-name-is-maik-i-love-kuraki-mai

匹配串:kuraki

(1) my-name-is-maik-i-love-kuraki-mai

kuraki

匹配失敗對應的字元為』m』,在匹配串中沒有出現,直接跳過即可。

(2) my-name-is-maik-i-love-kuraki-mai

kuraki

匹配失敗對應的字元為』m』,在匹配串中沒有出現,直接跳過即可。

(3) my-name-is-maik-i-love-kuraki-mai

kuraki

匹配失敗對應的字元為』-』,在匹配串中沒有出現,直接跳過即可。

(4) my-name-is-maik-i-love-kuraki-mai

kuraki

匹配失敗對應的字元為』k』,在匹配串中最左端出現,步長為5

(5) my-name-is-maik-i-love-kuraki-mai

kuraki

匹配成功。

乙個簡單的例子:

#include

#include

#include

/*  輔助陣列,取決於字符集和,預設的採用 ascii字符集,256個元素*/

#define len 256

int bmmatcher(char *s,  char *p, int index, int *position)

/*引數說明:

char *s:  匹配串

int nlength  匹配串長度

char *p:  模式串

int index: 模式串匹配的起始位置,是匹配串的索引

int position 輔助陣列,

*/if(i<0)

return 0;      /*匹配成功*/

else  if(position[byte (s[j])]>0)  //0xff=-1

nextindex = index + i - position[byte (s[j])];

else

nextindex = index + 1;

if(nextindex > len-strlen(p))

return -1;  /*匹配失敗,無法進行下一次匹配*/

else

return nextindex;    /*匹配失敗,需要下一次匹配*/

}  /*測試, 匹配串 和 模式串都使用小寫字元*/

int main()

;    /*輔助陣列*/

char *src="it is just a test, what would you do?";  /*匹配串*/

char *patten="what would";   /*模式串*/

int i, nextindex, index=-2, pos=0;

for(i=0; i/*構造輔助陣列,關鍵的一步,但是很簡單*/

position[patten[i]]=i;

index = bmmatcher(src, patten, 0, position);

while(!(index==-1 || index==0))  /*迴圈匹配,直到匹配成功,或者匹配失敗結束*/

if(index == -1)

printf("can not find it/n");

if(index == 0)

printf("find it, the index is: %d./n", nextindex);

system("pause");

return 0;

}

模式匹配之Boyer Moore演算法

bm 演算法是乙個較優的模式匹配演算法。一般,如果不考慮模式串的長度,乙個具有時間複雜度o n 的演算法應該是最優的了,但是事實不是如此。bm演算法可以實現更高效率的模式匹配。分析和實驗說明,bm匹配演算法對於那些字符集比較大,而模式串中出現的字元比較少的時候,工作效率最快。而且,考慮kmp匹配方式...

模式匹配 更快的Boyer Moore演算法

前一篇中介紹了字串kmp演算法,其利用失配時已匹配的字元資訊,以確定下一次匹配時模式串的起始位置。本文所要介紹的boyer moore演算法是一種比kmp更快的字串匹配演算法,它到底是怎麼快的呢?且聽下面分解。不同於kmp在匹配過程中從左至右與主串字元做比較,boyer moore演算法是從模式串的...

字串匹配之boyer moore演算法

前面介紹了kmp演算法,但是,它並不是效率最高的演算法,實際採用並不多。各種文字編輯器的 查詢 功能 ctrl f 大多採用boyer moore演算法。boyer moore演算法不僅效率高,而且構思巧妙,容易理解。1977年,德克薩斯大學的robert s.boyer教授和j strother ...