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 ...