模式匹配之Boyer Moore演算法

2021-04-12 15:30:12 字數 1515 閱讀 8331

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

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

乙個簡單的例子:

#include

#include

#include

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

#define len 256

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

/*引數說明:

char *s:  匹配串

char *p:  模式串

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

int position 輔助陣列,

*/if(i<0) return 0;      /*匹配成功*/

else  if(position[s[j]]>0)nextindex = index + i - position[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; iposition[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 ...